如何在R中对数据框多响应变量逐一构建ranger随机森林回归模型
R批量构建随机森林回归模型问题解决
错误原因分析
你的代码报错是因为公式构造错误:as.formula()中paste的参数传递有误,你只传入了响应变量名,没有将其与~ .拼接成完整的公式结构,导致ranger接收到的是单个变量名而非合法的公式表达式。此外循环中的i已经是响应变量的名称,无需重复调用colnames()或names()获取。
修正后的代码(生成独立全局对象)
# 提取所有以"EE"开头的响应变量名 resp_vars <- grep("^EE", names(GC05cr_h16_dat3), value = TRUE) # 循环为每个响应变量构建模型 for (var in resp_vars) { # 构造合法的回归公式:响应变量 ~ 所有其他变量 model_formula <- as.formula(paste(var, "~ .")) # 拟合随机森林模型 rf_model <- ranger( formula = model_formula, data = GC05cr_h16_dat3, importance = "impurity" ) # 将模型存入全局环境,命名格式为rfR_Res_+响应变量名 assign(paste0("rfR_Res_", var), rf_model, envir = .GlobalEnv) }
更推荐的方案:用列表存储模型
当响应变量数量较多时,分散的全局对象不易管理,用列表统一存储模型更高效:
# 提取响应变量名 resp_vars <- grep("^EE", names(GC05cr_h16_dat3), value = TRUE) # 批量构建模型并存储到列表 rf_models <- lapply(resp_vars, function(var) { ranger( formula = as.formula(paste(var, "~ .")), data = GC05cr_h16_dat3, importance = "impurity" ) }) # 为列表元素命名,与你期望的模型对象名一致 names(rf_models) <- paste0("rfR_Res_", resp_vars) # 调用单个模型示例: # rf_models[["rfR_Res_EE87865ln1"]]
可选:仅使用指定预测变量
如果不想用所有其他变量,只想用_h16结尾的预测变量,可以调整公式构造逻辑:
# 提取预测变量名(以_h16结尾) pred_vars <- grep("_h16$", names(GC05cr_h16_dat3), value = TRUE) # 循环构建模型时,指定预测变量集合 for (var in resp_vars) { model_formula <- as.formula(paste(var, "~", paste(pred_vars, collapse = " + "))) rf_model <- ranger( formula = model_formula, data = GC05cr_h16_dat3, importance = "impurity" ) assign(paste0("rfR_Res_", var), rf_model, envir = .GlobalEnv) }
内容的提问来源于stack exchange,提问作者Debajyoti Kabiraj
相关产品推荐
相关产品推荐

