несколько определений ошибки узла в winbugs

Я пытаюсь использовать WinBUGS из R через BRugs и R2WinBUGS, код следующий:

require(R2WinBUGS)
require(BRugs)
model<-function(){
  for(i in 1:N){
    y[i] <- x[i] + w[i]
    w[i] ~ dnorm(0, sigma.y)
    x[i] <- a - b*5 + v[i]
    v[i] ~ dnorm(0, sigma.x)
  }
a ~ dunif(0, 1)
b ~ dunif(-1, 1)
sigma.y ~ dgamma(0.1, 0.1)
sigma.x ~ dgamma(0.1, 0.1)
}

write.model(model, con = "model.bug")
modelCheck("model.bug")
# model is syntactically correct

N = 10
y = rnorm(100)
data = list(N = N, y = y)
inits = function(){
  list(a = runif(1, 0, 1), b = runif(1, -1, 1), sigma.x= rgamma(1, 0.1, 0.1), 
       sigma.y = rgamma(1, 0.1, 0.1))
}
parameters = c("a", "b", "sigma.x", "sigma.y")

result.sim <- bugs(data, inits, parameters, "model.bug",
                n.chains = 1, n.iter = 1000,
                program= "winbugs",
                working.directory = NULL,
                debug = T)

Результат не вышел, и я узнаю часть log.txt из WinBUGS:

display(log)
check(C:/Users/ADMINI~1.PC-/AppData/Local/Temp/RtmpkrnOoc/model.bug.txt)
model is syntactically correct
data(C:/Users/ADMINI~1.PC-/AppData/Local/Temp/RtmpkrnOoc/data.txt)
data loaded
compile(1)
multiple definitions of node y[1]
inits(1,C:/Users/ADMINI~1.PC-/AppData/Local/Temp/RtmpkrnOoc/inits1.txt)
command #Bugs:inits cannot be executed (is greyed out)
gen.inits()
command #Bugs:gen.inits cannot be executed (is greyed out)
thin.updater(1)
update(500)
command #Bugs:update cannot be executed (is greyed out)
set(a)

очевидно, что error это multiple definitions of node y[1], но что это значит? Я не думаю, что y[1] имеет несколько определений, так как я использую y[i], но не y в loop.


person PepsiCo    schedule 17.04.2013    source источник


Ответы (2)


Вы, как правило, получаете ошибку множественных определений, когда неправильно определили вероятность своей модели. Если в ваших данных есть y, вам нужно указать распределение для y в вашей модели. На данный момент ваш y в модели настроен как детерминированный (а не случайный) узел. В зависимости от того, какая у вас фактическая модель, вы можете установить

y[i] ~ dnorm(x[i], w[i])

Затем вам нужно будет иметь другое априорное распределение (что-то только положительное) для каждого допуска w[i].

person guyabel    schedule 17.04.2013
comment
Почему x[i] может быть определено логически, но не y[i]? - person Christian Bueno; 08.08.2013
comment
@ChristianBueno, потому что y[i] также определено в данных. определить его снова как неслучайный узел было бы вторым (множественным определением). 'x[i]' новый (не в данных), поэтому он может быть логическим или случайным. - person guyabel; 12.08.2013

В вашей модели y[i] имеет нормальное распределение со средним значением x[i] и дисперсией, определяемой как дисперсия v[i] плюс дисперсия w[i]. Это даст вам соответствующие параметры для использования в y[i] ~ dnorm(x[i] , prec[i]). Обратите внимание, что нормальное распределение в BUGS определяется точностью = 1/дисперсия, поэтому prec[i] ‹- 1/(1/sigma.y + 1/sigma.x). Предполагая, что сигма - это точность, хотя это сбивает с толку обозначение, потому что сигма обычно является стандартным отклонением.

person Chris Jackson    schedule 19.04.2013