R调用rlm函数拟合模型报错undefined columns selected如何解决?
你遇到的报错为:
"Error in
[.data.frame(mf, xvars) : undefined columns selected"
报错原因与解决方案
该报错核心是rlm函数解析公式提取预测变量时,无法匹配到数据框中对应的列,可按以下步骤排查解决:
1. 确认依赖包正确加载
createDataPartition属于caret包,rlm属于MASS包,运行代码前需先加载两个包:
library(caret) library(MASS)
如果未提前加载,可能出现函数调用冲突或参数解析错误。
2. 修复非标准列名问题(最常见诱因)
你生成的波长列名格式为852nm、854nm等,属于数字开头的非标准R变量名,公式Fat ~ .展开时会无法识别这类变量名,触发列选择错误。
修复方案一:修改列名为标准格式
在命名absorp列时增加前缀,避免数字开头:
# 把原来的列名赋值语句替换为这行 colnames(absorp) <- c(paste0('nm_', seq(852,1050,2)))
后续所有代码不需要其他修改,直接运行即可。
修复方案二:手动构造带反引号的公式
如果需要保留原列名,可手动构造公式,给所有波长列名包裹反引号:
# 构造公式前先确认train.absorp的列名和你定义的一致 x_vars <- paste0("`", colnames(train.absorp), "`", collapse = " + ") rlm_formula <- as.formula(paste0("Fat ~ ", x_vars)) rlmFitAllPredictors <- rlm(rlm_formula, data = trainingData)
3. 验证训练集结构合法性
如果修改后仍然报错,运行以下代码检查训练集是否存在异常:
# 确认列数为101(100个波长特征+1个Fat响应变量) print(ncol(trainingData)) # 确认不存在空列名 print(any(is.na(colnames(trainingData)))) # 确认不存在重复列名 print(any(duplicated(colnames(trainingData))))
如果返回结果不符合预期,需重新检查训练集拆分和拼接的代码逻辑。
内容的提问来源于stack exchange,提问作者Andrew Hughes
相关产品推荐
相关产品推荐

