Почему tab_model (sjPlot) повторно запускает MCMC с моделью rstanarm?

#r #lme4 #mixed-models #sjplot #rstanarm

#r #lme4 #смешанные модели #sjplot #rstanarm

Вопрос:

Я создаю таблицу tab_model с помощью пакета sjPlot (https://cran.r-project.org/web/packages/sjPlot/vignettes/tab_model_estimates.html ).

Однако, когда я использую объект отрицательной биномиальной rstanarm модели, tab_model повторно запускаются цепочки MCMC. Моя фактическая модель требует много часов для запуска, так что это не идеально для tab_model этого, но, похоже, это не подходит для других моделей (например, с glmer in lme4 ).

 library(rstanarm)
library(lme4)

dat.nb<-data.frame(x=rnorm(200),z=rep(c("A","B","C","D"),50),
                y=rnbinom(200,size=1,prob = .5))

mod1<-glmer.nb(y~x (1|z),data=dat.nb)

options(mc.cores = parallel::detectCores())
mod2<-stan_glmer.nb(y~x (1|z),data=dat.nb)
  

Теперь для создания таблиц модели:

 library(sjPlot)
tab_model(mod1)
  

введите описание изображения здесь

Вывод выполняется быстро и, как и ожидалось (хотя исходная модель также выполнялась быстро, поэтому возможно, что tab_model здесь также выполняется повторный запуск модели).

Теперь, когда я пытаюсь

 tab_model(mod2)
  

Начинается повторный запуск MCMC. Является ли это нормальным поведением, и если да, кто-нибудь знаком со способом отключить это и просто использовать уже созданный объект модели, а не повторно запускать модель?

Комментарии:

1. Я попытался разобраться и отладить это, но код был слишком объемным, чтобы я мог в нем разобраться. github.com/strengejacke/sjPlot/blob /…

2. Я тоже кратко посмотрел на это и просто подумал, что у меня нет шансов..

Ответ №1:

tl; dr Я думаю, что этого будет трудно избежать, не взламывая как insight пакет, так и этот, или не запрашивая у сопровождающего пакета редактирование, если вы не хотите отказаться от печати ICC, R ^ 2 и дисперсии случайных эффектов. Здесь tab_model() calls insight::get_variance() , который пытается вычислить отклонения для нулевой модели, чтобы он мог вычислить ICC и R ^ 2. Вычисление этих отклонений требует повторного запуска модели. (Когда он делает это для glmer.nb , он проходит lme4:::update.merMod() и достаточно быстро, чтобы вы не заметили время вычисления.)

Итак

 tab_model(mod2,show.r2=FALSE,show.icc=FALSE,show.re.var=FALSE)
  

ничего не пересчитывает. Теоретически я думаю, что должно быть возможно пропустить этап повторной выборки / пересчета с помощью just show.r2=FALSE, show.icc=FALSE (т. Е. Не должно быть необходимости получать RE var), но это потребует некоторого взлома / участия сопровождающего.


Копание (с помощью debug(rstan::sampling) остановки внутри функции выборки Stan, затем where для просмотра стека вызовов…

  • tab_model() вызовы insight::get_variance() здесь
  • insight::get_variance.stanreg() метод вызывает insight:::.compute_variances()
  • … который вызывает insight:::.compute_variance_distribution()
  • … который (для распределения количества ссылок журнала) вызывает insight:::.variance_distributional()
  • … который вызывает null_model
  • … который вызывает .null_model_mixed()
  • … который вызывает stats::update()

Комментарии:

1. итак, я прав в том, что, похоже, тогда выполняется нулевая модель, а не повторная установка той же модели? Я не уверен, для чего функция использует нулевую модель, но кажется, что это должно быть полезно только для некоторых выходных данных. Я попытаюсь просмотреть и посмотреть, есть ли аргумент, который, если он отключен, обойдет необходимость в этом обновлении.

2. Сопровождающий пакета, как правило, довольно отзывчивый, возможно, стоит открыть проблему по этому поводу. Я думаю, что желание использовать RE var, но желание обойтись без R ^ 2 или ICC не является необычным вариантом использования…

3. Спасибо вам за это, я раньше не открывал проблему, но я рассмотрю ее.

4. Для всех, кто следит за этой темой: github.com/strengejacke/sjPlot/issues/697