如何用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
相关产品推荐
相关产品推荐

