Ошибка оператора сбора c при вызове OpenBUGS из R

Я пытаюсь использовать R2OpenBUGS для запуска решателя дифференциальных уравнений в OpenBUGS. Я попробовал это с примером экспоненциального распада (Example01.odc) в папке OpenBUGS/Diff/Examples.

Первая часть этого примера — симуляция, вторая — версия логического вывода, которую я пытаюсь применить. Оба работают нормально прямо в OpenBUGS.

Когда я пытаюсь запустить его из R, я получаю сообщение об ошибке в журнале:

expected the collection operator c error pos 1443
variable ngrid is not defined 

Я думаю, что второй является продолжением первого.

Ниже приведен код, который я закодировал для запуска из R:

# example of adjusting a differential equation using OpenBUGS   
library(R2OpenBUGS)
library(coda)
workingdir <- "M:/data/R/OpenBUGSDiff"
setwd(workingdir)
# time points
tgrid <- c(0.00000, 0.20000, 0.40000, 0.60000, 0.80000,
       1.00000, 1.20000, 1.40000, 1.60000, 1.80000,
       2.00000, 2.20000, 2.40000, 2.60000, 2.80000,
       3.00000, 3.20000, 3.40000, 3.60000, 3.80000,
       4.00000, 4.20000, 4.40000, 4.60000, 4.80000,
       5.00000, 5.20000, 5.40000, 5.60000, 5.80000,
       6.00000, 6.20000, 6.40000, 6.60000, 6.80000,
       7.00000, 7.20000, 7.40000, 7.60000, 7.80000,
       8.00000, 8.20000, 8.40000, 8.60000, 8.80000,
       9.00000, 9.20000, 9.40000, 9.60000, 9.80000,
       10.00000)
obs <- c(  0.7887,1.241,0.7051,0.7388,0.3903,
    0.2632,0.1174,0.549,-0.1767,0.02938,
    0.154,0.1465,0.07878,-0.5569,0.01293,
    0.2905,-0.2665,-0.3881,0.02517,-0.138,
    0.4004,0.2859,-0.1217,0.3961,0.3813,
    0.1846,-0.3581,0.3293,0.04089,0.01972,
    0.3203,0.5294,-0.1389,-0.3732,0.1341,
    -0.02432,0.2261,-0.3612,0.3131,-0.258,
    0.02948,-0.0208,0.1066,0.3796,-0.2645,
    0.1035,0.1001,-0.2415,0.06739,-0.1554,
    -0.2388)
# inference model 
Modele <- function() 
{
  solution[1:ngrid, 1] <- 
    ode(init[1], 
        tgrid[1:ngrid], 
        D(C[1], t), 
        origin, 
        tol)
  D(C[1], t) <- -lambda * C[1] 
  log.lambda ~ dnorm(0.0, tau.lambda); 
  lambda <- exp(log.lambda)
  for (i in 1:ngrid) 
  {
    obs[i] ~ dnorm(solution[i, 1], tau) 
  }
  tau ~ dgamma(a, b)
}
write.model(Modele,"Diff.txt")
# data definition
origin = 0.0
tol = 1.0E-3
ngrid = 51 
init = c(1.0)
a = 0.001
b = 0.001
tau.lambda = 0.01
data  <- list(obs=obs,
          tgrid=tgrid,
          origin=origin,
          tol=tol,
          ngrid=ngrid,
          init=init,
          a=a,
          b=b,
          tau.lambda=tau.lambda)
inits <- function(){
  list(log.lambda = 1.0,tau = 0.01)
}
diff.inf <- bugs(data,inits,model.file = "Diff.txt",
              parameters = c("lambda","tau"),
              n.chains = 1, n.iter = 3000,n.burnin=500,n.thin=10,
              working.directory=workingdir,
              debug = TRUE,
              codaPkg=T)

А вот полное сообщение об ошибке от BUGS:

