Модели логистической регрессии JAGS с нецелыми весами

Для модели логистической регрессии ниже я хочу иметь возможность производить выборку из апостериорного, используя нецелочисленные значения для n (и y). Это может происходить в такой модели, когда доступны частичные данные или желательно снизить вес.

model <- function() {
    ## Specify likelihood
    for (i in 1:N1) {
        y[i] ~ dbin(p[i], n[i])
        logit(p[i]) <- log.alpha[1] + alpha[2] * d[i]
    }
   ## Specify priors
   alpha[1] <- exp(log.alpha[1])
   alpha[2] <- exp(log.alpha[2])
   Omega[1:2, 1:2] <- inverse(p2[, ])
   log.alpha[1:2] ~ dmnorm(p1[], Omega[, ])
 }

dbin требует целочисленных значений для n и поэтому возвращает ошибку в случае, если n не является целым.

Я читал, что это должно быть возможно сделать с помощью одного трюка, но мне не удалось заставить его работать правильно. Помощь приветствуется.


person Peter Dutton    schedule 07.09.2017    source источник


Ответы (1)


Как вы сказали, у вас должно получиться сделать это с помощью трюка с одними. Сложность заключается в правильном кодировании биномиального правдоподобия, потому что JAGS не имеет функции биномиальных коэффициентов. Однако есть способы сделать это. Модель ниже должна уметь делать то, что вы хотите. Для более конкретного объяснения трюка с одним, см. Мой ответ здесь.

data{
  C <- 10000
  for(i in 1:N1){
    ones[i] <- 1
  }
}
 model{
for(i in 1:N1){
# calculate a binomial coefficient
bin_co[i] <- exp(logfact(n[i]) - (logfact(y[i]) + logfact(n[i] - y[i])))
# logit p
logit(p[i]) <- log.alpha[1] + alpha[2] * d[i]
# calculate a binomial likelihood using ones trick
prob[i] <- (bin_co[i]*(p[i]^y[i])) * ((1-p[i])^(n[i] - y[i]))
# put prob in Bernoulli trial and divide by large constant
ones[i] ~ dbern(prob[i]/C)
}
## Specify priors
alpha[1] <- exp(log.alpha[1])
alpha[2] <- exp(log.alpha[2])
Omega[1:2, 1:2] <- inverse(p2[, ])
log.alpha[1:2] ~ dmnorm(p1[], Omega[, ])
}
person mfidino    schedule 07.09.2017
comment
Это прекрасно работает! Большое Вам спасибо. Правильно ли я считаю, что bin_co не нужен, поскольку он является константой в альфа-канале? - person Peter Dutton; 07.09.2017
comment
Нет, bin_co очень необходим, поскольку он изменяется с каждой точкой данных (то есть биномиальным коэффициентом). Поскольку n и y изменяются с каждой точкой данных, меняется и bin_co. Вторая причина, по которой это необходимо, заключается в том, что биномиальный коэффициент является частью биномиального правдоподобия. Если вы удалите его, вы больше не будете использовать биномиальную вероятность в своем анализе. - person mfidino; 07.09.2017