如何在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_bodymust 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))
代码说明
- 生成基础表格:循环创建带p值的
tbl_cross表格,不调用add_q() - 统一计算q值:用
sapply提取所有表格的p值,调用stats::p.adjust()基于总检验数3做校正 - 添加q值到表格:通过
modify_table_body给每个表格插入q值列,用modify_header设置表头,modify_fmt格式化q值显示 - 合并表格:最后用
tbl_merge横向合并带q值的表格
内容的提问来源于stack exchange,提问作者sheepsbleet808
相关产品推荐
相关产品推荐

