1

我正在使用tab_modelsjPlothttps://cran.r-project.org/web/packages/sjPlot/vignettes/tab_model_estimates.html)创建一个表。

但是,当我使用负二项式rstanarm模型对象时,会tab_model重新运行 MCMC 链。我的实际模型需要很多小时才能运行,所以这样做并不理想tab_model,但它似乎不适用于其他模型(例如 with glmerin 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。这是正常行为吗?如果是这样,是否有人熟悉关闭它的方法,只使用已经创建的模型对象,而不是重新运行模型?

4

1 回答 1

1

tl;博士我认为如果不破解包和这个包,或者要求包维护者进行编辑,这将是很难避免insight的,除非你想放弃打印 ICC、R^2随机效应方差. 在这里tab_model()调用insight::get_variance()尝试计算空模型的方差,以便计算 ICC 和 R^2。计算这些方差需要重新运行模型。(当它为 执行此操作时glmer.nb,它会通过lme4:::update.merMod()并且速度足够快,以至于您不会注意到计算时间。)

所以

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

不重新计算任何东西。从理论上讲,我认为应该可以跳过重采样/重新计算步骤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()
于 2020-10-13T23:29:31.267 回答