0

因此,当我必须处理大量元素以更快地计算它时,我正在使用 R 包 doParallel 来并行化我的脚本的一些步骤。因为这一次,到目前为止我使用的所有函数都与 foreach() 完美配合:我只需要使用 registerDoParallel() 指定我的核心数量,仅此而已!

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

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

对于第 1 行,从对 10 个数值(每个矩阵的第 1 行中的 2 组 5 个值)进行的 Fisher 检验中提取相应的 p.value。问题是我的矩阵有数百万行,所以我必须遍历行数,我用 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()),不幸的是,它们都没有在我的 6 个内核上工作,只有一个。

我也尝试了“cl”: registerDoParallel(cl = 4) 它也不起作用。

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

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

我的配置:Linux Mint 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

预先感谢大家的帮助。问候,

4

2 回答 2

1

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

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)
于 2017-12-04T16:56:19.747 回答
0

不幸的是,我没有找到解决 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检验,有一个函数rowFtests()。

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

于 2017-12-06T13:56:45.170 回答