Узел, несовместимый с родителями в модели JAGS (R)

Я новичок в JAGS и пытаюсь провести простую логистическую регрессию. Мой файл данных очень прост: ответ является двоичным, и один используемый мной предиктор имеет три уровня. Как это:

col1: 1 2 2 2 1 1 1 2 1 2 ... 
col2: HLL, HLL, LHL, LLL, LHL, HLL ...

Фиктивная кодировка

Уровни в col2 являются HLL, LHL, LLL, Я фиктивно закодировал его и создал фрейм данных, который выглядит следующим образом:

(intercept) HLL LHL LLL
1           1   0   0   1
2           1   0   0   1
4           1   0   0   1
5           1   0   1   0
6           1   0   1   0
7           1   0   0   1

Список данных

Мой файл данных (myList), тогда выглядит так:

List of 5
$ y  : num [1:107881] 2 2 2 2 2 2 2 2 2 2 ...
$ N  : num 500
$ HLL: num [1:107881] 0 0 0 0 0 0 0 0 0 0 ...
$ LHL: num [1:107881] 0 0 0 1 1 0 0 0 0 1 ...
$ LLL: num [1:107881] 1 1 1 0 0 1 1 1 1 0 ...

я использую N=500 потому что полный кадр данных огромен, и я просто хочу проверить это.

модель

cat(

    "model {
        for( i in 1 : N ){

            y[i] ~ dbern(mu[i])
            mu[i] <- 1/(1+exp(-(a + b*HLL[i] + c*LHL[i] + d*LLL[i])))
            }

            a ~ dnorm(0, 1.0e-12)
            b ~ dnorm(0, 1.0e-12)
            c ~ dnorm(0, 1.0e-12)
            d ~ dnorm(0, 1.0e-12)

            }", file = "model.txt"

)

Бегущая модель + ошибка

model = jags.model(file = "model.txt", 
    data = myList,
    n.chains = 3, n.adapt = 500)

Я получаю ошибку

Error in jags.model(file = "model.txt", data = antPenList, n.chains = 3,  : 
Error in node y[1]
Node inconsistent with parents

1 ответ

Решение

Распределение dbern ожидает ответа в {0,1}, а не {1,2}, как кажется, что вы его закодировали, поэтому вам нужно вычесть 1 из ваших значений y.

Немного странно, что вы получаете эту ошибку, так как dbern обычно не выдает ошибку для других значений ответа (в основном она составляет <0 = 0 и>1 = 1). Вероятно, ошибка связана с тем, что ответ соответствует одному и тому же значению, но если это не помогает, вы можете попробовать следующее:

1) Попробуйте немного повысить точность ваших априорных значений для a/b/c/d - разница 10^12 довольно велика

2) вместо:

mu[i] <- 1/(1+exp(-(a + b*HLL[i] + c*LHL[i] + d*LLL[i])))

Вы могли бы написать:

logit(mu[i]) <- -(a + b*HLL[i] + c*LHL[i] + d*LLL[i])

Это также может помочь JAGS распознать это как GLM и запустить соответствующие сэмплеры - не забудьте загрузить модуль glm.

3) Установите некоторые начальные значения для a/b/c/d, которые примерно соответствуют вашим данным (возможно, полученные с использованием соответствия с glm() в R)

Я решил это с

mu[i] <- 1/(1.000001+exp(-(a + b*HLL[i] + c*LHL[i] + d*LLL[i])))
Другие вопросы по тегам