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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:13:18