【问题标题】:Speeding up wilcox.test in R在 R 中加速 wilcox.test
【发布时间】:2014-05-24 18:07:51
【问题描述】:

我目前正在尝试对多个数据集实施 Wilcoxon Ranksum 检验,这些数据集已组合成一个大矩阵 A,即 705x17635(即我想运行 ranksum 检验 17,635 次。我看到如何在不使用 for 循环的情况下做到这一点的唯一方法是 lapply,我的运行方式是:

> lapply(data.frame(A), function(x) 
         wilcox.test(x,b,alternative="greater",exact=FALSE,correct=FALSE))

其中b 是我们的阴性对照数据,是一个20000x1 向量。然而,运行它需要很长时间(我在 30 分钟后放弃了),我想知道是否有更快的方法来运行它,特别是因为我可以在 MATLAB 中执行相同的过程(即使使用 forloop)大约五分钟,但由于各种原因我需要使用 R。

【问题讨论】:

  • 您可以将其替换为lappply(data.frame(A), wilcox.test, b, alternative="greater", exact=FALSE, correct=FALSE)——换句话说,您可以通过function省略绕行。
  • WRS 测试基本上比 t.tests 更复杂。您正在比较成对值,并在一侧使用 20,000 个值向量进行成对比较....大量的 CPU 周期。您可能需要重新考虑您的分析策略。关于相当大的控制组和小得多(但数量众多)的测试组之间的差异,您真正想知道什么?您是否只想知道他们的中位数是否不同,或者他们的第 75、90 和 95 个百分位数是否与对照组有很大不同?
  • (1) 看看你是否可以修改wilcox.test 以获得一个精简版本,省略一些输入检查(可能没有太大帮助); (2) 并行化以使用多个 CPU/内核(例如,使用 plyr::llply 并将 .parallel 设置为合理的值)
  • 试试mclapply而不是lapply?包parallel。它仅适用于 Linux 系统。

标签: r performance matrix statistics hypothesis-test


【解决方案1】:

有一些软件包试图解决这个问题。即:

A <- matrix(rnorm(705*17635), nrow=705)
b <- rnorm(20000)

library(matrixTests)
res <- col_wilcoxon_twosample(A, b) # running time: 83 seconds

结果中的几行:

res[1:2,]

  obs.x obs.y obs.tot statistic    pvalue alternative location.null exact corrected
1   705 20000   20705   6985574 0.6795783   two.sided             0 FALSE      TRUE
2   705 20000   20705   7030340 0.8997009   two.sided             0 FALSE      TRUE

逐列检查结果是否与wilcox.test() 相同:

wilcox.test(A[,1], b)

    Wilcoxon rank sum test with continuity correction

data:  A[, 1] and b
W = 6985574, p-value = 0.6796
alternative hypothesis: true location shift is not equal to 0

【讨论】:

  • matrixTests 确实更快,只是不计算置信区间很可惜。
  • @Jariani 我有一个关于这个here 的未解决问题,但没有达到尝试实施它的地步。如果默认返回它会减慢速度 + 我认为很少有人关心伪中值的置信区间。
猜你喜欢
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
相关资源
最近更新 更多