R中的快速ANOVA计算

时间:2015-05-28 09:06:57

标签: r anova sapply mclapply

我有一个包含以下尺寸的数据框:

dim(b)  
[1]    974 433685

列表示我想要运行ANOVA的变量(即,我想运行433,685个ANOVA)。样本大小为974.最后一列是'group'变量。

我提出了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 

方法2(基于'并行'包中的'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 

方法3(基于'cbind'-ing the LHS):

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内存的Linux集群。

有没有办法更快地计算?

1 个答案:

答案 0 :(得分:2)

为了使用相同的design matrix同时拟合许多一般线性模型(例如ANOVA),Bioconductor/R limma package提供了非常快的lmFit()函数。这是使用limma拟合ANOVA模型的方法:

{{1}}

在我的笔记本电脑上,它的完成时间为0.4 - 0.45秒,与您问题中的数据尺寸相同。