fisher.test 使 R 崩溃并出现 *** 捕获段错误 *** 错误
fisher.test crash R with *** caught segfault *** error
如标题所述,fisher.test
R 崩溃并出现 *** caught segfault ***
错误。这是产生错误的代码:
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
的 table 行为不当,但我想这种事情不应该发生。
对于意外事件 table 应满足哪些条件以避免因 fisher.test
不当行为导致此类崩溃的任何建议,我将不胜感激。为了避免崩溃,还应该在 fisher.test
中设置哪些其他参数,我做了一些测试,其中
fisher.test(d,simulate.p.value=TRUE)
不会崩溃并产生结果。
我提出这个要求是因为我必须实施它以避免未来我的管道崩溃。
我可以确认这是 R 4.2 中的错误,现在已在 R 的开发分支中修复(5 月 7 日 this commit)。如果它很快被移植到 patch-release,我不会感到惊讶,但这对 R 开发人员来说是 unknown/up。 运行 您上面的示例不再出现段错误,但它确实会引发错误:
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()
处理这些错误),但如果你真的想执行 exact Fisher 对这些数据进行检验。 (对具有大条目的大 tables 的精确测试在计算上 极其 困难,因为它们本质上必须对所有可能的 tables 集合进行计算边际价值。)
我没有任何绝妙的想法来检测会导致此问题的确切条件(也许您可以根据 table 的维度和计数的总和想出一个粗略的规则在 table 中,例如 if (prod(dim(d)) > 30 && sum(d) > 200)
... ?)
设置simulate.p.value=TRUE
是最明智的做法。但是,如果您期望极端 tables 的精确结果(例如,您从事生物信息学工作并且打算对结果应用巨大的 multiple-comparisons 校正),您将会失望。例如:
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)
永远不会 return 小于 1/(B+1)
的值(如果模拟的 none 会发生这种情况table 比观察到的 table 更极端:从技术上讲,p-value 应该报告为“<= 9.999e-05”)。因此,你永远(在宇宙的生命周期中)能够计算出像 1e-59 这样的 p-value,你只能根据你愿意做的大小来设置一个界限 B
.
如标题所述,fisher.test
R 崩溃并出现 *** caught segfault ***
错误。这是产生错误的代码:
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
的 table 行为不当,但我想这种事情不应该发生。
对于意外事件 table 应满足哪些条件以避免因 fisher.test
不当行为导致此类崩溃的任何建议,我将不胜感激。为了避免崩溃,还应该在 fisher.test
中设置哪些其他参数,我做了一些测试,其中
fisher.test(d,simulate.p.value=TRUE)
不会崩溃并产生结果。
我提出这个要求是因为我必须实施它以避免未来我的管道崩溃。
我可以确认这是 R 4.2 中的错误,现在已在 R 的开发分支中修复(5 月 7 日 this commit)。如果它很快被移植到 patch-release,我不会感到惊讶,但这对 R 开发人员来说是 unknown/up。 运行 您上面的示例不再出现段错误,但它确实会引发错误:
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()
处理这些错误),但如果你真的想执行 exact Fisher 对这些数据进行检验。 (对具有大条目的大 tables 的精确测试在计算上 极其 困难,因为它们本质上必须对所有可能的 tables 集合进行计算边际价值。)
我没有任何绝妙的想法来检测会导致此问题的确切条件(也许您可以根据 table 的维度和计数的总和想出一个粗略的规则在 table 中,例如 if (prod(dim(d)) > 30 && sum(d) > 200)
... ?)
设置simulate.p.value=TRUE
是最明智的做法。但是,如果您期望极端 tables 的精确结果(例如,您从事生物信息学工作并且打算对结果应用巨大的 multiple-comparisons 校正),您将会失望。例如:
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)
永远不会 return 小于 1/(B+1)
的值(如果模拟的 none 会发生这种情况table 比观察到的 table 更极端:从技术上讲,p-value 应该报告为“<= 9.999e-05”)。因此,你永远(在宇宙的生命周期中)能够计算出像 1e-59 这样的 p-value,你只能根据你愿意做的大小来设置一个界限 B
.