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?
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.