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?
fonte
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.Respostas:
Uma coisa que você pode tentar é mudar o otimizador. Veja o comentário de Ben Bolker nesta edição do github . A implementação nlopt do bobyqa geralmente é muito mais rápida que o padrão (pelo menos sempre que eu tento).
Além disso, consulte esta resposta para obter mais opções e este tópico de R-sig-mixed-models (que parece mais relevante para o seu problema).
Editar: forneci algumas informações desatualizadas relacionadas a
nloptr
. Paralme4 1.1-7
cima e para cima,nloptr
é importado automaticamente (consulte?nloptwrap
). Tudo o que você precisa fazer é adicionarà sua ligação.
fonte
PIRLS step-halvings failed to reduce deviance in pwrssUpdate
. Você tem alguma ideia do que pode estar acontecendo aqui? A mensagem de erro não é exatamente transparente ...nloptr
bobyqa. Aqui está uma entrevista com John C. Nash (co-autor dos pacotesoptim
eoptimx
), onde ele faz uma explicação de alto nível sobre otimização. Se você olhar para cimaoptimx
ounloptr
em CRAN, seus respectivos manuais de referência vai lhe dizer mais sobre a sintaxe.nloptr
também possui uma vinheta disponível, que detalha um pouco mais.