TL; DR: l' lme4
optimisation semble être linéaire dans le nombre de paramètres du modèle par défaut, et est beaucoup plus lente qu'un glm
modèle équivalent avec des variables factices pour les groupes. Puis-je faire quelque chose pour l'accélérer?
J'essaie d'adapter un modèle logit hiérarchique assez grand (~ 50k lignes, 100 colonnes, 50 groupes). L'ajustement d'un modèle logit normal aux données (avec des variables factices pour le groupe) fonctionne bien, mais le modèle hiérarchique semble se coincer: la première phase d'optimisation se termine bien, mais la seconde passe par beaucoup d'itérations sans rien changer et sans s'arrêter .
EDIT: Je soupçonne que le problème est principalement dû au fait que j'ai beaucoup de paramètres, car lorsque j'essaie de définir maxfn
une valeur inférieure, cela donne un avertissement:
Warning message:
In commonArgs(par, fn, control, environment()) :
maxfun < 10 * length(par)^2 is not recommended.
Cependant, les estimations des paramètres ne changent pas du tout au cours de l'optimisation, donc je ne sais toujours pas quoi faire. Lorsque j'ai essayé de définir maxfn
les commandes de l'optimiseur (malgré l'avertissement), il semblait se bloquer après avoir terminé l'optimisation.
Voici un code qui reproduit le problème pour les données aléatoires:
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)
Cela produit:
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>
J'ai essayé de définir ncol
d'autres valeurs, et il semble que le nombre d'itérations effectuées soit (environ) 40 par colonne. Évidemment, cela devient une énorme douleur lorsque j'ajoute plus de colonnes. Y a-t-il des ajustements à apporter à l'algorithme d'optimisation qui réduiront la dépendance au nombre de colonnes?
la source
glmer
est assez lent, en particulier pour les modèles qui ont une structure complexe d'effets aléatoires (par exemple, de nombreuses pentes aléatoires, des effets aléatoires croisés, etc.). Ma première suggestion serait d'essayer à nouveau avec une structure d'effets aléatoires simplifiée. Cependant, si vous rencontrez ce problème avec un modèle d'interceptions aléatoires uniquement, votre problème peut simplement être le nombre de cas, auquel cas vous devrez essayer des outils spécialisés pour les mégadonnées.Réponses:
Vous pouvez essayer de changer l'optimiseur. Voir le commentaire de Ben Bolker dans ce numéro de github . L'implémentation nlopt de bobyqa est généralement beaucoup plus rapide que la valeur par défaut (au moins chaque fois que je l'essaye).
Consultez également cette réponse pour plus d'options et ce fil de discussion des modèles mixtes R-sig (qui semble plus pertinent pour votre problème).
Edit: Je vous ai donné des informations obsolètes liées à
nloptr
. Danslme4 1.1-7
et vers le haut,nloptr
est automatiquement importé (voir?nloptwrap
). Tout ce que vous avez à faire est d'ajouterà votre appel.
la source
PIRLS step-halvings failed to reduce deviance in pwrssUpdate
. Avez-vous une idée de ce qui pourrait se passer ici? Le message d'erreur n'est pas exactement transparent ...nloptr
bobyqa. Voici une interview de John C. Nash (co-auteur des packagesoptim
etoptimx
) où il fait une explication de haut niveau de l'optimisation. Si vous recherchezoptimx
ounloptr
sur CRAN, leurs manuels de référence respectifs vous en diront plus sur la syntaxe.nloptr
a également une vignette disponible, qui va un peu plus loin dans les détails.