TL; DR: Die lme4
Optimierung scheint standardmäßig in Bezug auf die Anzahl der Modellparameter linear zu sein und ist viel langsamer als ein äquivalentes glm
Modell mit Dummy-Variablen für Gruppen. Kann ich irgendetwas tun, um es zu beschleunigen?
Ich versuche, ein ziemlich großes hierarchisches Logit-Modell (~ 50.000 Zeilen, 100 Spalten, 50 Gruppen) anzupassen. Das Anpassen eines normalen Logit-Modells an die Daten (mit Dummy-Variablen für die Gruppe) funktioniert einwandfrei, aber das hierarchische Modell scheint hängen zu bleiben: Die erste Optimierungsphase wird einwandfrei abgeschlossen, während die zweite viele Iterationen durchläuft, ohne dass sich etwas ändert und ohne anzuhalten .
EDIT: Ich vermute, dass das Problem hauptsächlich darin besteht, dass ich so viele Parameter habe, denn wenn ich versuche maxfn
, einen niedrigeren Wert einzustellen , wird eine Warnung ausgegeben:
Warning message:
In commonArgs(par, fn, control, environment()) :
maxfun < 10 * length(par)^2 is not recommended.
Die Parameterschätzungen ändern sich jedoch im Verlauf der Optimierung überhaupt nicht, sodass ich immer noch verwirrt bin, was zu tun ist. Als ich versuchte, maxfn
die Steuerelemente des Optimierers einzustellen (trotz der Warnung), schien es nach Abschluss der Optimierung zu hängen.
Hier ist ein Code, der das Problem für zufällige Daten reproduziert:
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)
Dies gibt aus:
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>
Ich habe versucht ncol
, andere Werte festzulegen, und es scheint, dass die Anzahl der durchgeführten Iterationen (ungefähr) 40 pro Spalte beträgt. Offensichtlich wird dies ein großer Schmerz, wenn ich mehr Spalten hinzufüge. Gibt es Optimierungen am Optimierungsalgorithmus, die die Abhängigkeit von der Anzahl der Spalten verringern?
glmer
ist es ziemlich langsam, insbesondere für Modelle, die eine komplexe zufällige Effektstruktur aufweisen (z. B. viele zufällige Steigungen, gekreuzte zufällige Effekte usw.). Mein erster Vorschlag wäre, es noch einmal mit einer vereinfachten Zufallseffektstruktur zu versuchen. Wenn dieses Problem jedoch nur bei einem zufälligen Abfangmodell auftritt, liegt das Problem möglicherweise in der Anzahl der Fälle. In diesem Fall müssen Sie einige Tools ausprobieren, die auf Big Data spezialisiert sind.