加速 R 中的 lmer 函数

Speed up lmer function in R

我想分享我在尝试使用 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 在模型拟合时间上有很大的不同。

如有任何建议,我们将不胜感激。

lmer() 通过针对随机效应的协方差矩阵中的参数优化描述的对数似然或描述的 REML 标准来确定参数估计值。在您的示例中,将有 31 个这样的参数,对应于 31 个项中每个项的随机效应的标准差。这种规模的约束优化需要时间。

SAS PROC MIXED 可能具有特定的优化方法或具有更复杂的方法来确定起始估计值。 SAS 是一个闭源系统意味着我们不知道他们做了什么。

顺便说一句,您可以将随机效应写为 (1+Var1+Var2+...+Var30||Group)

我们在 R 包 Rfast 中实现了假设复合对称性的随机截距回归。命令是rint.reg。它比相应的 lme4 函数快 30 多倍。我不知道这是否有帮助,但以防万一。

https://cran.r-project.org/web/packages/Rfast/index.html

如果您使用 glmer 而不是 lmer,则有一个参数 nAGQ。我发现设置 nAGQ=0 大大减少了拟合一个相当复杂的模型所需的时间(13 个固定效应,一个具有不同截距和斜率的随机效应,300k 行)。这基本上告诉 glmer 使用不太精确的 GLMM 参数估计形式。有关详细信息,请参阅 ?glmer,或 this post。