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

使用循环对波士顿数据集执行多项式回归报错:未定义选中列

问题分析与解决办法

报错原因

  1. 存储方式错误:你用cv <- rep(NA,4)创建的是普通向量,根本存不下train()返回的模型对象;而且循环里直接用i(取值5、4、3、2)作为索引,cv[5]超出了向量初始长度,触发索引越界问题。
  2. 参数拼写错误:train()函数中指定交叉验证控制的参数是trControl,你写成了trncontrol(少了字母o),函数无法识别该参数,进而触发数据列选择错误。

修正后的代码

library(caret)
library(MASS)  # Boston数据集在该包中,需提前加载

train_control <- trainControl(method = "cv", number=10)
# set.seed(5)  # 建议开启随机种子,保证结果可复现
cv <- vector("list", 4)  # 用列表存储模型,替代无法存复杂对象的向量
n <- c(5,4,3,2)

# 用序列索引循环,避免i作为索引导致的越界问题
for (idx in 1:length(n)) {
  current_degree <- n[idx]
  cv[[idx]] <- train(nox ~ poly(dis, degree = current_degree), 
                     data = Boston, 
                     trControl = train_control, 
                     method = "lm")
}

# 查看各阶模型的交叉验证结果
for (idx in 1:length(cv)) {
  cat("---", n[idx], "阶多项式回归交叉验证结果---\n")
  print(cv[[idx]]$results)
}

关键修正点说明

  • 改用列表存储模型:列表能够容纳train()返回的复杂模型对象,通过vector("list",4)创建对应长度的列表,用idx作为索引避免越界。
  • 修正参数名称:将trncontrol改为trControl,这是caret包train()函数的标准参数名,必须匹配才能正确调用交叉验证控制逻辑。
  • 加载MASS包:Boston数据集属于MASS包,未加载会导致找不到数据集的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:05:20