具有非整数权重的JAGS逻辑回归模型

时间:2017-09-07 14:16:09

标签: r bayesian 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的情况下返回错误。

我已经读过,应该可以通过一些技巧来实现这一点,但却未能使其正常工作。帮助赞赏。

1 个答案:

答案 0 :(得分:1)

正如你所说,你应该能够用一招来做到这一点。困难的部分是正确编码二项式似然,因为JAGS没有二项式系数函数。但是,there are ways to do this。下面的模型应该能够做你想做的事情。有关这一技巧的更具体解释,see my answer here

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[, ])
}