簡體   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