Я хотел бы получить доступ к промежуточным оценкам lmer
(от lme4
). Я знаю, что могу использовать параметр verbose
, но хочу отобразить информацию об итерации в приложении shiny
, для которого мне нужен доступ к значениям после каждого шага. Моя идея состоит в том, чтобы разделить процедуру оценки с помощью optCtrl
и start
.
. Есть связанный вопрос, но он сильно устарел ( Перезапустите оценку модели смешанного эффекта с ранее оцененными значениями ). Я все еще буду использовать пример оттуда (обратите внимание, что я использую use.last.params
, что потребовало у меня некоторое время, чтобы выяснить):
library(lme4)
formula <- "Sepal.Length ~ Sepal.Width | Species"
x <- lmer(formula, data = iris, verbose = 3,
control = lmerControl(optCtrl = list(maxeval = 2),
use.last.params = T))
Предоставление:
iteration: 1
x = ( 1.000000, 0.000000, 1.000000 )
f(x) = 204.265641
iteration: 2
x = ( 1.750000, 0.000000, 1.000000 )
f(x) = 204.519865
Теперь, Я могу получить оценки через:
start <- getME(x, "theta")
и передать их на другой вызов lmer:
step_two <- lmer(formula, data = iris, verbose = 3,
control = lmerControl(optCtrl = list(maxeval = 2)),
start = start)
Предоставление:
iteration: 1
x = ( 1.750000, 0.000000, 1.000000 )
f(x) = 204.519865
iteration: 2
x = ( 3.062500, 0.000000, 1.000000 )
f(x) = 205.591849
Так что, очевидно, это работает просто отлично, но если я выполню три шага одновременно:
x <- lmer(formula, data = iris, verbose = 3,
control = lmerControl(optCtrl = list(maxeval = 3),
use.last.params = T))
я получу:
iteration: 1
x = ( 1.000000, 0.000000, 1.000000 )
f(x) = 204.265641
iteration: 2
x = ( 1.750000, 0.000000, 1.000000 )
f(x) = 204.519865
iteration: 3
x = ( 1.000000, 1.000000, 1.000000 )
f(x) = 201.741796
Я совсем не знаком с используемыми алгоритмами оптимизации, но, похоже, я не может просто разделить шаги итерации. Это правильно или мне просто нужно подправить настройки? Кстати, я бы хотел придерживаться алгоритма по умолчанию.
Нужно ли взламывать lmer
(или использовать алгоритм оптимизации), чтобы получить доступ к отдельным итерациям? Под этим я подразумеваю найти место, где выводится вывод verbose
, и настроить его в соответствии со своими потребностями.
Я знаю, что мой подход не идеален, поскольку у меня есть накладные расходы на итерации, но я может увеличить maxeval
до некоторого разумного значения (например, показывать результаты каждой 10-й итерации).
PS: альтернативой более общей проблеме печати прогресса в shiny
было бы каким-то образом перенаправить вывод консоли ( verbose
аргумент) к блестящему выводу. Но это не так просто сделать, см .: Блестящий: вывод на консоль вывода в текстовый объект без ожидания завершения функции sh (ответ не работает).