所以我以为下面的代码可以在OpenBUGS中工作,但它给了我一个"节点Z的多个定义"错误。
model
{
Z <- round(X)
X ~ dnorm(0,1)T(-2,2)
}
list(Z=0)
即使我用Z <- X
替换Z <- round(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
以类似于具有"墙"(截断)的离散高斯分布,并且我希望从Z
上的数据估计mu
。我想我可以尝试将Z
变成一个分类变量并估计参数,但这在理论上似乎很痛苦。有没有一些BUGS技巧可以让我得到我想要的模型?
WinBUGS和OpenBUGS不允许观察到的数据是未观察到的变量的确定函数。正如您所建议的,您可以使用dcat()并用正态分布来表示概率。
尽管您可能更喜欢切换到JAGS,它有一个处理这种情况的分发dround()-数据四舍五入到n个有效数字,在您的情况下为n=0。尽管这篇论坛帖子表明,对于这种情况,当前的稳定版本中存在一个错误,您可能需要下载开发版本。