我怎么能转换的mcmc.list到一个错误的对象?(How can I convert an mcm

2019-07-31 03:21发布

我现在用的是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。

Answer 1:

我不知道这是否会给你想要的东西。 需要注意的是model代码使用您的代码,然后键入来到LINE在光标处。 剩下的只是标准的错误代码,除非我用tau = rgamma(1,1)为初始值,不知道怎么的标准即是。 我不止一次看到tau = 1作为初始值。 也许会更好。

实际上,我创建了一个rjags使用相同的对象model你正在使用的代码,并增加了一个jags语句来运行它。 我承认,是不一样的东西结尾输出转换为一个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"

这是你的POST请求的称号。



Answer 2:

这不是你的问题的解决方案,但在回答关于@ andybega的回答您的评论,这里有一个转换的方式mcmc.list对象典型结尾的文本文件。

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())


Answer 3:

不是一个答案,但这个博客帖子有使用R2WinBUGS ::: bugs.sims尾声输出文件(.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) 
} 


文章来源: How can I convert an mcmc.list to a bugs object?