Как преобразовать mcmc.list в объект ошибок?

Я использую библиотеку 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, который был оставлен без ответа более месяца. У этого вопроса была щедрость, которая закончилась 28.08.2012.

Дополнительные советы:

Я обнаружил, что пакет R2WinBUGS имеет функцию "as.bugs.array", но неясно, как функция может быть применена к mcmc.list.

Ответ 1

Я не знаю, даст ли это вам то, что вы хотите. Обратите внимание, что код model исходил от использования вашего кода, а затем набрал LINE курсором. Остальное является стандартным кодом ошибок, за исключением того, что я использовал tau = rgamma(1,1) для начального значения и не знаю, как это стандарт. Не раз я видел, что tau = 1 используется как начальное значение. Возможно, это было бы лучше.

Фактически, я создал объект rjags, используя тот же код model, который вы использовали, и добавил оператор jags для его запуска. Я признаю, что это не то же самое, что преобразование вывода кода в объект bugs, но это может привести к получению желаемого plot.

Если у вас есть код mcmc.list и no 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)

EDIT:

Основываясь на комментариях, возможно, что-то подобное поможет. Строка 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)

EDIT:

Обратите внимание, что:

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

тогда:

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

что является заголовком ваших сообщений.

Ответ 2

Не ответ, но это сообщение в блоге имеет следующую функцию-оболочку для преобразования вывода кода (.txt) в BUGS с использованием R2WinBUGS: bugs.sims:

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

Ответ 3

Это не решение вашего вопроса, но в ответ на ваш комментарий к ответу @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())