2013-08-08 2 views
1

Итак, я думал, что следующий код будет работать в OpenBUGS, но вместо этого он дает мне ошибку «Несколько определений узла Z».Ошибка: «Множество определений узла» в OpenBUGS.

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, который я могу использовать для получения моей предполагаемой модели?

ответ

1

WinBUGS и OpenBUGS не позволяют наблюдаемым данным быть детерминированной функцией ненаблюдаемой переменной. Как вы можете предположить, вы можете использовать dcat() и выразить вероятности в терминах нормального распределения.

Возможно, вы захотите переключиться на JAGS, у которого есть дистрибутив dround(), который имеет дело только с этой ситуацией - данные округлены до n значащих цифр, в вашем случае n = 0. Хотя this forum post предлагает ошибку в текущей стабильной версии для этого случая, вам может потребоваться загрузить версию разработки.