TL; DR: lme4
оптимизация кажется линейной по количеству параметров модели по умолчанию и намного медленнее, чем эквивалентная glm
модель с фиктивными переменными для групп. Что я могу сделать, чтобы ускорить это?
Я пытаюсь соответствовать довольно большой иерархической модели логита (~ 50 тыс. Строк, 100 столбцов, 50 групп). Подгонка нормальной модели логита к данным (с фиктивными переменными для группы) работает нормально, но иерархическая модель, похоже, застревает: первая фаза оптимизации завершается нормально, но вторая проходит много итераций без каких-либо изменений и без остановки ,
РЕДАКТИРОВАТЬ: я подозреваю, что проблема в основном в том, что у меня так много параметров, потому что, когда я пытаюсь установить maxfn
на более низкое значение, он выдает предупреждение:
Warning message:
In commonArgs(par, fn, control, environment()) :
maxfun < 10 * length(par)^2 is not recommended.
Однако оценки параметров не меняются в процессе оптимизации, поэтому я все еще не понимаю, что делать. Когда я попытался установить maxfn
элементы управления оптимизатора (несмотря на предупреждение), после завершения оптимизации он завис.
Вот некоторый код, который воспроизводит проблему для случайных данных:
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)
Это выводит:
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>
Я попытался установить ncol
другие значения, и оказалось, что число выполненных итераций составляет (приблизительно) 40 на столбец. Очевидно, это становится огромной болью, когда я добавляю больше столбцов. Могу ли я внести изменения в алгоритм оптимизации, которые уменьшат зависимость от количества столбцов?
glmer
это довольно медленно, особенно для моделей, которые имеют сложную структуру случайных эффектов (например, много случайных наклонов, скрещенные случайные эффекты и т. Д.). Моим первым предложением было бы попробовать еще раз с упрощенной структурой случайных эффектов. Однако, если вы столкнулись с этой проблемой только с моделью случайных перехватов, вашей проблемой может быть просто количество случаев, и в этом случае вам нужно будет попробовать некоторые инструменты, предназначенные для больших данных.