【发布时间】: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