R - doParallel 不适用于 Student 和 Fisher 测试

R - doParallel does not work with Student and Fisher tests

因此,当我必须处理大量元素以更快地计算它时,我使用 R 包 doParallel 并行化脚本的某些步骤。 从那时起,到目前为止我使用的所有功能都与 foreach() 完美配合:我只需要用 registerDoParallel() 指定我的核心数量就可以了!

我最近尝试使用 var.test() 和 t.test() 在 R 中使用不同的统计测试,我不明白为什么,但我意识到在 foreach() 中使用它不是'没工作... 因此,为了更清楚,我基本上做的是迭代 2 个相同维度的矩阵行:每个矩阵中的每一行包含 5 个数值,例如:

var.test(matrixA[1,],matrixB[1,])$p.value

为第 1 行提取对应的 p.value 来自对 10 个数值(每个矩阵的第 1 行中的 2 组 5 个值)进行的 Fisher 检验。 问题是我的矩阵有数百万行,所以我必须遍历行数,我用 foreach() 函数来做到这一点:

p.values.res<-foreach(i=seq(dim(matrixA)[1])) %dopar%
  var.test(matrixA[i,],matrixB[i,])$p.value

(这里我在 foreach() 之前设置了 registerDoParallel(cores = 6))。 我尝试了不同的测试:fisher 测试和学生测试 (t.test()),不幸的是 none 他们在我的 6 个核心上工作,只有一个。

我也试过 "cl": registerDoParallel(cl = 4) 也不行。

我尝试重新启动 R,退出并重新打开会话,重新启动计算机:不起作用。

有谁知道为什么它不起作用,以及如何解决这个问题?

我的配置:LinuxMint 18.2 Cinnamon 64 位 (3.4.6);英特尔酷睿 I7-6700 CPU; R 版本 3.4.3 (2017-11-30); RStudio 版本 1.1.383 2009-2017.

这里有 2 个简短的矩阵示例

矩阵A:

0.7111111  0.7719298  0.7027027   0.6875000  0.6857143
0.8292683  0.6904762  0.8222222   0.8333333  0.6250000
0.8846154  0.5714286  0.8928571   0.8846154  0.9259259
0.9000000  0.5000000  0.9500000   0.8666667  0.8260870
0.8235294  0.3684211  0.9411765   0.8333333  0.8000000
0.5714286  0.2142857  0.6666667   0.5000000  0.5555556

矩阵B:

0.5227273  0.7142857  0.7808219   0.6346154  0.7362637
0.9166667  0.7173913  0.8611111   0.7391304  0.7538462
0.8666667  0.6052632  0.8260870   0.7333333  0.9024390
0.9285714  0.5806452  0.8750000   0.6956522  0.8787879
0.8333333  0.5517241  0.8333333   0.6818182  0.8750000
0.7500000  0.2941176  0.6666667   0.4444444  0.7500000

提前感谢大家的帮助。 问候,

我无法重现你的问题。这对我来说很好用:

matrixA <- matrix(runif(36), 6)
matrixB <- matrix(runif(36), 6)

cl <- parallel::makeCluster(4)
doParallel::registerDoParallel(cl)
library(foreach)
p.values.res<-foreach(i=seq(dim(matrixA)[1])) %dopar%
  var.test(matrixA[i,],matrixB[i,])$p.value
parallel::stopCluster(cl)

不幸的是,我没有找到任何解决 doParallel 问题的方法,但我意识到我一开始不必使用它。

从 R 包“genefilter”中,我找到了一个使用函数 rowttests() 的替代解决方案,该函数对于在大型矩阵上进行 t 检验非常快。 我对该函数的唯一评论是 它假定在计算 p 值时方差相等 (并且您不能更改它)。幸好我就是这种情况。

所以我只需要 cbind() 我的 2 矩阵,将所属组指定为列的因子。 这就是全部!

bind_matrix<-cbind(matrixA,matrixB)
fact<-factor(c("A","A","A","A","A","B","B","B","B","B"))
p.vals<-rowttests(bind_matrix,fact)$p.values

这需要几秒钟,我对 1000 万行矩阵进行了尝试。

解法同Fisher test,有个函数rowFtests()。

所以现在我可能会要求 Wilcoxon 测试的速度高效的解决方案。如果有人知道与这些功能类似的功能,请发表评论。