2017-09-07 3 views
0

Pour le modèle de régression logistique ci-dessous, je veux pouvoir échantillonner à partir de la loi a posteriori en utilisant des valeurs non entières pour n (et y). Cela peut se produire dans ce type de modèle lorsque des données partielles sont disponibles ou qu'il est souhaitable de réduire le poids.Modèles de régression logistique JAGS avec poids non entiers

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 exige des valeurs entières de n et renvoie donc une erreur dans le cas de n non entier.

J'ai lu qu'il devrait être possible de le faire avec les as de tour, mais n'ont pas réussi à le faire fonctionner correctement. Aide appréciée.

Répondre

1

Comme vous l'avez dit, vous devriez être capable de le faire avec l'astuce. La partie difficile codifie correctement la vraisemblance binomiale parce que JAGS n'a pas de fonction de coefficient binomial. Cependant, there are ways to do this. Le modèle ci-dessous devrait être capable de faire ce que vous voulez. Pour une explication plus précise de l'astuce, 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

Cela fonctionne très bien! Merci beaucoup. Ai-je raison de penser que le bin_co est inutile puisqu'il s'agit d'une constante en alpha? –

+0

Non, 'bin_co' est très nécessaire car il change avec chaque point de données (c'est le coefficient binomial). Comme 'n' et' y' changent avec chaque point de données, il en va de même pour 'bin_co'. La deuxième raison pour laquelle cela est nécessaire est que le coefficient binomial fait partie de la vraisemblance binomiale. Si vous le supprimez, vous n'utilisez plus de probabilité binomiale dans votre analyse. –