如何在tbl_summary表格中自动切换chisq.test与fisher.test无需合并表?
可以实现,具体脚本如下
我们可以借助gtsummary包的自定义统计函数功能,根据单元格期望频数自动切换卡方检验(chisq.test())和Fisher精确检验(fisher.test())。对于两个独立表格,只需动态合并为带分组标识的数据集(这是组间比较的必要步骤,并非繁琐的手动合并操作),即可完成后续处理。
步骤1:加载必要的包
library(gtsummary) library(tidyverse)
步骤2:自定义p值计算函数
该函数会先计算交叉表的期望频数,遵循统计学常规判断逻辑:若超过20%的单元格期望频数<5,或存在期望频数<1的情况,使用Fisher精确检验,否则用卡方检验:
auto_test <- function(data, variable, by, ...) { # 构建组间交叉表 tbl <- table(data[[variable]], data[[by]]) # 计算期望频数 expected <- chisq.test(tbl)$expected # 判断检验方法 use_fisher <- sum(expected < 5) > 0.2 * length(expected) || any(expected < 1) test_result <- if (use_fisher) fisher.test(tbl) else chisq.test(tbl) # 返回符合gtsummary要求的结果格式 tibble( p.value = test_result$p.value, method = ifelse(use_fisher, "Fisher精确检验", "卡方检验") ) }
步骤3:处理独立表格并生成统计表格
假设你有两个结构一致的独立表格df_control(对照组)和df_case(病例组):
# 示例数据:创建两个独立表格 df_control <- tibble( gender = sample(c("男", "女"), 50, replace = TRUE), smoke = sample(c("是", "否"), 50, replace = TRUE) ) df_case <- tibble( gender = sample(c("男", "女"), 40, replace = TRUE), smoke = sample(c("是", "否"), 40, replace = TRUE) ) # 动态合并为带分组标识的数据集 combined_df <- bind_rows( df_control %>% mutate(group = "对照组"), df_case %>% mutate(group = "病例组") ) # 生成tbl_summary并应用自定义检验逻辑 combined_df %>% tbl_summary(by = group) %>% add_p(test = everything() ~ auto_test) %>% modify_header(p.value = "**P值**", method = "**检验方法**")
内容的提问来源于stack exchange,提问作者Robert Serunjogi
相关产品推荐
相关产品推荐

