问题描述
我使用<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
软件包。它具有许多有用的功能,并且受到rstanarm
和tidybayes
软件包的良好支持,可以轻松进行模型诊断和可视化。但是,我不喜欢用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),])
或
mcmc_trace(jflist,regex_pars="theta")
因此,与其尝试复制mcmc_areas(jflist,regex_pars="theta")
产生的所有输出,不如花费更多的时间尝试将rstanarm
的输出弯曲为适合的格式。您要使用的后处理功能。
编辑-为jags
中的pp_check()
添加了可能性。
在这种情况下,bayesplot
的后抽奖在y
参数中。因此,我们制作了一个包含元素theta
和y
的对象,并使其成为类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]))
}