2017-09-07 64 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'也是如此。第二個原因是必要的,因爲二項式係數是二項式可能性的一部分。如果將其刪除,則在分析中不再使用二項式可能性。 –