我现在正致力于使用包含两个组件的混合模型:normal和lognormal来拟合向量。 我尝试使用JAGS,这是代码:
model {
for(i in 1:N) {
y[i] <- latent[i,index[i]+1]
index[i] ~dbern(pi)
latent[i,1]~ dlnorm(mu1,tau1)
latent[i,2]~ dnorm(mu2,tau2)}
pi ~ dbeta(0.5,0.5)
mu1 ~ dnorm(0.4,0.000001)
tau1~ dgamma(0.001,0.001)
mu2 ~ dnorm(4,0.000001)
tau2~ dgamma(0.001,0.001)
}
但是,它不适用于错误消息&#34; y [1]是逻辑节点,无法观察到&#34;。 我也试过
y[i] <- pi*z1+(1-pi)*z2
z1 ~ dnorm(mu1,tau1)
z2 ~ dlnorm(mu2,tau2)
...
但它给出了相同的错误消息。我似乎必须为y [i]分配一个分布。任何人都可以帮助克服这个问题吗?或者其他解决这种混合模型的方法也会受到赞赏!
答案 0 :(得分:1)
如果你只是想混合这两个模型,你可以这样做:
model {
for(i in 1:N) {
index[i] ~dbern(pi)
latent[i]~ (dlnorm(mu1,tau1)*(1-index[i]))+(dnorm(mu2,tau2)*index[i])
}
pi ~ dbeta(0.5,0.5)
mu1 ~ dnorm(0.4,0.000001)
tau1~ dgamma(0.001,0.001)
mu2 ~ dnorm(4,0.000001)
tau2~ dgamma(0.001,0.001)
}
这样,在模型的每个步骤中,它选择使用对数正态模型或正态模型。如果您跟踪index
,它将告诉您MCMC链中每个步骤选择的分布(index = 1 = normal,index = 0 = lognormal)。此外,您可以将索引的总和除以MCMC链中的步数除以获得选择1的次数(正常)。