我想分享一下我在使用lme4
包改进R
中线性混合效应模型的模型拟合时间时的一些想法。
**数据集大小:**数据集大约由400.000行和32列组成。不幸的是,无法共享有关数据性质的信息。
**假设和检查:**假设响应变量来自正态分布。在模型拟合过程之前,使用相关性表和R中提供的alias
函数检验变量的共线性和多重共线性。
连续变量被缩放以帮助收敛。
**模型结构:**模型方程包含31个固定效应(包括截距)和30个随机效应(不包括截距)。随机效应针对具有2700个水平的特定因子变量进行随机化。协方差结构为方差分量,因为假设随机效应之间存在独立性。
模型方程示例:
lmer(Response ~ 1 + Var1 + Var2 + ... + Var30 + (Var1-1| Group) + (Var2-1| Group) + ... + (Var30-1| Group), data=data, REML=TRUE)
模型拟合成功,但需要约3.1小时才能提供结果。SAS中的相同模型需要几秒钟。网络上有关于如何通过使用非线性优化算法nloptwrap
并关闭在优化完成后执行的耗时导数计算来减少时间的可用文献calc.derivs = FALSE
:
https://cran.r-project.org/web/packages/lme4/vignettes/lmerperf.html
时间缩短了78%。
**问题:**是否有其他方法可以通过相应地定义lmer
参数输入来减少模型拟合时间?R和SAS在模型拟合时间方面有很大的差异。
任何建议都很感激。
3条答案
按热度按时间qhhrdooz1#
lmer()
通过针对随机效应协方差矩阵中的参数优化拟合对数似然或拟合REML标准来确定参数估计值。在您的示例中,将有31个这样的参数,对应于31项中每项的随机效应的标准差。这种规模的约束优化需要时间。SAS PROC MIXED可能有特定的优化方法或更复杂的方法来确定起始估计值。SAS是一个闭源系统意味着我们不知道他们做什么。
顺便说一下,你可以把随机效应写成
(1+Var1+Var2+...+Var30 || Group)
imzjd6km2#
我们在R包Rfast中实现了假设复合对称的随机截距回归。命令是rint.reg。它比相应的lme4函数快30倍以上。我不知道这是否有帮助,但以防万一。
https://cran.r-project.org/web/packages/Rfast/index.html
i34xakig3#
如果使用
glmer
而不是lmer
,则存在参数nAGQ
。我发现设置nAGQ=0
可以显著减少拟合一个相当复杂的模型(13个固定效应,一个具有不同截距和斜率的随机效应,300k行)所需的时间。这基本上告诉glmer
对GLMM使用不太精确的参数估计形式。更多详情请参见?glmer
或this帖子。