如何在栅格栈而非矩阵/数据框上实现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
相关产品推荐
相关产品推荐

