如卡尔·威特福特所指出的那样,R中的标准并行化工具使用共享内存模型,因此它们会使情况变得更糟(它们的主要目的是通过使用多个处理器加速计算密集型作业)。
在短期内,您可以通过将分类固定效应预测器(`age`,`atc`)视为随机效应,但强制它们的方差很大来节省一些内存。我不知道这是否足以拯救您;它将大大压缩固定效应模型矩阵,但模型框架仍将与模型对象一起存储/复制...
dd1 <- read.table(header=TRUE,
text="lho sex tc age atc patient
18 M 16.61 45-54 H 628143
7 F 10.52 12-15 G 2013855
30 M 92.73 35-44 N 2657693
19 M 24.92 70-74 G 2420965
12 F 17.44 65-69 A 2833610
31 F 7.03 75_and_over A 1090322
3 F 28.59 70-74 A 2718649
29 F 4.09 75_and_over C 384578
16 F 67.22 65-69 R 1579355
23 F 7.7 70-74 C 896374")
n <- 1e5
set.seed(101)
dd2 <- with(dd1,
data.frame(tc=rnorm(n,mean=mean(tc),sd=sd(tc)),
lho=round(runif(n,min=min(lho),max=max(lho))),
sex=sample(levels(sex),size=n,replace=TRUE),
age=sample(levels(age),size=n,replace=TRUE),
atc=sample(levels(atc),size=n,replace=TRUE),
patient=sample(1:1000,size=n,replace=TRUE)))
library("lme4")
m1 <- lmer(tc~sex+(1|lho)+(1|age)+(1|atc)+(1|patient),
data=dd2,REML=TRUE)
随机效应会自动按照水平数量从大到小排序。根据 ?modular
帮助页面中的描述,进行如下操作:
lmod <- lFormula(tc~sex+(1|lho)+(1|age)+(1|atc)+(1|patient),
data=dd2,REML=TRUE)
names(lmod$reTrms$cnms)
devfun <- do.call(mkLmerDevfun, lmod)
wrapfun <- function(tt,bigsd=1000) {
devfun(c(tt,rep(bigsd,3)))
}
wrapfun(1)
opt <- optim(fn=wrapfun,par=1,method="Brent",lower=0,upper=1000)
opt$fval <- opt$value
res <- mkMerMod(environment(devfun), opt, lmod$reTrms, fr=lmod$fr)
res
您可以忽略分类项的报告差异,使用
ranef()
来恢复它们(未收缩)的估计值。
从长远来看,解决这个问题的正确方法可能是使用分布式内存模型并行化。换句话说,您需要将数据分成不同的块分配到不同的服务器上;使用
?modular
中描述的机制设置一个似然函数(实际上是一个REML准则函数),该函数将给出作为参数的子集的REML准则函数;然后运行一个中央优化器,通过将一组参数提交给每个服务器、检索每个服务器的值并相加来评估REML准则函数。我看到实现这个有两个问题:(1)我实际上不知道如何在R中实现分布式内存计算(基于
这份介绍文档,似乎
Rmpi/
doMPI包可能是正确的选择);(2)在默认情况下,
lmer
的实现方式是剖析掉固定效应参数,而不是显式地将其作为参数向量的一部分。
MixedModels
包/库来进行Julia编程? - Ben Bolkeratc
级别?此外,你已经检查过你的数字变量在R中是否是“numeric”吗?无论如何,并行化不会解决内存问题。相反,由于每个CPU都需要RAM来完成其任务,因此并行化会加剧问题。 - Roland