繁体   English   中英

使用apply(,2,)对大型数据集的列执行混合效果(lme())

[英]Use apply(,2,) to perform mixed effects(lme()) over columns of a huge dataset

我是新手,所以我无法确定这是愚蠢的。 基本上,我想在一个巨大的数据集中的所有连续变量之间进行成对混合效果模型。 显而易见的替代方法是简单的spearman相关性,但是我有我的理由,并且解释我为什么要使用混合效果模型可能花费太长时间。

数据看起来像这样:

0     X1507.07  XAB1524.33  XAB1624.21  XAB1808.09...(~4000 columns)
1       12         19           12         45
2       15         35           2          25
3       22         23           65         33
4       0          55           23         67
5       12         10           90         94
6       34         22           11         2
...
90      13         8            14         45

目标是所有列的成对模型。
这是脚本中有问题的部分:

for(i in 1:ncol(dat))
{
ni<-names(dat)[i]
pvalue <- apply(dat, 2, function(x)
    {
formula<-as.formula(paste(ni,"~", x," + Location",sep=""))
model<-do.call("lme", args = list(formula, random=~1|Subject, data=dat))    
summary(model)$tTable[2,5]
    })

错误:

invalid model formula in ExtractVars

对于那些感到困惑的人:我使用as.formula是因为如果您尝试:

model<-lme(X1507.07~x+Region,random=~1|Subject, data=dat)

错误:

Error in eval(expr, envir, enclos) : object 'x' not found

(“位置”和“主题”是数据帧数据中的因素)。 我只关心一个p值(我知道混合效果会引起争议)。 我试过在as.formula()中传递x as.matrix(x)和colnames(x),但似乎没有任何效果。 问题是:有人知道这是否可能吗? 如果我必须遍历〜10 ^ 7次,那么它就不值得花费时间(年),因此apply()是我能想到的唯一合理的选择。

我仍然认为这可能是愚蠢的,并且您可以通过手动计算矩型方法的答案来获得更快的解决方案,但是(除非我在某个地方犯了错误),这样做的时机并没有灾难性的我想可能是这样。

tl; dr如果没有遇到其他任何扩展问题,则整个过程大约需要3-4天。 lmer实际上较慢(虽然针对较大的问题设计为更快,但由于设置成本,处理单个小问题的时间实际上可能较慢)。 因为lme是一个重要问题,所以我认为循环实际上只占总计算成本的一小部分。

组成一些数据:

set.seed(101)
n <- 10
nobs <- 90
dat <- as.data.frame(matrix(rpois(nobs*n,20),nrow=nobs))
Subject <- rep(1:n,each=nobs/n)
Location <- runif(n)

nlme

library(nlme)
fun.lme <- function() {
    r <- numeric(n*(n-1)/2)
    k <- 1
    for (i in 2:n) {
        for (j in 1:(i-1)) {
            m <- lme(y~x+Location,random=~1|Subject,
                     data=data.frame(x=dat[,i],y=dat[,j],
                     Location,Subject))
            tt <- summary(m)$tTable[2,5]
            r[k] <- tt
            k <- k+1
        }
    }
    r
}
t1 <- system.time(r1 <- fun.lme())
detach("package:nlme")

(在使用lme4之前分离nlme是一个好主意)

fun.lmer <- function(...) {
    r <- numeric(n*(n-1)/2)
    k <- 1
    for (i in 2:n) {
        for (j in 1:(i-1)) {
            m <- lmer(y~x+Location+(1|Subject),
                     data=data.frame(x=dat[,i],y=dat[,j],
                     Location,Subject),...)
            tt <- coef(summary(m))[2,2]  
            r[k] <- tt
            k <- k+1
        }
    }
    r
}

使用稳定的lme4测试的时间:

library(lme4.0) ## 'stable' version (the same as you get by installing
                ## lme4 from CRAN
t2 <- system.time(r2 <- fun.lmer())
detach("package:lme4.0")

现在正在开发(r- lme4lme4 ,提供标准和非标准优化程序选择:

library(lme4)
t3 <- system.time(r3 <- fun.lmer())
t4 <- system.time(r4 <- fun.lmer(optim="bobyqa"))
detach("package:lme4")

检查时间:

tvals <- c(lme=t1["elapsed"],lme4.0=t2["elapsed"],
           lme4=t3["elapsed"],lme4_bobyqa=t4["elapsed"])

将我们花费的时间调整为完成工作所需的时间:

totsecs <- (3789*3788/2)*tvals/(n*(n-1)/2)
totdays <- totsecs/(60*60*24)

round(totdays,1)
##   lme.elapsed   lme4.0.elapsed   lme4.elapsed lme4_bobyqa.elapsed 
##           3.0              4.4            4.1                 3.8 

您不妨将t统计量用作p值进行比较; 据我所知,p值完全无关紧要,只是作为关联强度的指标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM