为什么tab_modelsjPlot用rstanarm模型重新运行MCMC?

问题描述

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

但是,当我使用负二项式rstanarm模型对象时,tab_model重新运行MCMC链。 我的实际模型要花很多时间才能运行,因此对于tab_model而言,这样做并不理想,但是对于其他模型(例如{{1中的glmer }}。

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)

enter image description here

输出很快,并且符合预期(尽管原始模型也运行很快,所以library(sjPlot) tab_model(mod1) 也有可能在此处重新运行模型)。

现在当我尝试

tab_model

它开始重新运行MCMC。是这种正常行为吗?如果是这样,是否有人熟悉一种关闭此行为的方法,只使用已经创建的模型对象,而不是重新运行模型?

解决方法

tl; dr 我认为,除非同时破解insight软件包和这个软件包,或者要求软件包维护者进行修改,否则除非您愿意,否则很难避免这种情况。放弃打印ICC,R ^ 2,随机效应方差。 Heretab_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() here
  • insight::get_variance.stanreg()方法调用insight:::.compute_variances()
  • ...呼叫insight:::.compute_variance_distribution()
  • ...(对于日志链接计数分配)调用insight:::.variance_distributional()
  • ...呼叫null_model
  • ...呼叫.null_model_mixed()
  • ...呼叫stats::update()

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...