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

如何用gtsummary自动展示预测变量的整体与亚组效应?

交互模型亚组效应的展示方案(gtsummary及替代工具)

gtsummary本身没有一键生成所有亚组特异性效应的内置功能,但可以通过自定义计算或结合其他工具实现需求,以下是针对你场景的具体解决方案:

一、用gtsummary+emmeans实现亚组效应展示

emmeans包可以便捷计算交互模型中各亚组的连续变量斜率,再整合到gtsummary表格中,步骤如下:

示例代码(基于mtcars数据)

library(gtsummary)
library(emmeans)
library(dplyr)

# 数据预处理
data(mtcars)
mtcars$am <- factor(mtcars$am, labels = c("Automatic", "Manual"))
model_int <- lm(mpg ~ cyl + hp * am, data = mtcars)

# 1. 生成基础回归表(保留非交互项)
base_tbl <- tbl_regression(model_int, intercept = FALSE) %>%
  modify_table_body(~.x %>% filter(!str_detect(term, "hp|hp:")))

# 2. 用emtrends计算各亚组中hp的斜率(效应值)
subgroup_slopes <- emtrends(model_int, specs = ~am, var = "hp") %>%
  as_tibble() %>%
  mutate(term = paste0("hp (", am, ")")) %>%
  select(term, estimate, lower.CL, upper.CL, p.value) %>%
  rename(conf.low = lower.CL, conf.high = upper.CL)

# 3. 将亚组效应转换为gtsummary格式并合并
slopes_tbl <- tbl_regression(
  subgroup_slopes,
  intercept = FALSE,
  estimate_fun = ~style_sigfig(.x, digits = 3),
  pvalue_fun = ~style_pvalue(.x, digits = 3)
)

# 合并最终表格
final_tbl <- base_tbl %>%
  modify_table_body(~.x %>% bind_rows(slopes_tbl$table_body)) %>%
  modify_header(label = "**变量**") %>%
  bold_labels()

final_tbl

二、手动计算亚组效应(无需额外包)

如果不想加载emmeans,可直接从模型系数和方差矩阵计算另一组的效应:

library(gtsummary)
library(dplyr)

data(mtcars)
mtcars$am <- factor(mtcars$am, labels = c("Automatic", "Manual"))
model_int <- lm(mpg ~ cyl + hp * am, data = mtcars)

# 提取模型参数
coefs <- coef(model_int)
vcov_mat <- vcov(model_int)
df_resid <- model_int$df.residual

# 计算Manual组hp的效应、置信区间和p值
hp_manual_est <- coefs["hp"] + coefs["hp:amManual"]
hp_manual_se <- sqrt(vcov_mat["hp","hp"] + vcov_mat["hp:amManual","hp:amManual"] + 2*vcov_mat["hp","hp:amManual"])
hp_manual_ci <- hp_manual_est + c(-1,1)*qt(0.975, df = df_resid)*hp_manual_se
hp_manual_p <- 2*(1 - pt(abs(hp_manual_est/hp_manual_se), df = df_resid))

# 修改基础表格
final_tbl <- tbl_regression(model_int, intercept = FALSE) %>%
  modify_table_body(
    ~.x %>%
      # 重命名参考组hp行
      mutate(term = ifelse(term == "hp", "hp (Automatic)", term)) %>%
      # 删除原交互项行
      filter(term != "hp:amManual") %>%
      # 添加Manual组行
      add_row(
        term = "hp (Manual)",
        label = "hp (Manual)",
        estimate = hp_manual_est,
        conf.low = hp_manual_ci[1],
        conf.high = hp_manual_ci[2],
        p.value = hp_manual_p,
        .after = which(.x$term == "hp (Automatic)")
      )
  ) %>%
  modify_header(label = "**变量**") %>%
  bold_labels()

final_tbl

三、添加全队列整体效应

若需要加入无交互模型的整体hp效应,可先拟合无交互模型,提取参数后合并:

# 拟合无交互模型
model_no_int <- lm(mpg ~ cyl + hp + am, data = mtcars)
hp_overall <- broom::tidy(model_no_int) %>% filter(term == "hp")

# 合并到最终表格
final_tbl_with_overall <- final_tbl %>%
  modify_table_body(
    ~.x %>%
      add_row(
        term = "hp (全队列)",
        label = "hp (全队列)",
        estimate = hp_overall$estimate,
        conf.low = hp_overall$conf.low,
        conf.high = hp_overall$conf.high,
        p.value = hp_overall$p.value,
        .before = which(.x$term == "hp (Automatic)")
      )
  )

final_tbl_with_overall

四、高频交互场景的工具推荐

如果经常处理交互模型,以下工具更高效:

  • interactions包:sim_slopes()函数可直接输出亚组斜率、置信区间和p值,语法简洁,适合快速分析。
  • modelsummary包:支持通过add_rows参数直接插入自定义效应结果,表格样式灵活,适配多种输出格式。
  • emmeans包:支持复杂模型(混合效应、多分类交互等)的亚组效应计算,扩展性极强。

interactions包示例

library(interactions)
library(gtsummary)

# 计算亚组斜率
slopes_result <- sim_slopes(model_int, pred = hp, modx = am, johnson_neyman = FALSE)

# 转换为gtsummary表格并合并
slopes_tbl <- slopes_result$slopes %>%
  mutate(term = paste0("hp (", modx_value, ")")) %>%
  select(term, estimate, conf.low, conf.high, p.value) %>%
  tbl_regression(intercept = FALSE)

tbl_regression(model_int, intercept = FALSE) %>%
  modify_table_body(~.x %>% filter(!str_detect(term, "hp|hp:")) %>% bind_rows(slopes_tbl$table_body))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:05:00