使用R语言ranger包做随机森林回归时predict函数报缺失数据错误
解决ranger包随机森林回归预测时的缺失数据错误
问题原因
ranger包的预测函数不支持自动处理含NA的输入数据,你训练模型时仅通过as.data.frame(s, na.rm=TRUE)排除了训练集的NA,但预测用的栅格s中仍存在NA值,直接调用predict(s, m)就会触发Missing data in columns错误。额外的类型转换警告是因为栅格数据默认类型可能为整数,转数值时引入了NA(这不是核心问题)。
解决方案
需要手动筛选出预测数据中无NA的像元,仅对这些像元执行预测,再将结果填充回栅格。以下是修正后的完整代码:
library(terra) library(ranger) # 构建示例数据 s <- rast(system.file("ex/logo.tif", package="terra"))[[1:2]] names(s) = c("ntl", "covar") s[10:20, ] <- NA # 1. 准备训练数据并训练模型 train_data <- as.data.frame(s, na.rm=TRUE) # 转换为数值型避免类型警告 train_data <- lapply(train_data, as.numeric) %>% as.data.frame() m <- ranger(ntl~., data=train_data, mtry=1) # 2. 处理预测数据中的NA并执行预测 # 创建空结果栅格 p <- rast(s, nlyrs=1) names(p) <- "predicted_ntl" # 筛选出自变量无NA的像元索引 non_na_idx <- which(!is.na(s$covar)) # 提取这些像元的自变量数据 pred_input <- extract(s, non_na_idx) # 执行预测 pred_results <- predict(m, data=pred_input) # 将预测值填充到结果栅格 p[non_na_idx] <- pred_results$predictions
补充说明
- 如果你的自变量不止一个,筛选无NA像元时要确保所有自变量都非NA,可以用
complete.cases():# 提取所有变量的像元数据,筛选完全无NA的行 all_data <- as.data.frame(s) non_na_rows <- complete.cases(all_data) non_na_idx <- which(non_na_rows) - ranger本身没有类似randomForest的
na.action参数,所有NA处理都需要手动完成,不管是训练还是预测阶段。
内容的提问来源于stack exchange,提问作者Nikos
相关产品推荐
相关产品推荐

