2013-04-17 2 views
2

я пытаюсь использовать WinBUGS из R через BRugs и R2WinBUGS, код followinig:несколько определений ошибок узла в winbugs

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.

ответ

2

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

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

Вы бы тогда иметь различное априорное распределение (что-то только положительное) на каждую толерантности ш [я].

+0

Почему это нормально для 'x [i]' для логического определения, но не 'y [i]'? –

+0

@ChristianBueno, потому что 'y [i]' также определяется в данных. чтобы определить его снова, поскольку неслучайный узел будет вторым (множественное определение). 'x [i]' является новым (а не в данных), поэтому он может быть логическим или случайным. – gjabel

1

В вашей модели 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). Предполагая, что сигма - это точность - хотя это путаная нотация, потому что сигма обычно является стандартным отклонением.

Смежные вопросы