TL; DR:lme4
优化似乎是线性在默认情况下,模型参数数量,并且是这样慢比等效的glm
与组虚拟变量模型。我有什么可以加快速度的吗?
我正在尝试适应一个相当大的分层logit模型(约5万行,100列,50组)。将正常的logit模型拟合到数据(带有用于组的虚拟变量)可以很好地工作,但是层次模型似乎被卡住了:第一个优化阶段可以很好地完成,但是第二个阶段需要进行很多迭代,而无需进行任何更改并且不停止。
编辑:我怀疑问题主要是我有这么多的参数,因为当我尝试将其设置maxfn
为较低的值时会给出警告:
Warning message:
In commonArgs(par, fn, control, environment()) :
maxfun < 10 * length(par)^2 is not recommended.
但是,参数估计在优化过程中完全没有改变,因此我仍然对执行该操作感到困惑。当我尝试设置maxfn
优化器控件(尽管有警告)时,它似乎在完成优化后挂起。
这是一些重现随机数据问题的代码:
library(lme4)
set.seed(1)
SIZE <- 50000
NGRP <- 50
NCOL <- 100
test.case <- data.frame(i=1:SIZE)
test.case[["grouping"]] <- sample(NGRP, size=SIZE, replace=TRUE, prob=1/(1:NGRP))
test.case[["y"]] <- sample(c(0, 1), size=SIZE, replace=TRUE, prob=c(0.05, 0.95))
test.formula = y ~ (1 | grouping)
for (i in 1:NCOL) {
colname <- paste("col", i, sep="")
test.case[[colname]] <- runif(SIZE)
test.formula <- update.formula(test.formula, as.formula(paste(". ~ . +", colname)))
}
print(test.formula)
test.model <- glmer(test.formula, data=test.case, family='binomial', verbose=TRUE)
输出:
start par. = 1 fn = 19900.78
At return
eval: 15 fn: 19769.402 par: 0.00000
(NM) 20: f = 19769.4 at 0 <other numbers>
(NM) 40: f = 19769.4 at 0 <other numbers>
我尝试将其设置ncol
为其他值,但似乎完成的迭代次数是每列40次(大约)。显然,随着我添加更多列,这变得非常痛苦。我是否可以对优化算法进行调整,以减少对列数的依赖?
1
了解您要拟合的特定模型(特别是随机效应结构)会很有帮助。
—
帕特里克·福舍尔
不幸的是,精确模型是专有的。有一个级别的随机效应,组的大小在〜100到5000之间。请告知我是否可以提供有关模型的任何其他相关信息。
—
本·库恩
好的,我添加了一些重现此问题的代码。
—
本·库恩
我没有完整的答案,所以我将其留为评论。以我的经验,
—
Patrick S. Forscher
glmer
速度相当慢,尤其是对于具有复杂随机效应结构(例如,许多随机斜率,交叉随机效应等)的模型而言。我的第一个建议是尝试使用简化的随机效果结构。但是,如果仅使用随机截距模型遇到此问题,则问题可能仅是案例数,在这种情况下,您需要尝试一些专门用于大数据的工具。
它有2个组而不是50个组的相同问题。另外,使用较少的列数进行测试,似乎迭代次数在列数中大致是线性的……是否有优化方法在这里会更好?
—
本·库恩