5

パッケージを使用してR で MCMC を実行していますが、後で別の R セッションで使用するためにrjags関数の出力を保存したいと考えています。jags.model

正規分布の平均の簡単な例を次に示します。

library(rjags)
N <- 1000
x <- rnorm(N, 0, 5)
model.str <- 'model {for (i in 1:N) {
  x[i] ~ dnorm(mu, 5)}
  mu ~ dnorm(0, .0001)}'
jags <- jags.model(textConnection(model.str), data = list(x = x, N = N))
update(jags, 1000)

mu次のようなサンプルを生成できます。

coda.samples(model=jags,n.iter=1,variable.names="mu")

# [[1]]
# Markov Chain Monte Carlo (MCMC) output:
# Start = 2001 
# End = 2001 
# Thinning interval = 1 
#             mu
# [1,] 0.2312028
# 
# attr(,"class")
# [1] "mcmc.list"

ここで、後で新しい R セッションで使用するためにモデル オブジェクトを保存しjagsて、マルコフ連鎖を再度初期化して焼き付ける必要がないようにします。

save(file="/tmp/jags.Rdata", list="jags")
quit()

ただし、新しい R セッションを開始してモデルをリロードすると、JAGS モデルを再コンパイルする必要があるというエラー メッセージが表示されます。

load("/tmp/jags.Rdata")
coda.samples(model=jags,n.iter=1,variable.names="mu")
# Error in model$iter() : JAGS model must be recompiled

何故ですか?後で使用するためにオブジェクトを Rに保存するにはどうすればよいですか?jags

注:質問は以前に尋ねられましたが、OPは問題についてあまり具体的ではありませんでした。

4

1 に答える 1

7

あなたが本当にやりたいことに関して、私は完全に軌道から外れているかもしれませんが、rjags の代わりに R2jags (別のラッパーのようなもの) を使用して、このような jags モデルをセットアップします。

library(R2jags)
N <- 1000
x <- rnorm(N, 0, 5)

sink("test.txt")
cat("
    model{
        for (i in 1:N) {
            x[i] ~ dnorm(mu, 5)
        }
            mu ~ dnorm(0, .0001)
    }
    ",fill = TRUE)
sink()

inits <- function() {
    list(
        mu = dnorm(1, 0, 0.01))
}
params <- c("mu")
chains <- 3
iter <- 1000

jags1 <- jags(model.file = "test.txt", data = list(x = x, N = N),
              parameters.to.save = params, inits = inits,
              n.chains = chains, n.iter = iter, n.burnin=floor(iter/2),
              n.thin = ifelse(floor(iter/100) < 1, 1, floor(iter/100)))
jags2 <- update(jags1, 10000)
jags2
plot(jags2)
traceplot(jags2)
jags2.mcmc <- as.mcmc(jags2)

結果に違いはなく、この手順が好きです。これは、私が winbugs を使用した方法よりもはるかに優れているためです...

コードの最後の行は、jags2-object をパッケージ coda で処理できる mcmc-list に変換します。

幸運を!


PSここに2番目の答えがあります:

コードをもう一度見た後、必要な動作を得るために不足している jags-object をロードした後の唯一のことは次のとおりです。

jags$recompile()
coda.samples(model=jags,n.iter=1,variable.names="mu")

しかし、すでに取得した事後サンプルを本当に使用したい場合、またはチェーンを更新してさらに反復したい場合は、R2jags 手順を使用することもできます。

于 2014-08-22T07:50:38.910 に答える