【问题标题】:R - doParallel does not work with Student and Fisher testsR - doParallel 不适用于 Student 和 Fisher 测试
【发布时间】:2018-05-18 02:41:12
【问题描述】:

所以当我必须处理大量元素以更快地计算它时,我使用 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-bit (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

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

【问题讨论】:

  • 如果您向reproducible example 提供示例输入数据和我们可以复制/粘贴以运行的代码,则更容易为您提供帮助。目前尚不清楚您正在尝试什么或错误/问题到底是什么。
  • 您可以生成 2 个随机数值矩阵(我的意思是像 1.2、2.5、...这样的点)唯一“特殊”的是两个矩阵具有相同的行数,并且只有4列(所以每行4个值)我目前无法轻松复制我的矩阵对不起......我正在做的是逐行迭代,比较2个矩阵A和B的值。示例:第1行:var.test( matrixA[1,],matrixB[1,])$p.value 第 2 行: var.test(matrixA[2,],matrixB[2,])$p.value [...] 我只保留 p - 每个结果的值将其添加到我的 p.values.res 列表中。

标签: r foreach parallel-processing doparallel statistical-test


【解决方案1】:

不幸的是,我没有找到解决 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 测试提供一种速度高效的解决方案。如果有人知道与这些功能类似的功能,请发表评论。

【讨论】:

    【解决方案2】:

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

    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)
    

    【讨论】:

    • 我会尽快解决您的问题。问题可能是我没有像你在我的测试中那样设置集群的数量。我会和你保持联系。
    • 对不起。我试过了,它也不起作用:几秒钟后,一切都在 1 个 CPU 上进行。这个问题可能来自哪里的任何想法?就我而言,这只发生在费希尔和学生测试中。 foreach() 与我以前在我的经验中使用的所有其他函数完美配合,除了这些......
    • everything goes on 1 CPU 是什么意思?
    • 对不起,一切都在一个核心上。
    • 它不会并行化我正在运行的内容。
    猜你喜欢
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    相关资源
    最近更新 更多