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?
quelle
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.Antworten:
Sie können versuchen, das Optimierungsprogramm zu ändern. Siehe Ben Bolkers Kommentar zu dieser Github-Ausgabe . Die nlopt-Implementierung von bobyqa ist normalerweise viel schneller als die Standardimplementierung (zumindest, wenn ich es versuche).
In dieser Antwort finden Sie auch weitere Optionen und diesen Thread von R-sig-mixed-models (der für Ihr Problem relevanter aussieht).
Bearbeiten: Ich gab Ihnen einige veraltete Informationen im Zusammenhang mit
nloptr
. Inlme4 1.1-7
und upnloptr
wird automatisch importiert (siehe?nloptwrap
). Alles was Sie tun müssen, ist hinzuzufügenzu Ihrem Anruf.
quelle
PIRLS step-halvings failed to reduce deviance in pwrssUpdate
. Haben Sie eine Idee, was hier los sein könnte? Die Fehlermeldung ist nicht gerade transparent ...nloptr
Bobyqa. Hier ist ein Interview mit John C. Nash (Co-Autor deroptim
undoptimx
-Pakete), in dem er eine allgemeine Erklärung zur Optimierung gibt. Wenn Sie nachschlagenoptimx
odernloptr
CRAN verwenden, erfahren Sie in den entsprechenden Referenzhandbüchern mehr über die Syntax.nloptr
Es gibt auch eine Vignette, die etwas detaillierter ist.