R语言调用pcr函数建模时报错'data'需为数据框/环境/列表如何解决
错误根因
触发该报错有两个核心问题:
- 训练集选取逻辑错误:你定义
train时只筛选了charges单列,pcr()的模型公式需要同时用到因变量charges和自变量age、bmi、children、smoker,训练集缺失全部自变量列本身就无法完成建模。 - 数据类型自动转换问题:R中用
[ ]索引数据框时,如果筛选结果仅包含1列,会默认将数据框降维为原子向量,不符合pcr()对data参数必须为数据框/列表/环境的要求,直接触发你看到的错误提示。
排查步骤
- 运行
class(train)查看训练集类型,如果返回值为"numeric"/"integer"等向量类型,即可确认发生了非预期的自动降维。 - 运行
colnames(train)查看训练集包含的列,核对是否覆盖模型公式中声明的全部变量。
修复后代码
# 先加载pcr函数所属的pls包,未安装请先运行install.packages("pls") library(pls) #define training and testing sets set.seed(555) # 修正:训练集纳入所有建模需要的变量,多列选取时不会触发自动降维 train <- df2[1:800, c("charges","age","bmi","children","smoker")] y_test <- df2[801:nrow(df2), c("charges")] test <- df2[801:nrow(df2), c("age","bmi","children","smoker")] #use model to make predictions on a test set model <- pcr(charges~age+bmi+children+smoker, data = train, scale=TRUE, validation="CV") pcr_pred <- predict(model, test, ncomp = 4) #calculate RMSE sqrt(mean((pcr_pred - y_test)^2))
注意事项
- 如果后续需要选取数据框单列且保留数据框结构,在索引时添加
drop = FALSE参数即可,示例:single_col_df <- raw_df[, "col_name", drop = FALSE]。 - 主成分回归预测阶段传入的测试集仅需要包含全部自变量,不需要因变量列,这部分原有写法逻辑正确。
内容的提问来源于stack exchange,提问作者W.tan
相关产品推荐
相关产品推荐

