使用descr包CrossTable做Fisher精确检验遇FEXACT错误6的问询
问题与解决:descr包CrossTable调用Fisher精确检验报错FEXACT error 6
问题背景
使用R语言descr包的CrossTable函数进行列联表两两比较,因数据非正态且单元格计数低,选择Fisher精确检验。运行时抛出如下错误:
Error in fisher.test(tab, alternative = "two.sided") : FEXACT error 6. LDKEY=616 is too small for this problem, (ii := key2[itp=960] = 5666926, ldstp=18480) Try increasing the size of the workspace and possibly 'mult' In addition: Warning message: In chisq.test(tab, correct = FALSE, ...) : Chi-squared approximation may be incorrect
已知fisher.test出现此类错误时,可通过增大workspace参数或设置simulate.p.value = TRUE解决,但不清楚如何将这些参数传入CrossTable内部调用的fisher.test。
所用列联表数据定义如下:
x <- structure(c(45L, 15L, 0L, 0L, 16L, 3L, 238L, 317L, 2L, 35L, 47L, 1L, 15L, 20L, 0L, 22L, 14L, 0L, 20L, 183L, 25L), dim = c(3L, 7L), dimnames = structure(list(c("A", "B", "C"), c("1", "2", "3", "4", "5", "6", "7")), names = c("", "")), class = "table")
疑问:该表规模并不大,为何fisher.test无法直接运行,必须设置workspace或simulate.p.value这类参数?
问题原因
FEXACT error 6本质是Fisher精确检验计算时所需的临时内存空间不足。虽然列联表维度(3×7)看起来不大,但:
- 当表中存在多个0值单元格,且边缘合计数较大时,计算精确p值需要枚举的可能组合数会急剧增加,远超默认
workspace的承载能力 - 默认
workspace参数值较小(默认200000字节),不足以支撑这类组合的枚举计算
解决方法
1. 直接给CrossTable传递fisher.test的参数
CrossTable函数支持通过...(可变参数)将额外参数传递给内部调用的fisher.test,只需在调用时直接添加所需参数即可:
- 增大workspace:
library(descr) CrossTable(x, fisher = TRUE, workspace = 5e5) # 可根据情况调整数值,比如5e5即500000字节
- 使用模拟p值(蒙特卡洛方法,无需枚举所有组合,内存压力更小):
CrossTable(x, fisher = TRUE, simulate.p.value = TRUE, B = 10000) # B为模拟次数,默认2000,可适当增大提升精度
2. 手动调用fisher.test验证
如果不确定参数是否生效,可单独提取子表手动调用fisher.test测试:
# 示例:提取前两列做测试 sub_tab <- x[, 1:2] fisher.test(sub_tab, workspace = 5e5)
内容的提问来源于stack exchange,提问作者Nneka
相关产品推荐
相关产品推荐

