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