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

