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

为什么tab_模型(sjPlot)使用rstanarm模型重新运行MCMC?,r,lme4,mixed-models,sjplot,rstanarm,R,Lme4,Mixed Models,Sjplot,Rstanarm,我正在使用包sjPlot()中的tab\u model创建一个表 但是,当我使用负二项rstanarmmodel对象时,tab\u model会重新运行MCMC链。 我的实际模型需要很多小时才能运行,因此这对于tab_model来说并不理想,但对于其他模型(例如lme4中的glmer)来说似乎并不理想 输出速度很快,正如预期的那样(尽管原始模型也运行得很快,因此有可能tab_model也在这里重新运行模型) 现在当我尝试 tab_model(mod2) 它开始重新运行MCMC。这是正常行为吗

我正在使用包
sjPlot
()中的
tab\u model
创建一个表

但是,当我使用负二项
rstanarm
model对象时,
tab\u model
会重新运行MCMC链。 我的实际模型需要很多小时才能运行,因此这对于
tab_model
来说并不理想,但对于其他模型(例如
lme4
中的
glmer
)来说似乎并不理想

输出速度很快,正如预期的那样(尽管原始模型也运行得很快,因此有可能
tab_model
也在这里重新运行模型)

现在当我尝试

tab_model(mod2)

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

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

所以

不会重新计算任何内容。理论上,我认为只要
show.r2=FALSE,show.icc=FALSE
(也就是说,不需要获取RE var),就可以跳过重采样/重新计算步骤,但这需要维护人员进行一些黑客攻击/参与


深入(使用
debug(rstan::sampling)
在Stan采样函数内停止,然后
where
查看调用堆栈

  • tab\u model()
    调用
    insight::get\u variance()
  • insight::get_variance.stanreg()
    方法调用
    insight::.compute_variances()
  • …它调用
    insight::.compute\u variance\u distribution()
  • …它(对于日志链接计数分布)调用
    insight::.variance\u distributional()
  • …调用
    null\u model
  • …它调用
    .null\u model\u mixed()
  • …它调用
    stats::update()

我试图深入研究并调试这一点,但代码太粗,我无法理解。我也简单地看了一下,只是认为我没有机会。那么,我的判断是否正确,它似乎运行的是一个空模型,而不是重新拟合同一个模型?我不确定该函数使用空模型的目的是什么,但似乎是这样的这应该只对某些输出有用。我将尝试查看是否有一个论点,即如果关闭,将绕过此更新的需要。包维护人员通常非常响应,可能值得就此提出一个问题。我认为希望使用RE var,但愿意不使用R^2或ICC是一个不寻常的用例…谢谢你,我以前没有打开过一个问题,但我会研究它。对于遵循此线程的任何人:
library(sjPlot)
tab_model(mod1)
tab_model(mod2)
tab_model(mod2,show.r2=FALSE,show.icc=FALSE,show.re.var=FALSE)