Доступ к информации о шагах итерации lmer - PullRequest
0 голосов
/ 16 марта 2020

Я хотел бы получить доступ к промежуточным оценкам 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 (ответ не работает).

...