如标题所述,fisher.test
使 R 崩溃,并出现 *** 捕获段错误 ***
错误。这是产生错误的代码:
d<-matrix(c(1,0,5,2,1,90,0,0,0,1,0,14,0,0,0,0,0,5,0,
0,0,0,0,2,0,0,0,0,0,2,2,1,0,2,3,89),
nrow=6,byrow = TRUE)
fisher.test(d,simulate.p.value=FALSE)
我发现了这一点,因为我在某些函数中使用了fisher.test
。在数据上运行它们会导致 R 因上述错误而崩溃。
我知道提供给fisher.test
的表表现不佳,但我想这种事情不应该发生。
对于列联表应满足哪些条件的任何建议,以避免由于 fisher.test
不当行为而导致的崩溃,我将不胜感激。另外,为了避免崩溃,还应该在fisher.test
中设置其他参数,我做了一些测试,其中
fisher.test(d,simulate.p.value=TRUE)
不会崩溃并产生结果。
我之所以提出这个要求,是因为我必须实现它,以避免 future 管道崩溃。
最佳答案
我可以确认这是 R 4.2 中的一个错误,并且现已在 R 的开发分支中修复(5 月 7 日为 this commit)。如果它很快就会被移植到补丁版本中,我不会感到惊讶,但这是未知的/取决于 R 开发人员。运行上面的示例不会再出现段错误,但它确实会引发错误:
Error in fisher.test(d, simulate.p.value = FALSE) : FEXACT[f3xact()] error: hash key 5e+09 > INT_MAX, kyy=203, it[i (= nco = 6)]= 0.
Rather set 'simulate.p.value=TRUE'
因此,这使您的工作流程变得更好(您可以使用 try()
/tryCatch()
处理这些错误),但如果您确实想对这些数据执行精确 Fisher 测试,它不一定能让您满意。 (对具有大量条目的大型表进行精确测试在计算上极其非常困难,因为它们本质上必须对具有给定边际值的所有可能表的集合进行计算。)
我没有任何绝妙的想法来检测导致此问题的确切条件(也许您可以根据表的尺寸和表中的计数总和提出一个粗略的标准,例如 if (prod(dim(d)) > 30 && sum(d) > 200)
...?)
设置 simulate.p.value=TRUE
是最明智的方法。然而,如果您期望极端表格的精确结果(例如,您正在从事生物信息学工作,并将对结果进行巨大的多重比较校正),您将会感到失望。例如:
dd <- matrix(0, 6, 6)
dd[5,5] <- dd[6,6] <- 100
fisher.test(dd)$p.value
## 2.208761e-59, reported as "< 2.2e-16"
fisher.test(dd, simulate.p.value = TRUE, B = 10000)$p.value
# 9.999e-05
fisher.test(..., simulate.p.value = TRUE)
永远不会返回小于 1/(B+1)
的值(如果没有模拟表比观察表更极端,就会发生这种情况:从技术上讲,p 值应该报告为“<= 9.999e-05")。因此,你永远无法(在宇宙的生命周期中)计算出像 1e-59 这样的 p 值,你只能根据你愿意设置的大小来设置 B
的界限。
关于r - Fisher.test R 崩溃,并出现 *** 捕获段错误 *** 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72091074/