r - 使用 terra::predict 和 caret::train ranger 模型生成物种分布的预测栅格

标签 r r-caret terra

我正在进行一个物种分布项目,涉及存在点和伪不存在/背景点。我已经设置了一个数据框,并使用 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/

相关文章:

R circlize : Error in circos. 初始化

r - 使用 xml2 将子节点添加到节点

r - 如何在 r 中纵向连接/追加数据框的列

r - 使用插入符号 : How to specify a timeout? 的机器学习

R dummyvars - 单列的虚拟变量

r - 如何使用 terra 的全局函数计算 NA?

r - 如何在 R 中使用 terra 包编写栅格 bylayer?

在版本控制下重命名 RStudio 项目

r - 在磁盘上的 R 中设置栅格元数据(波段名称)

r-caret - 插入符号包 : Stratified Cross Validation in Train Function