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

如何从多个线性回归模型输出构建合并对比数据框?

问题描述

在R语言中以MWT1Best为因变量,分别运行了5个简单线性回归和1个包含全部5个预测变量的多元线性回归,已生成简单回归系数数据框和多元回归调整后系数数据框,想要高效合并为对比数据框,但遇到两个问题:

  1. 将COPDSEVERITY编码为整数后,简单回归数据框丢失了该变量的3个系数,希望在现有代码基础上保留这些系数,无需单独运行再手动合并;
  2. 询问是否有工具包可直接生成简单与多元线性回归的合并输出,当前手动合并存在变量名不匹配(如Gender、Comorbid、COPDSEVERITY)等问题,需更优方法。

变量结构

str(copd2)
 $ AGE         : int  77 79 80 56 65 67 67 83 72 75 ...
 $ COPDSEVERITY: chr  "SEVERE" "MODERATE" "MODERATE" "VERY SEVERE" ...
 $ MWT1Best    : int  120 176 201 210 210 216 237 237 237 240 ...
 $ FEV1        : num  1.21 1.09 1.52 0.47 1.07 1.09 0.69 0.68 2.13 1.06 ...
 $ gender      : int  1 0 0 1 1 0 0 1 1 0 ...
 $ comorbid2   : int  1 1 1 1 1 1 1 1 1 1 ...

现有简单回归代码

copd2$COPDSEVERITY <- recode(copd2$COPDSEVERITY, "MILD" = 0, "MODERATE" = 1, "SEVERE" = 2, "VERY SEVERE" = 3)

f.MWT <- melt(data.frame(x = copd2$MWT1Best,
                    FEV1=copd2$FEV1,
                    AGE=copd2$AGE,
                    Gender=copd2$gender,
                    Severity=copd2$COPDSEVERITY,
                    Comorbid=copd2$comorbid2),
               id.vars = "x")

MWT.simp <- f.MWT %>% group_by(variable) %>% do(tidy(lm(x ~ value, data = .)))

解决方案

问题1:保留COPDSEVERITY的多分类系数

你把COPDSEVERITY转成整数型的操作,导致lm()只输出线性趋势的单系数。要保留多分类的每个水平系数,不要转成整数,而是转成因子型,这样lm()会自动生成各虚拟变量的系数:

修改后的简单回归代码:

# 将COPDSEVERITY转为因子,指定水平顺序(确保参考水平为MILD)
copd2$COPDSEVERITY <- factor(copd2$COPDSEVERITY, 
                             levels = c("MILD", "MODERATE", "SEVERE", "VERY SEVERE"))

# 重构melt数据集,统一变量命名避免混乱
f.MWT <- melt(data.frame(
  MWT1Best = copd2$MWT1Best,
  FEV1 = copd2$FEV1,
  AGE = copd2$AGE,
  Gender = copd2$gender,
  COPDSEVERITY = copd2$COPDSEVERITY,
  Comorbid = copd2$comorbid2
), id.vars = "MWT1Best")

# 分组运行简单回归,此时COPDSEVERITY会输出各水平的系数
MWT.simp <- f.MWT %>% 
  group_by(variable) %>% 
  do(tidy(lm(MWT1Best ~ value, data = .)))

运行后MWT.simp会包含COPDSEVERITY每个水平(相对于参考水平MILD)的系数,和单独运行回归的结果完全一致,无需手动合并。

问题2:工具包自动合并回归结果

推荐使用modelsummary包,它可以一键合并多个模型结果,自动处理变量名匹配,还支持自定义输出格式:

步骤1:安装加载包

install.packages("modelsummary")
library(modelsummary)
library(dplyr)

步骤2:定义所有模型

# 构建简单回归模型列表
models_simple <- list(
  "FEV1 (简单回归)" = lm(MWT1Best ~ FEV1, data = copd2),
  "AGE (简单回归)" = lm(MWT1Best ~ AGE, data = copd2),
  "Gender (简单回归)" = lm(MWT1Best ~ gender, data = copd2),
  "COPDSEVERITY (简单回归)" = lm(MWT1Best ~ COPDSEVERITY, data = copd2),
  "Comorbid (简单回归)" = lm(MWT1Best ~ comorbid2, data = copd2)
)

# 构建多元回归模型
model_mult <- lm(MWT1Best ~ FEV1 + AGE + gender + COPDSEVERITY + comorbid2, data = copd2)

# 合并所有模型
all_models <- c(models_simple, list("多元回归" = model_mult))

步骤3:生成合并对比表

# 生成对比数据框,可自定义变量名、显示统计量
compare_df <- modelsummary(all_models,
             coef_map = c("FEV1" = "FEV1",
                          "AGE" = "AGE",
                          "gender" = "Gender",
                          "COPDSEVERITYMODERATE" = "COPDSEVERITY: 中度",
                          "COPDSEVERITYSEVERE" = "COPDSEVERITY: 重度",
                          "COPDSEVERITYVERY SEVERE" = "COPDSEVERITY: 极重度",
                          "comorbid2" = "Comorbid"),
             statistic = c("std.error", "p.value"),
             output = "dataframe")

这个方法会自动对齐所有变量的系数,彻底解决手动合并的变量名不匹配问题,还能直接输出可视化表格或LaTeX格式,效率远高于手动处理。

补充:手动合并的优化方案

如果不想用工具包,可通过统一变量名实现合并:

# 处理多元回归的变量名,和简单回归对齐
MWT.mult <- MWT.mult %>%
  mutate(variable = case_when(
    term == "FEV1" ~ "FEV1",
    term == "AGE" ~ "AGE",
    term == "copd$gender1" ~ "Gender",
    str_detect(term, "COPDSEVERITY") ~ str_remove(term, "COPDSEVERITY"),
    term == "comorbid1" ~ "Comorbid",
    TRUE ~ term
  ))

# 合并数据框
MWT.compare <- merge(x = MWT.simp, y = MWT.mult, by = "variable", all = TRUE)

但这种方法在处理多分类变量时容易出错,仍不如modelsummary灵活。

内容的提问来源于stack exchange,提问作者r.Albatross

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:48:08