首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么tab_model (sjPlot)用rstanarm模型重新运行MCMC?

为什么tab_model (sjPlot)用rstanarm模型重新运行MCMC?
EN

Stack Overflow用户
提问于 2020-10-13 22:57:44
回答 1查看 162关注 0票数 1

我正在使用tab_model从包sjPlot (estimates.html)创建一个表。

然而,当我使用负二项式rstanarm模型对象时,tab_model重新运行MCMC链.我的实际模型需要很多小时才能运行,因此对于tab_model来说,这并不理想,但对于其他模型(比如glmer in lme4),它似乎不太理想。

代码语言:javascript
复制
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)

现在要创建模型表:

代码语言:javascript
复制
library(sjPlot)
tab_model(mod1)

输出是快速的,正如预期的那样(虽然原始模型也运行得很快,所以tab_model也有可能在这里重新运行模型)。

现在当我尝试

代码语言:javascript
复制
tab_model(mod2)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-13 23:29:31

tl;博士--我认为,如果不对insight包和这个包进行黑客攻击,或者要求软件包维护人员进行编辑,这是很难避免的,除非您想要放弃打印ICC、R^2和随机效应方差。这里tab_model()调用insight::get_variance(),它试图计算空模型的方差,以便计算ICC和R^2。计算这些变量需要重新运行模型。(当它用于glmer.nb时,它会通过lme4:::update.merMod()进行,并且速度足够快,以至于您没有注意到计算时间。)

所以

代码语言:javascript
复制
tab_model(mod2,show.r2=FALSE,show.icc=FALSE,show.re.var=FALSE)

不会重新计算任何东西。理论上,我认为应该可以跳过仅使用show.r2=FALSE, show.icc=FALSE的重采样/恢复步骤(即不需要获得RE ),但这需要维护人员的一些黑客/参与。

深入研究(使用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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64344283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档