如何在gtsummary的tbl_continuous中自动分配t-test与ANOVA?
解决gtsummary中tbl_continuous的检验方法切换、主题设置及add_p()示例
一、按分组水平自动切换t-test/ANOVA检验
默认的Wilcoxon/Kruskal-Wallis检验无法通过test.args直接替换逻辑,需通过add_p()的test参数指定自定义函数,实现2水平用t检验、多水平用ANOVA的自动判断:
library(gtsummary) library(dplyr) library(broom) # 自定义自动切换检验的函数 auto_switch_test <- function(data, variable, by, ...) { # 获取分组变量的水平数量 group_levels <- data %>% pull(by) %>% unique() %>% length() if (group_levels == 2) { # 2水平时执行t检验 t.test(formula = as.formula(paste(variable, "~", by)), data = data) } else { # 多水平时执行方差分析,用broom整理成gtsummary兼容的格式 aov(formula = as.formula(paste(variable, "~", by)), data = data) %>% tidy() %>% slice(1) %>% select(p.value) } } # 应用到分析流程 trial %>% select(trt, marker, grade, response) %>% tbl_continuous(marker, statistic = ~"{mean} ({sd})") %>% add_p(test = list(marker = auto_switch_test))
二、tbl_continuous的主题设置
tbl_continuous继承gtsummary的全局主题配置,也支持单表局部调整:
1. 全局主题设置(对所有gtsummary表格生效)
# 定义自定义主题 my_gts_theme <- list( "tbl_continuous-str:stat_label" = "均值 (标准差)", # 调整统计量标签 "fmt_pvalue" = function(x) style_pvalue(x, digits = 3), # p值保留3位小数 "tbl_summary-str:header_bg" = "#f5f5f5" # 表头背景色 ) # 激活主题 set_gtsummary_theme(my_gts_theme) # 运行分析即可应用主题 trial %>% select(trt, marker) %>% tbl_continuous(marker, statistic = ~"{mean} ({sd})") %>% add_p(test = auto_switch_test)
2. 单表局部调整
无需修改全局主题,直接用modify_table_styling()调整单个表格:
trial %>% select(trt, marker) %>% tbl_continuous(marker, statistic = ~"{mean} ({sd})") %>% add_p() %>% modify_table_styling(columns = p.value, fmt_fun = style_pvalue, digits = 2)
三、add_p()的统计测试使用示例
1. 强制指定单个检验方法
# 强制对marker使用t检验 trial %>% select(trt, marker) %>% tbl_continuous(marker, statistic = ~"{mean} ({sd})") %>% add_p(test = t.test)
2. 为不同变量指定不同检验
# marker用t检验,假设新增的age变量用Wilcoxon检验 trial %>% select(trt, marker, age) %>% tbl_continuous(c(marker, age), statistic = ~"{mean} ({sd})") %>% add_p(test = list(marker = t.test, age = wilcox.test))
3. 使用gtsummary封装的检验函数
gtsummary提供了适配包内格式的封装函数,比如test.t.test()、test.anova():
trial %>% select(trt, marker) %>% tbl_continuous(marker, statistic = ~"{mean} ({sd})") %>% add_p(test = test.anova)
内容的提问来源于stack exchange,提问作者NEA
相关产品推荐
相关产品推荐

