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

如何用R生成含FDR校正P值的多组分层汇总表?

R语言生成含分组统计与校正两两比较的汇总表

一、基于gtsummary的扩展实现(适配现有使用习惯)

gtsummary无内置多组两两校正比较功能,但可通过自定义函数扩展tbl_summary输出,步骤如下:

1. 加载依赖包

library(gtsummary)
library(dplyr)
library(purrr)
library(stats)

2. 自定义两两比较函数

针对每个变量计算三组间两两比较P值,并执行FDR校正:

calculate_pairwise_p <- function(data, group_var, vars) {
  pairwise_results <- list()
  
  for (var in vars) {
    var_type <- if (is.numeric(data[[var]])) "continuous" else "categorical"
    group_levels <- unique(data[[group_var]])
    pairs <- combn(group_levels, 2, simplify = FALSE)
    
    p_values <- map_dbl(pairs, function(pair) {
      subset_data <- data[data[[group_var]] %in% pair, ]
      if (var_type == "continuous") {
        wilcox.test(subset_data[[var]] ~ subset_data[[group_var]])$p.value
      } else {
        fisher.test(table(subset_data[[group_var]], subset_data[[var]]))$p.value
      }
    })
    
    names(p_values) <- map_chr(pairs, ~paste(.x[1], "vs", .x[2]))
    p_values_fdr <- p.adjust(p_values, method = "fdr")
    pairwise_results[[var]] <- p_values_fdr
  }
  
  bind_rows(pairwise_results, .id = "variable") %>%
    pivot_longer(-variable, names_to = "comparison", values_to = "p_fdr") %>%
    pivot_wider(names_from = "comparison", values_from = "p_fdr")
}

3. 生成完整汇总表

# 1. 基础分层描述统计表格
tbl_base <- df %>%
  tbl_summary(
    by = group,
    type = list(all_continuous() ~ "continuous2", all_categorical() ~ "categorical"),
    statistic = list(
      all_continuous() ~ "{median} ({p25}, {p75})",
      all_categorical() ~ "{n} ({p}%)"
    )
  )

# 2. 添加全局检验P值(Kruskal-Wallis/Fisher)
tbl_with_global_p <- tbl_base %>%
  add_p(
    test = list(all_continuous() ~ "kruskal.test", all_categorical() ~ "fisher.test"),
    pvalue_fun = ~style_pvalue(.x, digits = 3)
  )

# 3. 计算两两比较的FDR校正P值
pairwise_p_df <- calculate_pairwise_p(df, "group", c("continuous_var_1", "continuous_var2", "categorical_var_1", "categorical_var2"))

# 4. 合并结果并格式化表格
tbl_final <- tbl_with_global_p %>%
  modify_table_body(left_join, pairwise_p_df, by = c("variable" = "variable")) %>%
  modify_header(
    `A vs B` ~ "**A vs B (FDR校正P)**",
    `B vs C` ~ "**B vs C (FDR校正P)**",
    `A vs C` ~ "**A vs C (FDR校正P)**",
    p.value ~ "**全局检验P**"
  ) %>%
  modify_fmt_fun(c(`A vs B`, `B vs C`, `A vs C`) ~ style_pvalue, digits = 3)

# 查看最终表格
tbl_final

二、替代方案:使用tableone包

tableone支持直接生成包含全局检验与两两校正比较的汇总表:

library(tableone)

vars <- c("continuous_var_1", "continuous_var2", "categorical_var_1", "categorical_var2")
cat_vars <- c("categorical_var_1", "categorical_var2")

table_one <- CreateTableOne(
  vars = vars,
  factorVars = cat_vars,
  strata = "group",
  data = df,
  test = TRUE,
  pairwise = TRUE,
  pAdjustMethod = "fdr"
)

# 打印表格(可转换为数据框进一步格式化)
print(table_one, showAllLevels = TRUE, quote = FALSE, noSpaces = TRUE)

说明

  • 连续变量:全局检验用Kruskal-Wallis,两两比较用Wilcoxon秩和检验,均做FDR校正;
  • 分类变量:全局检验与两两比较均用Fisher精确检验,做FDR校正;
  • gtsummary方案可保留熟悉的表格样式,方便后续调整格式或导出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:42:25