我在R中创建了一个随机森林模型,并希望使用terra中的predict函数将其应用于SpatRaster对象.我可以将栅格转换为数据帧,而不是直接在SpatRaster上预测,但是我的实际数据集太大了,无法做到这一点.

一个可重复的例子:

library(terra)
library(ranger)

r <- rast(ncols=95, nrows=90, nlyrs=5, crs="+proj=longlat",
          xmin=5.74167, xmax=6.5333, ymin=49.44167, ymax=50.19167,
          names=c("band1","band2","band3","band4","band5"))

# Fill the raster with random values
set.seed(123)
r$band1 <- runif(n = ncell(r))
r$band2 <- init(r, "cell")
r$band3 <- sample(1:10, ncell(r), replace = T)
r$band4 <- sample(1:10, ncell(r), replace = T)
r$band5 <- sample(1:10, ncell(r), replace = T)

# Extract some random raster values as training data
extr_values <- spatSample(r, 10)
extr_values$response <- as.factor(sample(c(1,2), nrow(extr_values), replace = T))

# Model
rf_model <- ranger(response ~., data = extr_values, num.trees = 50)

# Prediction
prediction <- predict(r, rf_model,  na.rm = TRUE)$predictions

我try 了不同类型的模型(例如随机森林包)、不同的栅格和坐标集.更奇怪的是,我运行了执行类似任务和过go 运行的旧脚本,它们都会产生相同的错误.可能与最近一次Terra的更新有关? 任何帮助都将不胜感激.

推荐答案

ranger::predict的输出是一个列表.这并不是人们所期望的.

p <- predict(rf_model, r[1:2])
str(p)
#List of 5
# $ predictions              : Factor w/ 1 level "1": 1 1
# $ num.trees                : num 500
# $ num.independent.variables: num 5
# $ num.samples              : int 2
# $ treetype                 : chr "Classification"
# - attr(*, "class")= chr "ranger.prediction"

你对这些"预测"很感兴趣.要将这些值放入输出栅格中,您需要提供一个自定义预测函数.

pfun <- \(...) {
    predict(...)$predictions
}

p <- predict(r, rf_model,  fun=pfun, na.rm = TRUE)

R相关问答推荐

给定R中另一行中的值,如何插补缺失值

使用预定值列表将模拟数量(n)替换为rnorm()

跨列应用多个摘要函数:summerise_all:列表对象无法强制为double类型'

如何使用geom_sf在边界显示两种 colored颜色 ?

工作流程_set带有Dplyrr风格的 Select 器,用于 Select 结果和预测因子R

在位置周围设定一个半径并识别该半径内的其他位置

如何使用`ggplot2::geom_segment()`或`ggspatial::geom_spatial_segment()`来处理不在格林威治中心的sf对象?

使用strsplit()将向量操作为数据框

在数组索引上复制矩阵时出错

仅在Facet_WRAP()中的相应方面包含geom_abline()

Data.table';S GForce-将多个函数应用于多列(带可选参数)

Geom_Hline将不会出现,而它以前出现了

将多个变量组合成宽格式

为什么这个表格格罗布不打印?

在具有多个响应变量的比例堆叠条形图上方添加总计

以不同于绘图中元素的方式对GG图图例进行排序

从矩阵创建系数图

将R中对象的CSV数组转换为JSON数组

对计算变量所有唯一值的变量进行变异

使用卡环从R中的列中删除单位(&C)