如何使用tbl_summary基于双分类列统计支架成功率并计算p值?
用gtsummary实现指定的分组成功率统计表格
针对你的需求(基于stent_type、success、stent_30三列生成2×3表格,展示不同支架类型在两个支架放置时间组的成功率,并计算P值),可以用gtsummary包结合dplyr快速实现,以下是具体步骤和代码:
步骤1:数据准备(模拟示例数据)
先把分类变量转为因子,方便后续表格显示友好标签:
library(gtsummary) library(dplyr) library(tidyr) set.seed(123) df <- tibble( stent_type = factor(sample(0:1, 200, replace = TRUE), labels = c("支架类型0", "支架类型1")), stent_30 = factor(sample(0:1, 200, replace = TRUE), labels = c("支架放置>30天", "支架放置<30天")), success = factor(rbinom(200, 1, prob = ifelse(stent_type == "支架类型1" & stent_30 == "支架放置<30天", 0.8, 0.5)), labels = c("失败", "成功")) )
步骤2:生成2×3目标表格
这里分两种场景实现,对应不同的P值计算逻辑:
场景1:展示每个支架类型在两个时间组的成功率,以及同一支架类型在两个时间组间的成功率差异P值
先手动汇总统计量,再用gtsummary美化表格:
# 1. 计算每个支架类型-时间组的成功率(数量+百分比) summary_stats <- df %>% group_by(stent_type, stent_30) %>% summarise( success_rate = paste0(sum(success == "成功"), " (", round(100*sum(success == "成功")/n(), 1), "%)"), .groups = "drop" ) %>% pivot_wider(names_from = stent_30, values_from = success_rate) # 2. 计算每个支架类型在两个时间组的成功率差异P值(卡方检验) p_vals <- df %>% group_by(stent_type) %>% summarise( p_value = chisq.test(table(stent_30, success))$p.value %>% round(3), .groups = "drop" ) # 3. 合并数据并生成表格 final_table <- left_join(summary_stats, p_vals, by = "stent_type") %>% tbl_summary( include = everything(), label = list( stent_type ~ "支架类型", `支架放置>30天` ~ "支架放置>30天", `支架放置<30天` ~ "支架放置<30天", p_value ~ "组间差异P值" ) ) %>% modify_header(label ~ "**项目**") %>% modify_column_hide(stat_0) # 隐藏默认统计列,保留自定义列 print(final_table)
场景2:展示每个时间组内不同支架类型的成功率,以及同一时间组内不同支架类型的成功率差异P值
用tbl_strata分层统计,更适合看时间组内的支架类型差异:
strata_table <- df %>% tbl_strata( strata = stent_30, # 按支架放置时间分层 .tbl_fun = ~.x %>% tbl_summary( by = stent_type, # 每个层内按支架类型分组 include = success, statistic = success ~ "{n} ({p}%)", label = success ~ "成功率" ) %>% add_p(test = success ~ "chisq.test") # 添加组间比较P值 ) %>% modify_spanning_header(starts_with("stat_") ~ "**支架放置时间分组**") %>% modify_header(label ~ "**指标**") print(strata_table)
关键说明
- 如果样本量较小(比如单元格期望频数<5),把卡方检验换成Fisher精确检验:
add_p(test = success ~ "fisher.test") - 可以通过
modify_style等函数调整表格样式,比如字体、对齐方式等 - 若需要导出表格到Word/HTML,用
as_flex_table()或as_gt()配合导出函数即可
内容的提问来源于stack exchange,提问作者jon
相关产品推荐
相关产品推荐

