#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