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

如何在gtsummary中调整add_q()检验数量以校正多重检验?

解决gtsummary横向合并表格后添加校正p值(q值)的问题

问题背景

有3个通过tbl_cross()生成的列联表,需横向合并展示。每个表格已通过add_p()添加Fisher精确检验的p值,现在需要添加多重检验校正后的q值,但遇到两个问题:

  • 合并后调用add_q()会报错:Error: There is no p-value column. x$table_body must have a column called 'p.value'
  • 单个表格调用add_q()时,只会基于当前表格的1个p值校正,导致q值等于p值,无法指定总检验数(本次为3)给stats::p.adjust()

解决方案思路

先提取所有表格的p值统一校正,再将计算好的q值手动添加到每个表格中,最后合并表格。

完整代码示例

library(gtsummary)

# 构造测试数据
toy_1 <- data.frame(x1 = c("A","A", "B", "B", "B", "B", "C", "A", "C", "B"),
                    x2 = c("A", "B", "A", "B", "B", "A", "C", "B", "C", "B"),
                    x3 = c("B", "A", "C", "B", "B", "B", "A", "B", "C", "A"))

toy_2 <- data.frame(x1 = c("R","R", "G", "G", "G", "G", "G", "R", "G", "G"),
                    x2 = c("R", "G", "R", "R", "G", "R", "R", "G", "G", "G"),
                    x3 = c("G", "R", "R", "R", "G", "G", "G", "G", "G", "G"))

## 1. 生成不带add_q()的表格列表,保留p值
list_out <- vector(mode = "list", length = 3)

for (i in 1:3){
  toy_combine <- data.frame(toy_1[,i], toy_2[,i])
  colnames(toy_combine) <- c("toy_1", "toy_2")
  
  tbl_toy <- tbl_cross(data = toy_combine,
                       row = toy_1, 
                       col = toy_2,
                       missing_text = "Missing") |>
    modify_header(label ~ "**toy_2**") |>
    bold_labels() |>
    add_p() # 只添加p值,暂不做校正
  
  list_out[[i]] <- tbl_toy
}

## 2. 提取所有p值并统一计算校正后的q值
all_p_values <- sapply(list_out, function(tbl) tbl$table_body$p.value)
all_q_values <- stats::p.adjust(all_p_values, method = "holm")

## 3. 给每个表格添加q值列
list_out_with_q <- lapply(seq_along(list_out), function(i) {
  list_out[[i]] |>
    modify_table_body(
      mutate,
      q.value = all_q_values[i]
    ) |>
    modify_header(q.value ~ "**q-value**") |>
    modify_fmt(
      columns = q.value,
      fmt_fun = ~style_pvalue(.x, digits = 3)
    )
})

## 4. 合并表格
tbl_merge(tbls = list_out_with_q,
          tab_spanner = colnames(toy_1))

代码说明

  1. 生成基础表格:循环创建带p值的tbl_cross表格,不调用add_q()
  2. 统一计算q值:用sapply提取所有表格的p值,调用stats::p.adjust()基于总检验数3做校正
  3. 添加q值到表格:通过modify_table_body给每个表格插入q值列,用modify_header设置表头,modify_fmt格式化q值显示
  4. 合并表格:最后用tbl_merge横向合并带q值的表格

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:57:19