我正在进行一个物种分布项目,涉及存在点和伪不存在/背景点。我已经设置了一个数据框,并使用 caret::train 训练了 10 k 倍的模型,并且使用 method="ranger" 让生活变得更轻松。所以,现在我有了一个平均的游侠模型。
现在,我遇到了障碍。我有这个堆栈栅格文件,其中包含生物气候资料(WorldClim)、地形数据(海拔、坡度等),以及几个分类栅格(土地利用和地质类型)。计划是使用 terra::predict 来获取显示存在概率的栅格。
但问题是:当我运行预测函数时,它给我带来了麻烦。它要么根本不运行,要么吐出一条关于“列中缺少数据”的错误消息,我已检查过,并且我的堆栈栅格都很好;当我使用更简单的 *randomForest *没有 k 折叠时,它们工作得很好。
我尝试过寻找其他预测方法并尝试如何提供数据,但到目前为止还没有运气。有人有任何想法或建议来帮助我解决这个问题吗?
目标: 使用伪不存在和随机森林生成物种分布的概率栅格。然后使用该模型来预测仅变化的气候栅格的当前和 future 分布。
示例数据
library(terra)
library(caret)
library(tuneRanger)
library(ranger)
logo <- rast(system.file("ex/logo.tif", package="terra"))
logo[75:77, ] <- NA
p <- matrix(c(48, 48, 48, 53, 50, 46, 54, 70, 84, 85, 74, 84, 95, 85,
66, 42, 26, 4, 19, 17, 7, 14, 26, 29, 39, 45, 51, 56, 46, 38, 31,
22, 34, 60, 70, 73, 63, 46, 43, 28), ncol=2)
a <- matrix(c(22, 33, 64, 85, 92, 94, 59, 27, 30, 64, 60, 33, 31, 9,
99, 67, 15, 5, 4, 30, 8, 37, 42, 27, 19, 69, 60, 73, 3, 5, 21,
37, 52, 70, 74, 9, 13, 4, 17, 47), ncol=2)
xy <- rbind(cbind(1, p), cbind(0, a))
e <- extract(logo, xy[,2:3])
v <- data.frame(cbind(pa=xy[,1], e))
制作模型
v_NA_kNN <- caret::preProcess(v, method="bagImpute")
v_rf <- predict(v_NA_kNN,v)
v_rf$pa <- as.factor(v_rf$pa)
levels(v_rf$pa) <- c("Pres","Abs")
rf.task <- makeClassifTask(data = v_rf, target = "pa")
res <- tuneRanger(rf.task, measure = list(multiclass.brier), num.trees = 1e+02,
num.threads = 4, iters = 20, save.file.path = NULL)
fitControl <- caret::trainControl(
method = "repeatedcv",
number = 5,
repeats = 5,
allowParallel = T,
classProbs=T,
returnData = T,
savePredictions = "final"
)
ranger_model <- caret::train(
v_rf[,-1],
as.factor(v_rf$pa), #This way factor is not separated by levels
method = "ranger",
trControl = fitControl,
tuneGrid = expand.grid(mtry = res$recommended.pars[,1],
min.node.size = res$recommended.pars[,2],
splitrule = "gini"),
num.trees = 1e+02,
num.threads = 4,
importance = 'impurity'
)
预测
predfun <- function(...) predict(...)$predictions
x <- terra::predict(logo, ranger_model, fun=predfun)
# Error in predict(...)$predictions :
# $ operator is invalid for atomic vectors
# Called from: fun(model, d, ...)
最佳答案
如果您使用默认参数运行 terra::predict
,您会得到:
x <- terra::predict(logo, ranger_model)
#Error: Missing data in columns: red, green, blue.
您可以使用na.rm=TRUE
来修复该问题
x <- terra::predict(logo, ranger_model, na.rm=TRUE)
您不需要提供专门的预测函数,因为插入符预测函数返回一个简单的向量
predict(ranger_model, logo[1:4])
#[1] Pres Pres Pres Pres
#Levels: Pres Abs
相反,如果您使用“ranger”中的预测函数,您将获得一个列表,在这种情况下您可以使用
predfun <- function(...) predict(...)$predictions
x <- terra::predict(logo, ranger_model, fun=predfun, na.rm=TRUE)
关于r - 使用 terra::predict 和 caret::train ranger 模型生成物种分布的预测栅格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77378863/