You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用group_by与tidy批量运行线性回归并提取结果至数据框

批量运行多变量线性回归并整理结果

嘿,你的思路方向是对的,但代码里还有几个小细节需要调整,我帮你修正并完善成完全符合需求的版本👇

需求拆解

首先明确我们要实现的核心目标:

  • 对outcomes里的每个因变量,分别和exposures里的每个自变量(转成因子)建立线性回归模型
  • 每个模型都调整covariates里的所有协变量
  • 最终输出的数据框要包含:因变量、自变量、样本量、beta系数、SE、p值

修正后的完整可运行代码

library(tidyverse)
library(broom)

data("mtcars")

# 修正你原代码里的笔误(outcomes里的逗号是多余的)
outcomes <- c("wt", "mpg", "hp", "disp")
exposures <- c("gear", "vs", "am")
covariates <- c("drat", "qsec")

# 生成所有因变量-自变量的配对组合
model_combinations <- expand_grid(
  outcome = outcomes,
  exposure = exposures
)

# 批量运行模型并整理结果
model_results <- model_combinations %>%
  rowwise() %>%
  mutate(
    # 动态构建回归公式,自动处理因子转换和协变量
    formula = str_glue("{outcome} ~ factor({exposure}) + {str_c(covariates, collapse = ' + ')}"),
    # 运行模型并保存为列表列
    model_fit = list(lm(formula, data = mtcars, na.action = na.omit)),
    # 提取模型的tidy结果(系数、SE、p值等)
    tidy_results = list(tidy(model_fit, conf.int = FALSE)),
    # 提取当前模型的有效样本量
    n = nobs(model_fit)
  ) %>%
  unnest(tidy_results) %>%
  # 只保留自变量的结果,去掉截距项
  filter(str_detect(term, "^factor\\(")) %>%
  # 清理自变量名称(去掉factor()的包裹)
  mutate(exposure_var = str_remove(term, "^factor\\(|\\).*$")) %>%
  # 选择并重命名需要的列,让结果更直观
  select(
    因变量 = outcome,
    自变量 = exposure_var,
    样本量 = n,
    beta系数 = estimate,
    SE = std.error,
    p值 = p.value
  )

# 查看最终结果
head(model_results)

代码关键点解释

  • expand_grid:直接生成所有因变量和自变量的配对,确保每个模型组合都被覆盖,比gather更适合这种多因变量的批量建模场景
  • rowwise() + str_glue:逐行处理每个模型组合,动态生成回归公式,彻底避免手动写重复代码
  • list() + unnest():把模型和tidy结果存为列表列,再展开成常规数据框,这是broom配合dplyr批量处理模型的标准方式
  • nobs():直接从lm模型对象中提取有效样本量,不用手动计算过滤后的样本数
  • 最后的过滤和变量名清理:让输出结果只保留我们关心的核心信息,并且格式更易读

你的初始代码需要调整的原因

  • 原代码里的gather方式不太适配多因变量的批量建模逻辑,expand_grid的组合方式更直接高效
  • 没有处理自变量的因子转换(你示例里明确用了factor(gear),所以代码里必须加上这一步)
  • 缺少样本量的提取逻辑
  • 原代码里的y_var、cv1都是占位符,需要替换成实际的变量列表

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:21:38