这是我第一次使用rjags,我试图拟合一些计数数据Y。我使用的是如下的分层混合模型:
Y ~ p*Poisson(N*lambda1) + (1-p)*Poisson(N*lambda2)
lambda1 ~ Gamma(a,b)
lambda2 ~ Lognormal(c,d)
a ~ Gamma(1,1)
b ~ Gamma(1,1)
c ~ Normal(0,1)
d ~ Gamma(1,1)
在这里,Y是我观察到的计数数据,而N是已知的。
我写了一个一直在玩的简单rjags模型。但是,在对简单的模拟数据进行测试时,我得到的结果确实很差。这是我的代码,用于生成模拟数据并运行模型:
a <- 0.5
b <- 0.5
c <- -10
d <- 1
lambda1 <- rgamma(30,a,b)
lambda2 <- rlnorm(70,c,d)
counts <- rpois(100,1000*c(lambda1,lambda2))
model_string <- "model{
# Likelihood
for (i in 1:n) {
mu1[i] <- N*lambda1[i]
mu2[i] <- N*lambda2[i]
lambda1[i] ~ dgamma(a,b)
lambda2[i] ~ dlnorm(c,d)
m[i] ~ dcat(mprior[])
mu[i] <- equals(m[i],1)*mu1[i] + equals(m[i],2)*mu2[i]
Y[i] ~ dpois(mu[i])
}
# Prior
mprior[1] <- 0.5
mprior[2] <- 0.5
a ~ dgamma(1,1)
b ~ dgamma(1,1)
c ~ dnorm(0,1)
d ~ dgamma(1,1)
}"
model <- jags.model(textConnection(model_string),
data = list(Y=counts,N=1000,n=100))
update(model,10000)
samp <- coda.samples(model,
variable.names=c("a","b","c","d","m"),
n.iter=20000)
print(colMeans(samp[[1]])[1:4])
运行此后,a,b,c,d的后验估计非常差,并且组件分配m也与真实分配不太匹配。我还注意到,即使增加迭代次数,绘制链看起来也不是很好。
有什么建议吗?我不确定我是否以最佳方式拟合混合物。如果还有其他更易于使用的发行版,那么我也绝对愿意更改a,b,c,d上的优先级。
答案 0 :(得分:0)
在JAGS模型中,lambda取决于i,这可能不是您的意图。该模型无法使用这样的定义来估计参数,因为基本上有太多的lambda,或者换句话说每个绘图遵循其自己的分布。
也许模型应该看起来更像
lambda1 ~ dgamma(a,b)
lambda2 ~ dlnorm(c,d)
或者,如果您真的想拥有单独的lambda,则每个lambda都需要更多次抽奖,以便进行后验分配。现在,您仅估算每个lambda一个数据点。
对于您用于混合物的分类分布也是如此。