我有一个具有以下维度的数据框:
dim(b)
[1] 974 433685
这些列代表我想在上面运行方差分析的变量(即,我想运行433,685个方差分析)。样本大小为974。最后一列是“组”变量。
我想出了3种不同的方法,但由于测试数量太多,它们都太慢了。
首先,让我们生成一个小的练习数据集来玩:
dat = as.data.frame(matrix(runif(10000*500), ncol = 10000, nrow = 500))
dat$group = rep(letters[1:10], 5000)
方法1(基于'sapply'):
system.time(sapply(dat[,-length(dat)], function(x) aov(x~group, data=dat) ))
user system elapsed
143.76 0.33 151.79
方法二(基于“parallel”包中的“mclapply”):
library(parallel)
options(mc.cores=3)
system.time(mclapply(dat[,-length(dat)], function(x) aov(x~group, data=dat) ))
user system elapsed
141.76 0.21 142.58
第三种方法(基于 'cbind' 绑定左侧):
formula = as.formula( paste0("cbind(", paste(names(dat)[-length(dat)],collapse=","), ")~group") )
system.time(aov(formula, data=dat))
user system elapsed
10.00 0.22 10.25
在实践数据集中,方法3是明显的赢家。然而,当我在我的实际数据上执行此操作时,仅使用方法3计算10个(共433,685个)列需要这么长时间:
user system elapsed
119.028 5.430 124.414
我不确定为什么在我的实际数据上需要更长时间。我可以访问一个拥有16个核心和72GB RAM的Linux集群。
有没有任何方法可以更快地计算这个问题?