[英]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.