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

