JAGS - применить функцию ко всем узлам параметров

Я новичок в JAGS, и я запускаю модель в R через пакет R2jags. Код модели основан на коде, взятом из Kéry & Schaub 2012 («Байесовский анализ населения с использованием WinBUGS»), стр. 399.

Вычисляется мера расхождения хи-квадрат.

model { 
....
for(g in 1:G) {
  for (t in 1:T) {
    ...
    E[g,t] <- pow((y[g,t] - eval[g,t]),2) / eval[g,t]
    ...
  }#t
}#g

fit <- sum(E[,])

}#model

где g и t - это места и временные индексы, а G и T - количество мест и количество лет.

Я получаю сообщение об ошибке

Error in jags.model(model.file, data = data, inits = init.values, n.chains = n.chains,  : 
RUNTIME ERROR:
Compilation error on line 140.
Cannot evaluate subset expression for fit

Это вызвано другим синтаксисом, используемым JAGS по сравнению с WinBUGS? Код тот же, что и в книге, за исключением того, что у меня два измерения вместо трех, как в примере с книгой.


person Quechua    schedule 24.03.2017    source источник


Ответы (1)


Чтобы ответить на последнюю часть вашего вопроса, нет, эта ошибка не вызвана другим синтаксисом в JAGS (хотя сообщение об ошибке может выглядеть по-другому в BUGS).

На самом деле я не вижу ничего плохого в опубликованном вами фрагменте кода, и следующий воспроизводимый пример показывает, что он работает, по крайней мере, когда y и eval указаны в данных:

m <- 'model { 
for(g in 1:G) {
  for (t in 1:T) {
    E[g,t] <- pow((y[g,t] - eval[g,t]),2) / eval[g,t]
  }#t
}#g

fit <- sum(E[,])

#data# G, T, y, eval
#monitor# fit

}#model
'

library('runjags')

G=T <- 10
y <- matrix(rnorm(100), nrow=G, ncol=T)
eval <- matrix(rnorm(100), nrow=G, ncol=T)

results <- run.jags(m)

Вы проверили, к чему относится строка 140? Либо строка 140 - это то, что вы не показывали, либо, возможно, вы указали либо fit, либо E где-то еще в модели с другим количеством измерений?

Если это не так, и вы по-прежнему получаете сообщение об ошибке, добавьте к своему вопросу минимальный воспроизводимый пример, который показывает проблему (желательно под строкой --- EDIT --- ниже того, что вы уже написали), и мы можем попробовать чтобы помочь с этим.

Мэтт

person Matt Denwood    schedule 26.03.2017
comment
Спасибо, Мэтт, строка 140 - это fit <- sum(E[,]), показанная в коде, я не указал ее, извините! Я попробую с минимально воспроизводимым примером, тогда - person Quechua; 27.03.2017