繁体   English   中英

将 R2jags 对象转换为 Stanreg (rstanarm) 对象

[英]Converting a R2jags object into a Stanreg (rstanarm) object

我使用R2jags制作了一个模型。 我喜欢jags语法,但我发现R2jags生成的输出不容易使用。 我最近阅读了rstanarm包。 它有许多有用的功能,并且得到了tidybayesbayesplot包的良好支持,可以轻松进行模型诊断和可视化。 但是,我不喜欢用于在rstanarm编写模型的rstanarm 理想情况下,我想获得两全其美,即在R2jags编写模型并将输出转换为Stanreg对象以使用rstanarm函数。

那可能吗? 如果是这样,如何?

我认为那么问题不一定是它是否可能 - 我怀疑它可能是。 真正的问题是你准备花多少时间来做这件事。 您所要做的就是尝试在结构中复制由rstanarm创建的对象,尽可能使用R2jags输出。 这将使一些后处理任务可能会起作用。

如果我这么大胆,我怀疑更好地利用您的时间是将R2jags对象转换为可以与您想要使用的后处理函数一起使用的对象。 例如,只需要一个小的修改,以尖齿输出,使所有的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)

现在,来自bayesplotmcmc_*()绘图函数期望的是 MCMC 绘制的矩阵列表,其中列名给出了参数的名称。 默认情况下, jags()将它们全部放入一个矩阵中。 在上面的例子中,总共有 5000 次迭代,其中 2500 次作为老化(留下 2500 次采样)并且在这种情况下n.thin设置为 2( jags()有一个识别细化参数的算法),但在任何在这种情况下, jagsfit$BUGSoutput$n.keep元素标识保留了多少迭代。 在本例中,它是 1250。因此您可以使用它从输出中创建两个矩阵的列表。

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), ])

现在,您只需要调用一些绘图函数:

mcmc_trace(jflist, regex_pars="theta")

在此处输入图片说明

或者

mcmc_areas(jflist, regex_pars="theta")

在此处输入图片说明

因此, rstanarm尝试复制rstanarm生成的所有输出, rstanarm尝试将jags输出转换为适合您要使用的后处理功能的格式,从而更好地利用您的时间。


编辑- 从bayesplot增加了pp_check()bayesplot

在这种情况下, y的后验绘制在theta参数中。 因此,我们创建了一个包含元素yyrep的对象,并将其yrep foo

x <- list(y = y, yrep = jagsfit$BUGSoutput$sims.list$theta)
class(x) <- "foo"

然后我们可以为foo类的对象编写一个pp_check方法。 这直接来自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, yrep[1:min(8, nrow(yrep)),, drop = FALSE]))
}

然后,只需调用该函数:

pp_check(x, type="overlaid")

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM