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
это довольно медленно, особенно для моделей, которые имеют сложную структуру случайных эффектов (например, много случайных наклонов, скрещенные случайные эффекты и т. Д.). Моим первым предложением было бы попробовать еще раз с упрощенной структурой случайных эффектов. Однако, если вы столкнулись с этой проблемой только с моделью случайных перехватов, вашей проблемой может быть просто количество случаев, и в этом случае вам нужно будет попробовать некоторые инструменты, предназначенные для больших данных.Ответы:
Одна вещь, которую вы можете попробовать, это изменить оптимизатор. Смотрите комментарий Бена Болкера в этом выпуске github . Реализация bobyqa в nlopt обычно намного быстрее, чем по умолчанию (по крайней мере, всякий раз, когда я это пробую).
Также смотрите этот ответ для получения дополнительных опций и этой ветки от R-sig-mixed-models (которая выглядит более актуальной для вашей проблемы).
Редактировать: Я дал вам устаревшую информацию, связанную с
nloptr
. Вlme4 1.1-7
и вверх,nloptr
автоматически импортируется (см.?nloptwrap
). Все, что вам нужно сделать, это добавитьна ваш звонок.
источник
PIRLS step-halvings failed to reduce deviance in pwrssUpdate
. Ты хоть представляешь, что здесь происходит? Сообщение об ошибке не совсем прозрачно ...nloptr
bobyqa. Вот интервью с Джоном К. Нэшем (соавтором пакетовoptim
andoptimx
), где он объясняет оптимизацию на высоком уровне. Если вы посмотрите вверхoptimx
илиnloptr
на CRAN, их соответствующие справочные руководства расскажут вам больше о синтаксисе.nloptr
также есть виньетка, которая идет немного дальше в детали.