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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:40:57