使用循环对波士顿数据集执行多项式回归报错:未定义选中列
问题分析与解决办法
报错原因
- 存储方式错误:你用
cv <- rep(NA,4)创建的是普通向量,根本存不下train()返回的模型对象;而且循环里直接用i(取值5、4、3、2)作为索引,cv[5]超出了向量初始长度,触发索引越界问题。 - 参数拼写错误:
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
相关产品推荐
相关产品推荐

