TL; DR: la lme4
optimización parece ser lineal en la cantidad de parámetros del modelo por defecto, y es mucho más lenta que un glm
modelo equivalente con variables ficticias para grupos. ¿Hay algo que pueda hacer para acelerarlo?
Estoy tratando de ajustar un modelo logit jerárquico bastante grande (~ 50k filas, 100 columnas, 50 grupos). El ajuste de un modelo logit normal a los datos (con variables ficticias para el grupo) funciona bien, pero el modelo jerárquico parece estar estancado: la primera fase de optimización se completa bien, pero la segunda pasa por muchas iteraciones sin que nada cambie y sin detenerse .
EDITAR: sospecho que el problema es principalmente porque tengo tantos parámetros, porque cuando trato de establecer maxfn
un valor más bajo, me da una advertencia:
Warning message:
In commonArgs(par, fn, control, environment()) :
maxfun < 10 * length(par)^2 is not recommended.
Sin embargo, las estimaciones de los parámetros no cambian en absoluto a lo largo de la optimización, por lo que todavía estoy confundido sobre qué hacer. Cuando intenté configurar maxfn
los controles del optimizador (a pesar de la advertencia), pareció bloquearse después de finalizar la optimización.
Aquí hay un código que reproduce el problema de los datos aleatorios:
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)
Esto produce:
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>
Intenté establecer ncol
otros valores, y parece que el número de iteraciones realizadas es (aproximadamente) 40 por columna. Obviamente, esto se convierte en un gran dolor a medida que agrego más columnas. ¿Hay ajustes que pueda hacer al algoritmo de optimización que reducirán la dependencia en el número de columnas?
fuente
glmer
es bastante lento, especialmente para modelos que tienen una estructura compleja de efectos aleatorios (por ejemplo, muchas pendientes aleatorias, efectos aleatorios cruzados, etc.). Mi primera sugerencia sería intentar nuevamente con una estructura simplificada de efectos aleatorios. Sin embargo, si está experimentando este problema solo con un modelo de intercepciones aleatorias, su problema puede ser simplemente el número de casos, en cuyo caso deberá probar algunas herramientas especializadas para big data.Respuestas:
Una cosa que puedes probar es cambiar el optimizador. Vea el comentario de Ben Bolker en este tema de github . La implementación nlopt de bobyqa suele ser mucho más rápida que la predeterminada (al menos cada vez que lo intento).
Además, consulte esta respuesta para obtener más opciones y este hilo de R-sig-mixed-models (que parece más relevante para su problema).
Editar: te di información desactualizada relacionada con
nloptr
. Enlme4 1.1-7
y hacia arriba,nloptr
se importa automáticamente (ver?nloptwrap
). Todo lo que tienes que hacer es agregara su llamada
fuente
PIRLS step-halvings failed to reduce deviance in pwrssUpdate
. ¿Tienes alguna idea de lo que podría estar pasando aquí? El mensaje de error no es exactamente transparente ...nloptr
bobyqa. Aquí hay una entrevista con John C. Nash (coautor de los paquetesoptim
yoptimx
) donde hace una explicación de alto nivel de optimización. Si buscaoptimx
onloptr
utiliza CRAN, sus respectivos manuales de referencia le darán más información sobre la sintaxis.nloptr
También tiene una viñeta disponible, que va un poco más en detalle.