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

关于gtsummary/tbl_summary:亚组与基线单独比较的技术问询

实现亚组与基线单独对比的解决方案

用gtsummary直接实现

gtsummary完全支持这种需求,无需手动处理,核心是指定基线为分组变量的参考水平,让add_p()自动计算各亚组与基线的对比P值,而非两两比较。

方法1:设置因子参考组(最简单)

将分组变量转为因子并指定基线(如Grade I)为参考水平,add_p()会自动以该组为基准计算其他组的对比P值:

library(gtsummary)
library(dplyr)

# 构造示例数据
df <- tibble(
  grade = factor(c(rep("Grade I", 50), rep("Grade II", 40), rep("Grade III", 30))),
  age = rnorm(120, 50, 10),
  sex = sample(c("Male", "Female"), 120, replace = TRUE)
)

# 把Grade I设为参考组
df <- df %>% mutate(grade = relevel(grade, ref = "Grade I"))

# 生成表格并添加基线对比P值
tbl_summary(df, by = grade) %>%
  add_p(
    test = list(
      all_continuous() ~ "t.test",  # 连续变量用t检验
      all_categorical() ~ "chisq.test"  # 分类变量用卡方检验
    )
  )

方法2:自定义检验函数(复杂场景适配)

如果需要更灵活的对比逻辑(如多组ANOVA后和基线的事后检验),可以自定义检验函数传递给add_p():

# 自定义连续变量与基线的t检验函数
baseline_t_test <- function(data, variable, by, ...) {
  baseline_group <- levels(factor(data[[by]]))[1]
  # 遍历所有非基线组,计算与基线的t检验P值
  p_results <- lapply(
    setdiff(levels(factor(data[[by]])), baseline_group),
    function(subgroup) {
      t.test(
        data[[variable]] ~ data[[by]] %in% c(baseline_group, subgroup)
      )$p.value
    }
  )
  # 整理结果格式
  tibble(
    variable = variable,
    p.value = unlist(p_results),
    group = setdiff(levels(factor(data[[by]])), baseline_group)
  )
}

# 应用到表格,并自定义表头
tbl_summary(df, by = grade) %>%
  add_p(
    test = all_continuous() ~ baseline_t_test,
    pvalue_fun = function(x) style_pvalue(x, digits = 3)
  ) %>%
  modify_header(p.value ~ "**与Grade I对比的P值**")

备选R包

如果偏好其他工具,以下包也支持基线对比:

  • tableone:设置分组变量的参考水平后,直接生成包含基线对比P值的特征表,可导出为markdown格式。
  • arsenal:tableby()函数支持指定参考组,轻松生成亚组与基线的对比统计量。

内容的提问来源于stack exchange,提问作者Philipp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:37:13