簡體   English   中英

R中的快速ANOVA計算

[英]Fast ANOVA computation in R

我有一個具有以下尺寸的數據框:

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(基於'結合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集群。

有沒有辦法更快地計算?

為了使用相同的設計矩陣同時擬合許多一般線性模型(例如ANOVA), Bioconductor / R limma包提供了非常快的lmFit()函數。 這是如何使用limma擬合ANOVA模型:

library(limma)

# generate some data 
# (same dimensions as in your question)
nrows <- 1e4
ncols <- 5e2
nlevels <- 10
dat <- matrix(
  runif(nrows * ncols), 
  nrow = nrows, 
  ncol = ncols
)
group <- factor(rep(
  letters[1:nlevels], 
  ncols / nlevels
))

# construct the design matrix
# (same as implicitly used in your question)
dmat <- model.matrix(~ group)
# fit the ANOVA model
fit <- lmFit(dat, dmat)

在我的筆記本電腦上,它在0.4到0.45秒內完成,與您問題中的數據尺寸相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM