2016-09-28 12 views
0

Я получаю некоторое противоречивое поведение от run.jags() в любой модели с блоком данных и аргументом data =. Похоже, что использовать аргумент data для run.jags для реальной модели, но искать среду для чего-либо, используемого в блоке данных. Вот пример очень простой модели: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<-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 

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

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

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

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

ответ

1

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

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

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

Надежда, что помогает,

Matt

+0

Спасибо! Поскольку мне не нужна совместимость с ошибками, я просто удалил вызовы в read.jagsfile() в winbugs.extract *, которые анализируют блок данных; который должен получить меня до следующего выпуска, который решает проблему. –

+0

Да, это тоже сработает! –