среда поиска данных run.jags

Я получаю нелогичное поведение от run.jags() в любой модели с блоком данных и аргументом data=. Похоже, он использует аргумент данных для run.jags для фактической модели, но ищет в среде все, что используется в блоке данных. Вот пример очень простой модели:

data {
    ylen <- length(y)
}
model {
    for (i in 1:ylen) {
        y[i] ~ dnorm(mu,1)
    }
    mu ~ dnorm(0,1/10^2)
}

Если я запускаю его так, я получаю сообщение об ошибке:

> run.jags('trivial.jags',data=list(y=c(5,5,5,6)),monitor=c('ylen','mu'))
Error: The following error was obtained while attempting to parse the data:
Error in eval(expr, envir, enclos) : object 'y' not found

Однако, если я создаю переменную «y» в вызывающей среде, она используется, но очень странным образом:

> y<-c(-1,-1,-1)
> run.jags('trivial.jags',data=list(y=c(5,5,5,6)),monitor=c('ylen','mu'))
Compiling rjags model...
Calling the simulation using the rjags method...
Note: the model did not require adaptation
Burning in the model for 4000 iterations...
  |**************************************************| 100%
Running the model for 10000 iterations...
  |**************************************************| 100%
Simulation complete
Calculating summary statistics...
Note: The monitored variable 'ylen' appears to be non-stochastic; it will not be included
in the convergence diagnostic
Calculating the Gelman-Rubin statistic for 2 variables....
Finished running the simulation

JAGS model summary statistics from 20000 samples (chains = 2; adapt+burnin = 5000):

     Lower95 Median Upper95   Mean      SD Mode     MCerr MC%ofSD SSeff AC.10   psrf
ylen       3      3       3      3       0    3        --      --    --    --     --
mu    3.8339 4.9742  6.0987 4.9747 0.57625   -- 0.0040089     0.7 20661 0.011 1.0001

Таким образом, вы можете видеть, что он использовал y из вызывающей среды для вычисления длины, получая 3, но использовал значение y из списка данных для фактических данных, получая mu=5.

Если я использую rjags, он работает так, как я ожидаю, используя аргумент data= как для фактической модели, так и для вычисления производных переменных в блоке данных.

Это баг в ранджегах? Как я могу заставить его использовать аргумент data= для run.jags() для вычислений в блоке данных?

Я пробовал это на runjags_2.0.3-2 и runjags_2.0.4-2.


person Terran Melconian    schedule 28.09.2016    source источник


Ответы (1)


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

Тем временем возможные обходные пути заключаются в том, чтобы вычислить ylen в R и передать его в JAGS в списке данных (также см. конструкцию #data# в самой модели) или использовать length(y) напрямую в модели, например:

model {
for (i in 1:length(y)) {
    y[i] ~ dnorm(mu,1)
}
mu ~ dnorm(0,1/10^2)
}

Надеюсь, это поможет,

Мэтт

person Matt Denwood    schedule 29.09.2016
comment
Спасибо! Поскольку мне не нужна совместимость с ошибками, я просто удалил вызовы в read.jagsfile() для winbugs.extract*, которые анализируют блок данных; это должно помочь мне до следующего выпуска, который решит эту проблему. - person Terran Melconian; 29.09.2016