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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:35:25