TL; DR: a lme4
otimização parece linear no número de parâmetros do modelo por padrão e é muito mais lenta que um glm
modelo equivalente com variáveis dummy para grupos. Existe algo que eu possa fazer para acelerar isso?
Estou tentando ajustar um modelo de logit hierárquico bastante grande (~ 50k linhas, 100 colunas, 50 grupos). Ajustar um modelo de logit normal aos dados (com variáveis fictícias para o grupo) funciona bem, mas o modelo hierárquico parece estar travando: a primeira fase de otimização é concluída com perfeição, mas a segunda passa por muitas iterações sem que nada mude e sem parar .
EDIT: Suspeito que o problema seja principalmente o fato de eu ter muitos parâmetros, porque quando tento definir maxfn
um valor menor, ele emite um aviso:
Warning message:
In commonArgs(par, fn, control, environment()) :
maxfun < 10 * length(par)^2 is not recommended.
No entanto, as estimativas de parâmetros não estão mudando no decorrer da otimização, então ainda estou confuso sobre o que fazer. Quando tentei definir maxfn
os controles do otimizador (apesar do aviso), ele pareceu travar após concluir a otimização.
Aqui está um código que reproduz o problema para dados aleatórios:
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)
Isso gera:
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>
Tentei definir ncol
outros valores e parece que o número de iterações feitas é (aproximadamente) 40 por coluna. Obviamente, isso se torna uma dor enorme à medida que adiciono mais colunas. Existem ajustes que posso fazer no algoritmo de otimização que reduzirá a dependência do número de colunas?
glmer
é bastante lento, especialmente para modelos que possuem uma estrutura complexa de efeitos aleatórios (por exemplo, muitas inclinações aleatórias, efeitos aleatórios cruzados etc.). Minha primeira sugestão seria tentar novamente com uma estrutura simplificada de efeitos aleatórios. No entanto, se você estiver enfrentando esse problema apenas com um modelo de interceptação aleatória, seu problema pode ser simplesmente o número de casos; nesse caso, você precisará tentar algumas ferramentas especializadas em big data.