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

