[英]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.