将R2jags对象转换为Stanregrstanarm对象

问题描述

我使用<script> var removeTag= document.getElementsByClassName('remove-tag'); for(var i=0; i<removeTag.length;i++){ var innerHTML = removeTag[i].innerHTML; let div = document.createElement('div'); div.innerHTML = innerHTML; insertAfter(div,removeTag[i]); removeTag[i].remove(); } var removeDiv= document.getElementsByClassName('remove-div'); for(var i=0; i<removeDiv.length;i++){ removeDiv[i].remove(); } function insertAfter(newNode,existingNode) { existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling); } </script> 建立了模型。我喜欢R2jags语法,但是发现jags产生的输出不容易使用。我最近阅读了R2jags软件包。它具有许多有用的功能,并且受到rstanarmtidybayes软件包的良好支持,可以轻松进行模型诊断和可视化。但是,我不喜欢用bayesplot编写模型的语法。理想情况下,我想充分利用两个世界的优势,那就是在rstanarm中编写模型,然后将输出转换为R2jags对象,以使用Stanreg函数

有可能吗?如果可以,怎么办?

解决方法

我认为接下来的问题不一定是是否有可能-我怀疑可能是。问题实际上是您准备花多少时间来做。您所要做的就是尝试在结构上复制rstanarm创建的对象,并尽可能使用R2jags输出。这样可以使某些后处理任务可能起作用。

如果我这么大胆,我怀疑可以更好地利用您的时间来将R2jags对象变成可以与您要使用的后处理功能一起使用的对象。例如,只需对JAGS输出进行少量修改即可使mcmc_*()中的所有bayesplot绘图功能起作用。这是一个例子。以下是jags()函数帮助中的示例模型。

# An example model file is given in:
model.file <- system.file(package="R2jags","model","schools.txt")

# data
J <- 8.0
y <- c(28.4,7.9,-2.8,6.8,-0.6,0.6,18.0,12.2)
sd <- c(14.9,10.2,16.3,11.0,9.4,11.4,10.4,17.6)


jags.data <- list("y","sd","J")
jags.params <- c("mu","sigma","theta")
jags.inits <- function(){
  list("mu"=rnorm(1),"sigma"=runif(1),"theta"=rnorm(J))
}

jagsfit <- jags(data=jags.data,inits=jags.inits,jags.params,n.iter=5000,model.file=model.file,n.chains = 2)

现在,来自mcmc_*()的{​​{1}}绘图函数期望的是一系列MCMC绘图矩阵,其中列名称给出了参数名称。默认情况下,bayesplot将它们全部放入一个矩阵中。在上述情况下,总共进行了5000次迭代,其中2500次为burnin(保留了2500次采样),并且在这种情况下jags()设置为2(n.thin具有用于识别间隔剔除参数的算法) ,但是在任何情况下,jags()元素都标识了要保留的迭代次数。在这种情况下,它是1250。因此,您可以使用它从输出中列出两个矩阵。

jagsfit$BUGSoutput$n.keep

现在,您只需要调用一些绘图功能:

jflist <- list(jagsfit$BUGSoutput$sims.matrix[1:jagsfit$BUGSoutput$n.keep,],jagsfit$BUGSoutput$sims.matrix[(jagsfit$BUGSoutput$n.keep+1):(2*jagsfit$BUGSoutput$n.keep),])

enter image description here

mcmc_trace(jflist,regex_pars="theta")

enter image description here

因此,与其尝试复制mcmc_areas(jflist,regex_pars="theta") 产生的所有输出,不如花费更多的时间尝试将rstanarm的输出弯曲为适合的格式。您要使用的后处理功能。


编辑-为jags中的pp_check()添加了可能性。

在这种情况下,bayesplot的后抽奖在y参数中。因此,我们制作了一个包含元素thetay的对象,并使其成为类yrep

foo

然后我们可以为类x <- list(y = y,yrep = jagsfit$BUGSoutput$sims.list$theta) class(x) <- "foo" 的对象编写一个pp_check方法。这直接来自foo的帮助文件。

bayesplot::pp_check()

然后,只需调用函数:

pp_check.foo <- function(object,...,type = c("multiple","overlaid")) {
  y <- object[["y"]]
  yrep <- object[["yrep"]]
  switch(match.arg(type),multiple = ppc_hist(y,yrep[1:min(8,nrow(yrep)),drop = FALSE]),overlaid = ppc_dens_overlay(y,drop = FALSE]))
}

enter image description here