簡體   English   中英

如何將mcmc.list轉換為bug對象?

[英]How can I convert an mcmc.list to a bugs object?

我正在使用rjags R庫。 例如,函數coda.samples生成一個mcmc.list (來自example(coda.samples) ):

library(rjags)
data(LINE)
LINE$recompile()
LINE.out <- coda.samples(LINE, c("alpha","beta","sigma"), n.iter=1000)
class(LINE.out)
[1] "mcmc.list"

但是,我想使用plot.bugs函數,它需要一個bugs對象作為輸入。

是否可以將對象從mcmc.list轉換為bugs對象,以便plot.bugs(LINE.out)

請注意, stats.SE上有一個類似的問題,一個多月沒有得到答復。 這個問題有一筆在2012年8月29日結束的賞金。

更多提示:

我發現R2WinBUGS包有一個函數“as.bugs.array”函數 - 但是不清楚該函數如何應用於mcmc.list。

我不知道這是否會給你你想要的東西。 請注意, model代碼來自使用您的代碼,然后在光標處鍵入LINE 其余的只是標准的錯誤代碼,除了我使用tau = rgamma(1,1)作為初始值而不知道標准是多少。 我不止一次看到tau = 1用作初始值。 也許那會更好。

實際上,我使用您使用的相同model代碼創建了一個rjags對象,並添加了一個jags語句來運行它。 我承認這與將coda輸出轉換為bugs對象不同,但它可能會導致你獲得所需的plot

如果您擁有的是mcmc.list並且沒有model代碼,並且您只想繪制mcmc.list ,那么我的答案將無濟於事。

library(R2jags)

x <- c(1, 2, 2, 4, 4,  5,  5,  6,  6,  8) 
Y <- c(7, 8, 7, 8, 9, 11, 10, 13, 14, 13) 

N <- length(x)
xbar <- mean(x)

summary(lm(Y ~ x))

x2 <- x - xbar

summary(lm(Y ~ x2))

# Specify model in BUGS language

sink("model1.txt")

cat("

model  {
                for( i in 1 : N ) {
                        Y[i] ~ dnorm(mu[i],tau)
                        mu[i] <- alpha + beta * (x[i] - xbar)
                }
                tau ~ dgamma(0.001,0.001) 
                sigma <- 1 / sqrt(tau)
                alpha ~ dnorm(0.0,1.0E-6)
                beta ~ dnorm(0.0,1.0E-6)        
        }

",fill=TRUE)
sink()

win.data <- list(Y=Y, x=x, N=N, xbar=xbar)

# Initial values
inits <- function(){ list(alpha=rnorm(1), beta=rnorm(1), tau = rgamma(1,1))}

# Parameters monitored
params <- c("alpha", "beta", "sigma")

# MCMC settings
ni <- 25000
nt <-     5
nb <-  5000
nc <-     3

out1 <- jags(win.data, inits, params, "model1.txt", n.chains = nc, 
             n.thin = nt, n.iter = ni, n.burnin = nb)

print(out1, dig = 2)
plot(out1)

#library(R2WinBUGS)
#plot(out1)

編輯:

根據評論,也許這樣的事情會有所幫助。 str(new.data)表明有大量數據可用。 如果您只是嘗試創建默認圖的變體,那么這樣做可能只是根據需要提取和子集化數據。 這里的plot(new.data$sims.list$P1)只是一個直截了當的例子。 如果不知道您想要什么樣的情節,我將不會嘗試更具體的數據提取。 如果您發布一個圖形,顯示您想要的確切類型的圖表的示例,也許有人可以從此處獲取並發布創建它所需的代碼。

順便說一句,我建議將示例數據集的大小減小到三個鏈,也許不超過30次迭代,直到您擁有所需的確切代碼,以獲得所需的精確繪圖:

load("C:/Users/mmiller21/simple R programs/test.mcmc.list.Rdata")

class(test.mcmc.list)

library(R2WinBUGS)

plot(as.bugs.array(sims.array = as.array(test.mcmc.list)))

new.data <- as.bugs.array(sims.array = as.array(test.mcmc.list))

str(new.data)

plot(new.data$sims.list$P1)

編輯:

還要注意:

class(new.data)
[1] "bugs"

然而:

class(test.mcmc.list)
[1] "mcmc.list"

這是你的帖子的標題要求。

不是答案,但是這篇博文有以下包裝函數,用於使用R2WinBUGS ::: bugs.sims將coda輸出(.txt)轉換為BUGS:

coda2bugs <- function(path, para, n.chains=3, n.iter=5000, 
                      n.burnin=1000, n.thin=2) {   
 setwd(path)   
 library(R2WinBUGS)   
 fit <- R2WinBUGS:::bugs.sims(para, n.chains=n.chains, 
        n.iter=n.iter, n.burnin=n.burnin, n.thin=n.thin, 
        DIC = FALSE)   
 class(fit) <- "bugs"   
 return(fit) 
} 

這不是你的問題的解決方案,但是回應你對@ andybega的答案的評論,這里是一種將mcmc.list對象轉換為典型的coda文本文件的方法。

mcmc.list.to.coda <- function(x, outdir=tempdir()) {
  # x is an mcmc.list object
  x <- as.array(x)
  lapply(seq_len(dim(x)[3]), function(i) {
    write.table(cbind(rep(seq_len(nrow(x[,,i])), ncol(x)), c(x[,,i])), 
                paste0(outdir, '/coda', i, '.txt'),
                row.names=FALSE, col.names=FALSE)
  })

  cat(paste(colnames(x), 
            1 + (seq_len(ncol(x)) - 1) * nrow(x),
            nrow(x) * seq_len(ncol(x))), 
      sep='\n', 
      file=file.path(outdir, 'codaIndex.txt'))
}

# For example, using the LINE.out from your question:
mcmc.list.to.coda(LINE.out, tempdir())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM