2017-09-07 61 views
0

对于下面的逻辑回归模型,我希望能够使用n(和y)的非整数值从后验进行采样。当部分数据可用或希望降低体重是可取的时,这可以发生在这种模型中。具有非整数权重的JAGS逻辑回归模型

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

正如你所说,你应该可以用这个技巧来做到这一点。困难的部分是正确地编码二项式可能性,因为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[, ]) 
} 
+0

This works great!非常感谢你。我是否认为bin_co是不必要的,因为它是alpha中的常量? –

+0

不,'bin_co'是非常必要的,因为它随每个数据点而变化(即二项系数)。由于'n'和'y'随每个数据点而变化,'bin_co'也是如此。第二个原因是必要的,因为二项式系数是二项式可能性的一部分。如果将其删除,则在分析中不再使用二项式可能性。 –