TL; DR: lme4
optymalizacja wydaje się domyślnie liniowa pod względem liczby parametrów modelu i jest znacznie wolniejsza niż równoważny glm
model ze zmiennymi fikcyjnymi dla grup. Czy mogę coś przyspieszyć?
Próbuję dopasować dość duży hierarchiczny model logit (~ 50 000 wierszy, 100 kolumn, 50 grup). Dopasowywanie normalnego modelu logu do danych (ze zmiennymi fikcyjnymi dla grupy) działa dobrze, ale wydaje się, że model hierarchiczny utknął: pierwsza faza optymalizacji kończy się dobrze, ale druga przechodzi wiele iteracji bez zmiany i bez zatrzymywania .
EDYCJA: Podejrzewam, że problem polega głównie na tym, że mam tak wiele parametrów, ponieważ gdy próbuję ustawić maxfn
niższą wartość, pojawia się ostrzeżenie:
Warning message:
In commonArgs(par, fn, control, environment()) :
maxfun < 10 * length(par)^2 is not recommended.
Jednak szacunki parametrów wcale się nie zmieniają w trakcie optymalizacji, więc nadal nie jestem pewien, co robić. Kiedy próbowałem ustawić maxfn
elementy sterujące optymalizatora (pomimo ostrzeżenia), wydawało się, że zawiesiło się ono po zakończeniu optymalizacji.
Oto kod, który odtwarza problem losowych danych:
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)
To daje:
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>
Próbowałem ustawić ncol
inne wartości i wydaje się, że liczba wykonanych iteracji wynosi (około) 40 na kolumnę. Oczywiście staje się to ogromnym bólem, gdy dodam więcej kolumn. Czy mogę ulepszyć algorytm optymalizacji, który zmniejszy zależność od liczby kolumn?
źródło
glmer
wynika , że jest dość wolny, szczególnie w przypadku modeli, które mają złożoną strukturę efektów losowych (np. Wiele losowych nachyleń, skrzyżowane efekty losowe itp.). Moją pierwszą sugestią byłoby spróbować ponownie z uproszczoną strukturą efektów losowych. Jeśli jednak występuje ten problem tylko z przypadkowym modelem przechwytywania, problemem może być po prostu liczba przypadków, w którym to przypadku należy wypróbować narzędzia wyspecjalizowane dla dużych zbiorów danych.Odpowiedzi:
Jedną z rzeczy, których możesz spróbować, jest zmiana optymalizatora. Zobacz komentarz Bena Bolkera w tym numerze github . Implementacja nlopt bobyqa jest zwykle znacznie szybsza niż domyślna (przynajmniej za każdym razem, gdy próbuję).
Zobacz także tę odpowiedź, aby uzyskać więcej opcji i ten wątek z modeli R-sig-mixed-models (który wydaje się bardziej odpowiedni dla Twojego problemu).
Edycja: Dałem ci trochę nieaktualnych informacji związanych z
nloptr
. Wlme4 1.1-7
górę i w góręnloptr
jest automatycznie importowany (patrz?nloptwrap
). Wszystko, co musisz zrobić, to dodaćna twój telefon.
źródło
PIRLS step-halvings failed to reduce deviance in pwrssUpdate
. Czy masz pojęcie, co się tutaj dzieje? Komunikat o błędzie nie jest dokładnie przezroczysty ...nloptr
bobyqa. Oto wywiad z Johnem C. Nashem (współautorem pakietówoptim
ioptimx
), w którym wyjaśnia on na wysokim poziomie optymalizację. Jeśli spojrzysz w góręoptimx
lubnloptr
na CRAN, ich odpowiednie podręczniki zawierają więcej informacji na temat składni.nloptr
dostępna jest również winieta, która jest nieco bardziej szczegółowa.