model is syntactically correct
expected the collection operator c error pos 1443
variable ngrid is not defined
model must have been compiled but not updated to be able to change RN generator
BugsCmds:NoCompileInits
model must be compiled before generating initial values
model must be initialized before updating
model must be initialized before monitors used
model must be initialized before monitors used
model must be initialized before monitors used
model must be initialized before DIC can be monitored
model must be initialized before updating
model must be initialized before monitors used
DIC monitor not set

Я попытался заменить «C []» в модели на «obs», так как не вижу, где определяется «C», но это ничего не изменило.

Я проверил «e» вместо «E» в обозначении научного числа, которое было предложено в другом месте для создания ошибок «переменная не определена» в BUGS, но это, похоже, не проблема.

Приветствуются любые идеи или любой другой код, который показывает, как использовать «решение» или «оду» из R.

заранее спасибо

Оливер


person user3668127    schedule 23.05.2014    source источник


Ответы (1)


Существует ошибка BUGS, связанная с узлом init. В приведенной выше модели у вас есть связанный с ней индекс (init[1]), но в данных вы предоставляете только одно значение init = c(1.0). Я думаю, что BUGS путается здесь с индексом (т.е. он ожидает два или более значений инициализации в данных, где вы предоставляете только одно). Проблема исчезает, когда вы заменяете init[1] на init в модели.

#BUGS model
model{
  solution[1:ngrid, 1] <-  ode(init,  tgrid[1:ngrid],    D(C[1], t),    origin,     tol)
  D(C[1], t) <- -lambda * C[1] 
  log.lambda ~ dnorm(0.0, tau.lambda); 
  lambda <- exp(log.lambda)
  for (i in 1:ngrid) {
    obs[i] ~ dnorm(solution[i, 1], tau) 
  }
  tau ~ dgamma(a, b)
}

#data
list(obs = c(0.7887, 1.241, 0.7051, 0.7388, 0.3903, 0.2632, 0.1174, 0.549, -0.1767, 0.02938, 0.154, 0.1465, 0.07878, -0.5569, 0.01293, 0.2905, -0.2665, -0.3881, 0.02517, 0.138, 0.4004, 0.2859, -0.1217, 0.3961, 0.3813, 0.1846, -0.3581, 0.3293, 0.04089, 0.01972, 0.3203, 0.5294, -0.1389, -0.3732, 0.1341, -0.02432, 0.2261, -0.3612, 0.3131, -0.258, 0.02948, -0.0208, 0.1066, 0.3796, -0.2645, 0.1035, 0.1001, -0.2415, 0.06739, -0.1554, -0.2388), 
tgrid = c(0, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8, 2,  2.2, 2.4, 2.6, 2.8, 3, 3.2, 3.4, 3.6, 3.8, 4, 4.2, 4.4, 4.6,  4.8, 5, 5.2, 5.4, 5.6, 5.8, 6, 6.2, 6.4, 6.6, 6.8, 7, 7.2,  7.4, 7.6, 7.8, 8, 8.2, 8.4, 8.6, 8.8, 9, 9.2, 9.4, 9.6, 9.8,  10),
origin = 0, tol = 0.001, ngrid = 51, init = 1, a = 0.001,  b = 0.001, tau.lambda = 0.01))

#inits
list(log.lambda = 1.0,tau = 0.01)

Если вы замените указанную выше модель на свою предыдущую модель (Modele), все должно работать с R гладко.

Общая точка зрения: мне кажется, что гораздо проще устранять ошибки в OpenBUGS напрямую (используя приведенный выше скрипт и графический интерфейс для компиляции, загрузки данных и инициализации), чем через R2OpenBUGS.

person guyabel    schedule 23.05.2014
comment
Спасибо за решение, оно сработало. В качестве дополнительной информации: исходный пример был запрограммирован для нескольких дифференциальных уравнений, вот откуда взялась странная инициализация. - person user3668127; 27.05.2014