I有し以下潜在変数モデル:人のJは、2つの潜在変数、X J1とX J2を有しています。私たちが観察できるのは、最大値Y j = max(X j1、X j2)です。潜在変数は二変量法線である。それらはそれぞれ平均μ、分散σを有し、それらの相関はρである。私は、Y患者、j = 1、...、nからのデータを用いて、Y jのみを使用して3つのパラメータ(μ、Σ、rho)を推定したいと考えています。使用ぎざぎざまたはSTAN観測ノードが潜在ノードの最大値である
私はこのモデルをJAGSに適合させようとしています(パラメータにpriorsを設定しています)。しかし、コンパイルするコードを取得できません。 JAGSを呼び出すときに使用するRコードは次のとおりです。最初私は、データを生成する(潜在変数の観察の両方)、パラメータのいくつかの真値所与:
# true parameter values
mu <- 3
sigma2 <- 2
rho <- 0.7
# generate data
n <- 100
Sigma <- sigma2 * matrix(c(1, rho, rho, 1), ncol=2)
X <- MASS::mvrnorm(n, c(mu,mu), Sigma) # n-by-2 matrix
Y <- apply(X, 1, max)
それからぎざぎざモデルを定義し、ぎざぎざサンプラーを実行し、サンプルを返すように少し機能を記述します。
samp1 <- fit.jags(latent=TRUE, data=list(n=n, Y=Y), n.burnin=1000, n.samp=2000)
は残念ながら、これはエラーメッセージをもたらす:「Y [1]の論理ノードであると観察することができない」
# JAGS model code
model.text <- '
model {
for (i in 1:n) {
Y[i] <- max(X[i,1], X[i,2]) # Ack!
X[i,1:2] ~ dmnorm(X_mean, X_prec)
}
# mean vector and precision matrix for X[i,1:2]
X_mean <- c(mu, mu)
X_prec[1,1] <- 1/(sigma2*(1-rho^2))
X_prec[2,1] <- -rho/(sigma2*(1-rho^2))
X_prec[1,2] <- X_prec[2,1]
X_prec[2,2] <- X_prec[1,1]
mu ~ dnorm(0, 1)
sigma2 <- 1/tau
tau ~ dgamma(2, 1)
rho ~ dbeta(2, 2)
}
'
# run JAGS code. If latent=FALSE, remove the line defining Y[i] from the JAGS model
fit.jags <- function(latent=TRUE, data, n.adapt=1000, n.burnin, n.samp) {
require(rjags)
if (!latent)
model.text <- sub('\n *Y.*?\n', '\n', model.text)
textCon <- textConnection(model.text)
fit <- jags.model(textCon, data, n.adapt=n.adapt)
close(textCon)
update(fit, n.iter=n.burnin)
coda.samples(fit, variable.names=c("mu","sigma2","rho"), n.iter=n.samp)[[1]]
}
最後に、私は観察されたデータを供給し、ぎざぎざを呼び出します。 JAGSは "< - "を使ってY [i]に値を代入するのを私に好まれません(私は "Ack!"という違反行を表します)。私は苦情を理解していますが、これを修正するためにモデルコードを書き換える方法がわかりません。
また、「Ack!」行以外にも問題はないことを実証するために、モデルを再実行しますが、今回は実際に観測されたXデータをフィードします。これは完璧に動作し、私はパラメータの良い推定値を得る:
samp2 <- fit.jags(latent=FALSE, data=list(n=n, X=X), n.burnin=1000, n.samp=2000)
colMeans(samp2)
あなたは私と一緒にいいと思いSTANの代わりに、ぎざぎざにこのモデルをプログラムする方法を、見つけることができれば。