You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在栅格栈而非矩阵/数据框上实现quantForestError()预测?

问题:如何用quantForestError()对栅格栈进行预测?

用户尝试使用forestError包的quantForestError()函数对栅格栈进行预测时遇到报错,提示X.test必须是矩阵或数据框。用户已知可通过ranger自带预测获取置信区间,但存在已知问题,希望实现将栅格转换为矩阵完成预测后再转回栅格的操作。

原报错场景代码:

library(ranger)
library(tidyverse)
library(raster)
library(forestError)
data(iris)
glimpse(iris)

mod<-ranger(Sepal.Length~. -Species,iris,keep.inbag =TRUE,seed=4)#random forest model

# 单样本测试正常
quantForestError(mod,iris[,2:4],iris[10,2:4],iris[,1],what=c("interval"))$pred
#4.823236

# 生成栅格栈
sw <- raster(ncol=10, nrow=10)
set.seed(4)
values(sw) <- runif(ncell(sw),min=iris$Sepal.Width,max=iris$Sepal.Width)
pl <- raster(ncol=10, nrow=10)
set.seed(4)
values(pl) <- runif(ncell(pl),min=iris$Petal.Length,max=iris$Petal.Length)
pw <- raster(ncol=10, nrow=10)
set.seed(4)
values(pw) <- runif(ncell(pw),min=iris$Petal.Width,max=iris$Petal.Width)
all<-stack(sw,pl,pw)
names(all)<-c("Sepal.Width","Petal.Length","Petal.Width")
plot(all)

# 直接用栅格栈预测报错
quantForestError(mod,iris[,2:4],all,iris[,1],what=c("interval"))$pred
#Error in checkXtrainXtest(X.train, X.test) : 
#'X.test' must be a matrix or data.frame of dimension 2

解决方案

核心思路是将栅格栈转换为带空间坐标的数据框,运行quantForestError()完成预测后,再将结果映射回栅格结构。

完整代码实现

# 1. 将栅格栈转换为带坐标的数据框
raster_df <- as.data.frame(all, xy = TRUE)
# 提取用于预测的特征列(移除x、y坐标列)
test_data <- raster_df[, c("Sepal.Width", "Petal.Length", "Petal.Width")]

# 2. 运行quantForestError获取预测值与区间
error_results <- quantForestError(
  model = mod,
  X.train = iris[,2:4],
  X.test = test_data,
  y.train = iris[,1],
  what = c("interval")
)

# 3. 将预测结果与坐标绑定,转回栅格
# 合并坐标与所有预测结果
pred_df <- cbind(
  raster_df[, c("x", "y")], 
  prediction = error_results$pred,
  lower_95CI = error_results$lower_0.05,
  upper_95CI = error_results$upper_0.05
)

# 转换为栅格对象,保持原坐标系
pred_raster <- rasterFromXYZ(pred_df[, c("x", "y", "prediction")], crs = crs(all))
lower_raster <- rasterFromXYZ(pred_df[, c("x", "y", "lower_95CI")], crs = crs(all))
upper_raster <- rasterFromXYZ(pred_df[, c("x", "y", "upper_95CI")], crs = crs(all))

# 合并为栅格栈,方便统一查看与保存
result_stack <- stack(pred_raster, lower_raster, upper_raster)

# 查看最终结果
plot(result_stack)

关键步骤说明

  • 栅格转数据框:使用as.data.frame(all, xy = TRUE)保留每个栅格单元的x/y坐标,确保后续能精准映射回原空间位置。
  • 运行预测:提取特征列作为X.test传入函数,满足quantForestError()对输入格式的要求。
  • 结果转回栅格:通过rasterFromXYZ()将带坐标的预测结果转换为栅格,保持与原栅格栈一致的坐标系和空间范围。

内容的提问来源于stack exchange,提问作者Kevin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:17:27