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

如何用R的gtsummary包制作含组内组间显著性检验的RCT表格?

用gtsummary实现RCT基线、组内变化及组间差异整合表格

你可以通过gtsummary包的自定义统计量功能,直接在一张表格中整合基线数据、组内变化值和组间终点差异,以下是完整实现方案:

步骤1:准备数据

首先修正数据处理逻辑,生成基线、终点及组内变化值:

set.seed(123) # 固定种子保证结果可重复
library(gtsummary)
library(dplyr)
library(broom)

# 模拟RCT数据集
ID <- seq(1:50)
data <- data.frame(ID)
data$drug <- rbinom(n = 50, 1, prob = 0.5) %>%
  factor(levels = c(0, 1), labels = c("Drug X", "Drug Y"))
data$wt_0 <- rnorm(n = 50, mean = 70, sd = 5) # 基线体重
data$wt_12 <- rnorm(50, 68, 4.9) # 12周终点体重
data$wt_change <- data$wt_0 - data$wt_12 # 基线到终点的变化值

步骤2:构建目标表格

通过tbl_summary结合add_stat,一次性添加组内变化和组间差异统计量:

final_table <- data %>%
  select(drug, wt_0, wt_12) %>%
  # 生成基线特征表
  tbl_summary(
    by = drug,
    label = list(wt_0 ~ "体重(kg)"),
    statistic = list(all_continuous() ~ "{mean} ({sd})"),
    include = wt_0
  ) %>%
  # 添加组内基线至终点变化值列
  add_stat(
    fns = list(
      wt_0 ~ ~ .x %>% 
        mutate(change = wt_0 - wt_12) %>%
        group_by(drug) %>%
        summarize(stat = paste0(round(mean(change), 2), " (", round(sd(change), 2), ")")) %>%
        pull(stat)
    ),
    header = "基线至终点变化值\n{level}"
  ) %>%
  # 添加组间终点差异(含95%CI和P值)
  add_stat(
    fns = list(
      wt_0 ~ ~ .x %>%
        t.test(wt_12 ~ drug, data = .) %>%
        tidy() %>%
        mutate(
          stat = paste0(
            round(estimate, 2), 
            " (95% CI: ", round(conf.low, 2), " to ", round(conf.high, 2), ")",
            ", P = ", format.pval(p.value, digits = 3)
          )
        ) %>%
        pull(stat)
    ),
    header = "组间终点差异(Drug Y - Drug X)"
  ) %>%
  modify_header(label ~ "结局指标")

# 查看表格
final_table

多结局指标扩展

如果有多个结局(比如添加收缩压),只需扩展add_stat中的对应逻辑即可:

# 添加收缩压数据
data$bp_0 <- rnorm(50, 120, 8)
data$bp_12 <- rnorm(50, 115, 7.5)

# 多结局表格
multi_outcome_table <- data %>%
  select(drug, wt_0, bp_0, wt_12, bp_12) %>%
  tbl_summary(
    by = drug,
    label = list(wt_0 ~ "体重(kg)", bp_0 ~ "收缩压(mmHg)"),
    statistic = list(all_continuous() ~ "{mean} ({sd})"),
    include = c(wt_0, bp_0)
  ) %>%
  add_stat(
    fns = list(
      wt_0 ~ ~ .x %>% mutate(change = wt_0 - wt_12) %>% group_by(drug) %>% summarize(stat = paste0(round(mean(change),2), " (", round(sd(change),2), ")")) %>% pull(stat),
      bp_0 ~ ~ .x %>% mutate(change = bp_0 - bp_12) %>% group_by(drug) %>% summarize(stat = paste0(round(mean(change),2), " (", round(sd(change),2), ")")) %>% pull(stat)
    ),
    header = "基线至终点变化值\n{level}"
  ) %>%
  add_stat(
    fns = list(
      wt_0 ~ ~ .x %>% t.test(wt_12 ~ drug, data = .) %>% tidy() %>% mutate(stat = paste0(round(estimate,2), " (95% CI: ", round(conf.low,2), " to ", round(conf.high,2), "), P = ", format.pval(p.value, digits=3))) %>% pull(stat),
      bp_0 ~ ~ .x %>% t.test(bp_12 ~ drug, data = .) %>% tidy() %>% mutate(stat = paste0(round(estimate,2), " (95% CI: ", round(conf.low,2), " to ", round(conf.high,2), "), P = ", format.pval(p.value, digits=3))) %>% pull(stat)
    ),
    header = "组间终点差异(Drug Y - Drug X)"
  ) %>%
  modify_header(label ~ "结局指标")

其他包替代方案

如果偏好tableone包,也可以实现类似功能(需手动补充组间差异统计量):

library(tableone)
vars <- c("wt_0", "wt_change")
tab1 <- CreateTableOne(vars = vars, strata = "drug", data = data, addOverall = FALSE)

# 提取表格并添加组间差异
tab1_df <- print(tab1, printToggle = FALSE) %>%
  as.data.frame() %>%
  mutate(
    `组间终点差异` = data %>% t.test(wt_12 ~ drug) %>% tidy() %>% {paste0(round(.$estimate,2), " (95% CI: ", round(.$conf.low,2), " to ", round(.$conf.high,2), ")")},
    `P值` = data %>% t.test(wt_12 ~ drug) %>% tidy() %>% format.pval(.$p.value, digits=3)
  )

内容的提问来源于stack exchange,提问作者Muhammad Aaqib Shamim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 18:42:37