MCMC 贝叶斯推理的 JAGS 错误
JAGS error for MCMC Bayesian inference
在 R 中,我是 运行 一个 MCMC 贝叶斯推理,用于从 Gamma 分布的混合数据中推断。这里使用了 JAGS。模型文件gmd.bug如下
model {
for (i in 1:N) {
y[i] ~ dsum(p*one, (1-p)*two)
}
one ~ dgamma(alpha1, beta1)
two ~ dgamma(alpha2, beta2) alpha1 ~ dunif(0, 10)
beta1 ~ dunif(0, 10)
alpha2 ~ dunif(0, 10)
beta2 ~ dunif(0, 10)
p ~ dunif(0, 1)
}
那么,这是推理阶段
gmd.jags = jags.model("gmd.bug",
data = list(N = NROW(a), y=unlist(a)),
inits = inits, n.chains = 3, n.adapt = 1000)
下面是让我疑惑的错误
Error in jags.model("gmd.bug", data = list(N = NROW(a), y = unlist(a)), :
Error in node y[1]
Node inconsistent with parents
有人知道这里需要修复什么吗?
回答 OP 的原始问题
当你写 y[i] ~ dsum(p*dgamma(alpha1, beta1), (1-p)*dgamma(alpha2, beta2))
时,dgamma(alpha1, beta1)
需要被 [i] 索引,如
gamma1[i] ~ dgamma(alpha1, beta1)
gamma2[i] ~ dgamma(alpha2, beta2)
回答 OP 的第二个问题(编辑后)
这就是你问题的症结所在。但是修复它会带来额外的困难,因为为了确保 y[i] 在初始化时与其父级一致,您需要确保在初始化时 y[i] == p*gamma1[i]+(1-p)*gamma2[i]
严格为真。如果你让 JAGS 自动处理初始化,它会从先验开始初始化,而不理解 dsum
对初始值施加的约束,你会得到一个错误。一种策略是在 y
.
处同时初始化 gamma1
和 gamma2
下面的代码对我有用(当然你会想要 运行 更多的迭代):
# Data simulation:
library(rjags)
N=200
alpha1 <- 3
beta1 <- 3
alpha2 <- 5
beta2 <- 1
p <- .7
y <- vector(mode="numeric", length=N)
for(i in 1:N){
y[i] <- p*rgamma(1,alpha1,beta1) + (1-p)*rgamma(1,alpha1,beta1)
}
# JAGS model
sink("mymodel.txt")
cat("model{
for (i in 1:N) {
gamma1[i] ~ dgamma(alpha1, beta1)
gamma2[i] ~ dgamma(alpha2, beta2)
pg1[i] <- p*gamma1[i]
pg2[i] <- (1-p)*gamma2[i]
y[i] ~ dsum(pg1[i], pg2[i])
}
alpha1 ~ dunif(0, 10)
beta1 ~ dunif(0, 10)
alpha2 ~ dunif(0, 10)
beta2 ~ dunif(0, 10)
p ~ dunif(0, 1)
}", fill=TRUE)
sink()
jags.data <- list(N=N, y=y)
inits <- function(){list(gamma1=y, gamma2=y)}
params <- c("alpha1", "beta1", "alpha2", "beta2", "p")
nc <- 5
n.adapt <-200
n.burn <- 200
n.iter <- 1000
thin <- 10
mymodel <- jags.model('mymodel.txt', data = jags.data, inits=inits, n.chains=nc, n.adapt=n.adapt)
update(mymodel, n.burn)
mymodel_samples <- coda.samples(mymodel,params,n.iter=n.iter, thin=thin)
在 R 中,我是 运行 一个 MCMC 贝叶斯推理,用于从 Gamma 分布的混合数据中推断。这里使用了 JAGS。模型文件gmd.bug如下
model {
for (i in 1:N) {
y[i] ~ dsum(p*one, (1-p)*two)
}
one ~ dgamma(alpha1, beta1)
two ~ dgamma(alpha2, beta2) alpha1 ~ dunif(0, 10)
beta1 ~ dunif(0, 10)
alpha2 ~ dunif(0, 10)
beta2 ~ dunif(0, 10)
p ~ dunif(0, 1)
}
那么,这是推理阶段
gmd.jags = jags.model("gmd.bug",
data = list(N = NROW(a), y=unlist(a)),
inits = inits, n.chains = 3, n.adapt = 1000)
下面是让我疑惑的错误
Error in jags.model("gmd.bug", data = list(N = NROW(a), y = unlist(a)), :
Error in node y[1]
Node inconsistent with parents
有人知道这里需要修复什么吗?
回答 OP 的原始问题
当你写 y[i] ~ dsum(p*dgamma(alpha1, beta1), (1-p)*dgamma(alpha2, beta2))
时,dgamma(alpha1, beta1)
需要被 [i] 索引,如
gamma1[i] ~ dgamma(alpha1, beta1)
gamma2[i] ~ dgamma(alpha2, beta2)
回答 OP 的第二个问题(编辑后)
这就是你问题的症结所在。但是修复它会带来额外的困难,因为为了确保 y[i] 在初始化时与其父级一致,您需要确保在初始化时 y[i] == p*gamma1[i]+(1-p)*gamma2[i]
严格为真。如果你让 JAGS 自动处理初始化,它会从先验开始初始化,而不理解 dsum
对初始值施加的约束,你会得到一个错误。一种策略是在 y
.
gamma1
和 gamma2
下面的代码对我有用(当然你会想要 运行 更多的迭代):
# Data simulation:
library(rjags)
N=200
alpha1 <- 3
beta1 <- 3
alpha2 <- 5
beta2 <- 1
p <- .7
y <- vector(mode="numeric", length=N)
for(i in 1:N){
y[i] <- p*rgamma(1,alpha1,beta1) + (1-p)*rgamma(1,alpha1,beta1)
}
# JAGS model
sink("mymodel.txt")
cat("model{
for (i in 1:N) {
gamma1[i] ~ dgamma(alpha1, beta1)
gamma2[i] ~ dgamma(alpha2, beta2)
pg1[i] <- p*gamma1[i]
pg2[i] <- (1-p)*gamma2[i]
y[i] ~ dsum(pg1[i], pg2[i])
}
alpha1 ~ dunif(0, 10)
beta1 ~ dunif(0, 10)
alpha2 ~ dunif(0, 10)
beta2 ~ dunif(0, 10)
p ~ dunif(0, 1)
}", fill=TRUE)
sink()
jags.data <- list(N=N, y=y)
inits <- function(){list(gamma1=y, gamma2=y)}
params <- c("alpha1", "beta1", "alpha2", "beta2", "p")
nc <- 5
n.adapt <-200
n.burn <- 200
n.iter <- 1000
thin <- 10
mymodel <- jags.model('mymodel.txt', data = jags.data, inits=inits, n.chains=nc, n.adapt=n.adapt)
update(mymodel, n.burn)
mymodel_samples <- coda.samples(mymodel,params,n.iter=n.iter, thin=thin)