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

使用tbl_summary无法获取p值,出现FEXACT error 501报错

问题原因及解决方法

问题原因

  • Fisher精确检验默认的精确计算逻辑依赖组合数运算,当列联表单元格计数过大(或样本量极大)时,所需计算的数值会超出R能表示的最大整数范围,触发FEXACT error 501。
  • 直接运行fisher.test()也报错,说明核心问题是检验方法与数据规模不匹配,和gtsummary包本身无关。

解决方法

方法1:在gtsummary中启用Fisher检验的模拟p值

利用报错提示提到的simulate.p.value=TRUE参数,通过模拟抽样计算p值,避开精确计算的整数溢出问题:

df %>% 
  select(SEX, HPV_VACCINATION_STATUS) %>%
  tbl_summary(by = HPV_VACCINATION_STATUS, missing = "no") %>%
  add_p(
    test = list(SEX ~ "fisher.test"),
    test.args = list(SEX ~ list(simulate.p.value = TRUE, B = 10000)) # B为模拟次数,数值越大结果越稳定
  ) %>%
  bold_p(t = 0.01) %>%
  bold_labels()

方法2:改用卡方检验(大样本推荐)

如果你的数据是大样本,且列联表中大部分单元格的期望频数≥5,卡方检验结果足够可靠,可直接替换Fisher检验:

df %>% 
  select(SEX, HPV_VACCINATION_STATUS) %>%
  tbl_summary(by = HPV_VACCINATION_STATUS, missing = "no") %>%
  add_p(test = list(SEX ~ "chisq.test")) %>%
  bold_p(t = 0.01) %>%
  bold_labels()

方法3:手动计算p值后加入表格(备选)

若前两种方法不适用,可先手动计算p值,再通过add_stat()将结果插入表格:

# 手动计算模拟Fisher检验的p值
p_val <- fisher.test(df$SEX, df$HPV_VACCINATION_STATUS, simulate.p.value = TRUE, B = 10000)$p.value

# 插入表格
df %>% 
  select(SEX, HPV_VACCINATION_STATUS) %>%
  tbl_summary(by = HPV_VACCINATION_STATUS, missing = "no") %>%
  add_stat(
    fns = list(SEX ~ ~sprintf("p = %.4f", p_val))
  ) %>%
  bold_p(t = 0.01) %>%
  bold_labels()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:43:31