如何用gtsummary基于broom::tidy()输出制表,避免重复计算置信区间?
解决方案:复用
broom::tidy()结果生成gtsummary表格 完全可以直接用已有的broom::tidy()输出结果生成格式规范的gtsummary表格,无需重复计算置信区间。以下是两种简洁的实现方式:
方法一:使用tbl_custom_summary(推荐)
这个方法直接基于tidy后的数据集构建表格,利用gtsummary内置的格式化函数保证输出规范:
library(gtsummary) library(broom) library(dplyr) # 二元逻辑回归模型 mod1 <- glm(response ~ trt + age + grade, trial, family = binomial) # 提前计算并保存tidy结果(仅计算一次) tbl_mod1 <- mod1 |> tidy(exponentiate = TRUE, conf.int = TRUE) # 基于tidy结果生成gtsummary表格 tbl_final <- tbl_custom_summary( data = tbl_mod1, include = term, # 定义统计量格式:OR值+95%CI、P值 stat_fns = list( ~list( or_ci = paste0( style_number(.x$estimate, digits = 2), " (", style_number(.x$conf.low, digits = 2), ", ", style_number(.x$conf.high, digits = 2), ")" ), p_val = style_pvalue(.x$p.value, digits = 3) ) ), # 设置变量标签 label = list(term = "变量") ) |> # 自定义表头 modify_header( stat_1 = "**OR (95% CI)**", stat_2 = "**P值**" ) |> # 添加表格标题 add_title("二元逻辑回归模型结果") |> # 移除默认脚注(可选) modify_footnote(everything() ~ NA) # 查看表格 tbl_final
方法二:基于tbl_summary自定义合并列
如果需要更灵活的列调整,可以用tbl_summary处理数据框后合并CI列:
tbl_final <- tbl_mod1 |> select(term, estimate, conf.low, conf.high, p.value) |> tbl_summary( by = NULL, type = everything() ~ "continuous", label = list( term = "变量", estimate = "OR", conf.low = "95% CI下限", conf.high = "95% CI上限", p.value = "P值" ) ) |> # 合并OR与CI为一列,格式化P值 modify_table_body( mutate( or_ci = paste0(style_number(estimate, 2), " (", style_number(conf.low, 2), ", ", style_number(conf.high, 2), ")"), p.value = style_pvalue(p.value, 3) ) |> select(term, or_ci, p.value) ) |> modify_header( term = "**变量**", or_ci = "**OR (95% CI)**", p.value = "**P值**" ) |> add_title("二元逻辑回归模型结果") # 查看表格 tbl_final
关键优势
- 仅计算一次置信区间,避免重复耗时计算
- 完全保留gtsummary的美观格式和后续定制能力(如添加显著性标记、调整样式等)
- 输出结果与
tbl_regression的规范格式一致
内容的提问来源于stack exchange,提问作者ChrisP
相关产品推荐
相关产品推荐

