You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言自定义向前逐步回归:如何仅打印模型的(调整后)R平方值

手动实现向前逐步回归:提取R平方值的问题解决

作为R语言新手,你想从零开始写向前逐步回归的代码,拒绝用step()regsubset()这类现成函数——先逐个测试v1到v80这些自变量和因变量concentration的简单线性回归,再提取每个模型的R平方和调整后R平方,这个思路完全没问题,但你在提取指标的时候踩了个小坑。

你遇到的问题

最初的循环代码能正常输出完整模型摘要,但当你想只打印R平方和调整后R平方时,用了summary(model$r.squared),结果输出了一堆Length Class Mode 0 NULL NULL的奇怪内容。

问题根源

model$r.squared本身就是一个数值型变量,直接调用就能拿到具体数值,不需要再套一层summary()函数。summary()是用来处理lm()返回的完整模型对象的,给它传单个数值,它就会输出这个数值的结构信息,也就是你看到的那些异常内容。另外,你的循环遍历了names(df),会把siteconcentration这类非自变量也包含进去,得先把它们排除。

修正后的代码

这里给你两种实用的实现方式:

方式1:直接打印每个变量的指标

# 先筛选出自变量列:精准提取v1到v80
predictors <- grep("^v\\d+$", names(df), value = TRUE)

for (j in predictors) {
  # 用as.formula构建规范的回归公式
  model_formula <- as.formula(paste("concentration ~", j))
  model <- lm(model_formula, data = df)
  
  # 直接提取指标:R平方从model取,调整后R平方从summary(model)取
  r_sq <- model$r.squared
  adj_r_sq <- summary(model)$adj.r.squared
  
  cat("变量:", j, "\n")
  cat("R平方:", round(r_sq, 4), "\n")
  cat("调整后R平方:", round(adj_r_sq, 4), "\n\n")
}

方式2:整理成数据框(更推荐,方便后续筛选最优变量)

predictors <- grep("^v\\d+$", names(df), value = TRUE)
# 初始化空数据框存储结果
result_df <- data.frame(
  变量名 = character(),
  R平方 = numeric(),
  调整后R平方 = numeric(),
  stringsAsFactors = FALSE
)

for (j in predictors) {
  model_formula <- as.formula(paste("concentration ~", j))
  model <- lm(model_formula, data = df)
  
  r_sq <- model$r.squared
  adj_r_sq <- summary(model)$adj.r.squared
  
  # 将当前变量结果添加到数据框
  result_df <- rbind(result_df, data.frame(
    变量名 = j,
    R平方 = round(r_sq, 4),
    调整后R平方 = round(adj_r_sq, 4)
  ))
}

# 查看整理后的结果
print(result_df)

关键细节提醒

  • 调整后R平方adj.r.squared只存在于summary(model)的返回结果中,不能直接从model对象提取;而R平方r.squared可以直接从model对象获取。
  • grep("^v\\d+$", names(df), value = TRUE)能精准筛选出自变量,避免把siteconcentration这类无关列带入循环。
  • as.formula()构建公式比直接写concentration ~ df[[j]]更规范,也为后续多变量回归的扩展做好准备。

这样修改后,你就能清晰看到每个自变量对应的R平方和调整后R平方值,为后续向前逐步回归(比如选择最优变量加入模型)打下基础。

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

火山引擎 最新活动