Модель Пуассона в R Jags — Ошибка в узле NbBones[4] Узел, несовместимый с родителями

#r #bayesian #jags

Вопрос:

У меня есть фрейм данных, такой как ;

 Orders  Time  NbBones
1      12    21
1      34    43
2      32    0
3      21    0
2      10    0
 

И модель джагса пуассона:

 Poisson_model<-"
model 
{
  for(i in 1 : N) 
  {
    NbBones[i] ~ dpois(lambda[i])
    lambda[i] <-  alpha   Coeforder[Orders[i]]    Coeftime * Time[i] 
  }
  Coeforder[1] <- 0
  Coeforder[2] ~ dnorm(0,1)
  Coeforder[3] ~ dnorm(0,1) 
  Coeftime ~ dnorm(0,1) 
  alpha ~ dexp(1)  
}
"

data4jags <- list(Time = data$Time, NbBones = data$NbBones, Orders=data$Orders, N=length(data$Orders))


m1 <- jags.model(textConnection(Poisson_model), data = data4jags, n.chains = 3)
 

Но когда я запускаю код в R, я получаю следующее сообщение об ошибке :

 Error in jags.model(textConnection(Model1), data = data4jags, n.chains = 3) : 
  Error in node NbBones[4]
Node inconsistent with parents
 

Кто-нибудь понимает, в чем проблема в коде ? Большое спасибо за ваше время


Для Бена Болкера

Ты имеешь в виду такой код ?

 model1<-"
model 
{
  for(i in 1 : N) 
  {
    NbEVES_branche[i] ~ dpois(lambda[i])
    partial[i] <- alpha   Coeftime * Time[i]
    if (Orders[i]>1) {
    lambda[i] <-  partial[i]   Coeforder[Orders[i-1]]
}
Coeforder[1] ~ dnorm(0,1)
Coeforder[2] ~ dnorm(0,1) 
Coeftime ~ dnorm(0,1) 
alpha ~ dexp(1)  

  }
  "
 

Ответ №1:

Две вещи бросаются мне в глаза. (1) ваша модель допускает отрицательные значения для среднего значения Пуассона (хотя я ожидаю, что это даст вам другую ошибку); (2) Я был бы удивлен, если бы вам разрешили использовать массив ( Coeforder ), где первый элемент является логическим узлом (0), в то время как остальные являются стохастическими узлами. В конце концов это сработало для меня:

 dd <- read.table(header=TRUE, text = "
Orders  Time  NbBones
1      12    21
1      34    43
2      32    0
3      21    0
2      10    0
")


ddj <- c(as.list(dd), N=nrow(dd))

model1<-"model {
  for(i in 1 : N) {
    NbBones[i] ~ dpois(lambda[i])
    partial[i] <- alpha   Coeftime * Time[i]
    lambda[i] <- ifelse(Orders[i] > 1,
         partial[i]   Coeforder[max(1,Orders[i]-1)],
         partial[i])
    }
    Coeforder[1] ~ dnorm(0,1)
    Coeforder[2] ~ dnorm(0,1) 
    Coeftime ~ dnorm(0,1)
    alpha ~ dexp(1)
}"

writeLines(model1, "tmp.jags")
library(rjags)
m1 <- jags.model("tmp.jags", ddj, n.chains = 3)
 

Обратите внимание, что у JAGS нет if/else заявления. Это max(1,...) предложение необходимо, потому ifelse() что оператор всегда оценивает оба своих потенциальных результата, даже если они не будут использоваться (поэтому мы должны быть осторожны, чтобы не ссылаться на Coeforder[0] них ).

Более компактно, вы можете настроить матрицу модели X вне JAGS и использовать структуру, например lambda[i] <- exp(inprod(X[i,], beta)) , где beta находится ваш полный вектор коэффициентов (это имитирует структуру стандартного пуассоновского GLM, включая компонент логарифмической связи/экспоненциальной обратной связи).

Комментарии:

1. Привет, Бен, спасибо за быстрый ответ, я отредактировал свой код, чтобы показать вам, что я пытался сделать с вашим кодом, но у меня все равно возникает та же проблема, есть идеи, в чем проблема ?