所以我认为以下代码可以在OpenBUGS中使用,但它给了我一个“节点Z的多个定义”错误。
model
{
Z <- round(X)
X ~ dnorm(0,1)T(-2,2)
}
list(Z=0)
即使我用Z <- round(X)
替换Z <- X
,我仍然会遇到同样的错误。根据这一事实,我们可以推断出错误是由于对可观察变量使用逻辑分配造成的,特别是错误不是由round()
操作引起的。
为什么BUGS不允许这样做?另外,在这种情况下,什么是好的解决方案?这是一个我想要实现的更通用的版本,它实质上是建模带有墙的离散高斯(截断):
model
{
for(i in 1:N){
Z[i] <- round(X[i])
X[i] ~ dnorm(mu,1)T(-2,2)
}
mu ~ dunif(-2,2)
}
基本上,我希望Z
分布的内容类似于带有“墙”的离散高斯(截断),我想从mu
上的数据估算Z
。我想我可以尝试将Z
变成一个分类变量并估计参数,但这似乎在理论上是痛苦的。我可以使用一些BUGS技巧来获得我想要的模型吗?
答案 0 :(得分:1)
WinBUGS和OpenBUGS不允许观察到的数据是未观察到的变量的确定性函数。正如您所建议的那样,您可以使用dcat()并根据正态分布表达概率。
虽然您可能更愿意切换到JAGS,它具有处理这种情况的分布式dround() - 在您的情况下n = 0时舍入到n位有效数字的数据。虽然this forum post表明此案例的当前稳定版本存在错误,但您可能需要下载开发版本。