如何在for循环中使用predict.lm?求解预测报错问题
问题解决方法
错误原因分析
- 存储对象错误:第一个循环中你存储的是模型摘要(summary输出),但
predict.lm()需要的是lm()返回的原始模型对象,这就是警告提示<fake-lm-object>的核心原因。 - 数据格式错误:提取测试数据列时,单列提取会被自动简化为向量,而
predict()要求newdata必须是数据框、列表或环境类型。
修正后的代码
第一步:重新拟合并存储模型对象
set.seed(98274) # 创建示例数据 y <- rnorm(1000) x1 <- rnorm(1000) + 0.2 * y x2 <- rnorm(1000) + 0.2 * x1 + 0.1 * y x3 <- rnorm(1000) - 0.1 * x1 + 0.3 * x2 - 0.3 * y data <- data.frame(y, x1, x2, x3) head(data) # 查看数据前几行 mod_list <- list() # 创建空列表存储模型对象(而非摘要) for(i in 2:ncol(data)) { # 循环拟合模型 predictors_i <- colnames(data)[2:i] # 生成当前模型的预测变量名向量 # 直接存储lm模型对象,不要套summary() mod_list[[i - 1]] <- lm(y ~ ., data[ , c("y", predictors_i)]) }
第二步:用模型对测试数据预测
## 生成测试数据 set.seed(44) # 设置随机种子 y <- rnorm(1000) x1 <- rnorm(1000) + 0.19 * y x2 <- rnorm(1000) + 0.2 * x1 + 0.11 * y x3 <- rnorm(1000) - 0.12 * x1 + 0.28 * x2 - 0.33 * y test <- data.frame(y, x1, x2, x3) predict_models <- matrix(nrow = nrow(test), ncol = 3) for(i in 2:ncol(data)) { # 循环预测 predictors_i <- colnames(data)[2:i] # 匹配对应模型的预测变量 # 使用drop=FALSE确保提取的是数据框而非向量,满足predict的格式要求 predict_models[,i-1] <- predict.lm(mod_list[[i-1]], test[, predictors_i, drop=FALSE]) } predict_models
关键修正点说明
- 存储模型而非摘要:将
mod_summaries[[i - 1]] <- summary(lm(...))改为直接存储lm()的返回值,predict.lm()只能基于完整的模型对象工作。 - 保持数据框结构:提取测试数据列时添加
drop=FALSE,避免单列被简化为向量,确保newdata符合要求的格式。
内容的提问来源于stack exchange,提问作者ebrahimi
相关产品推荐
相关产品推荐

