TL; DR: l' lme4
ottimizzazione sembra essere lineare nel numero di parametri del modello per impostazione predefinita ed è molto più lenta di un glm
modello equivalente con variabili fittizie per gruppi. C'è qualcosa che posso fare per accelerarlo?
Sto cercando di adattare un modello logit gerarchico abbastanza grande (~ 50k righe, 100 colonne, 50 gruppi). Adattare un modello logit normale ai dati (con variabili fittizie per gruppo) funziona bene, ma il modello gerarchico sembra bloccarsi: la prima fase di ottimizzazione si completa bene, ma la seconda attraversa molte iterazioni senza cambiare nulla e senza fermarsi .
EDIT: sospetto che il problema sia principalmente che ho così tanti parametri, perché quando provo a impostare maxfn
un valore inferiore dà un avvertimento:
Warning message:
In commonArgs(par, fn, control, environment()) :
maxfun < 10 * length(par)^2 is not recommended.
Tuttavia, le stime dei parametri non cambiano affatto nel corso dell'ottimizzazione, quindi sono ancora confuso su cosa fare. Quando ho provato a impostare maxfn
i controlli dell'ottimizzatore (nonostante l'avvertimento), mi è sembrato che si bloccasse dopo aver terminato l'ottimizzazione.
Ecco del codice che riproduce il problema per i dati casuali:
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)
Questo produce:
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>
Ho provato a impostare ncol
altri valori e sembra che il numero di iterazioni effettuate sia (circa) 40 per colonna. Ovviamente, questo diventa un grande dolore quando aggiungo più colonne. Ci sono modifiche che posso apportare all'algoritmo di ottimizzazione che ridurrà la dipendenza dal numero di colonne?
glmer
è piuttosto lento, specialmente per i modelli che hanno una struttura complessa di effetti casuali (ad es. Molte pendenze casuali, effetti casuali incrociati, ecc.). Il mio primo suggerimento sarebbe di riprovare con una struttura di effetti casuali semplificata. Tuttavia, se stai riscontrando questo problema solo con un modello di intercettazione casuale, il tuo problema potrebbe essere semplicemente il numero di casi, nel qual caso dovrai provare alcuni strumenti specializzati per i big data.