Comment puis-je modéliser une proportion avec BUGS / JAGS / STAN?


10

J'essaie de construire un modèle où la réponse est une proportion (c'est en fait la part des votes qu'un parti obtient dans les circonscriptions). Sa distribution n'est pas normale, j'ai donc décidé de le modéliser avec une distribution bêta. J'ai également plusieurs prédicteurs.

Cependant, je ne sais pas comment l'écrire dans BUGS / JAGS / STAN (JAGS serait mon meilleur choix, mais cela n'a pas vraiment d'importance). Mon problème est que je fais une somme de paramètres par prédicteurs, mais que puis-je en faire?

Le code serait quelque chose comme ça (dans la syntaxe JAGS), mais je ne sais pas comment "lier" les paramètres y_hatet y.

for (i in 1:n) {
 y[i] ~ dbeta(alpha, beta)

 y_hat[i] <- a + b * x[i]
}

( y_hatn'est que le produit croisé des paramètres et des prédicteurs, d'où la relation déterministe. aet bsont les coefficients que j'essaie d'estimer, xétant un prédicteur).

Merci pour vos suggestions!


Que sont a, b, y_hat? Vous devez définir clairement votre modèle. Par ailleurs, la syntaxe BUGS est proche de la syntaxe mathématique. Ainsi, si vous savez écrire votre modèle en langage mathématique, presque tout le travail est fait.
Stéphane Laurent

Stéphane, merci. J'ai édité la question pour définir a, b, y_hat. Je ne connais pas non plus la réponse mathématiquement, sinon la réponse serait en effet beaucoup plus facile ;-)
Joël

Je soupçonne que je pourrais construire sur le fait que E (y) = alpha / (alpha + beta), mais je ne peux pas vraiment comprendre exactement comment.
Joël

Réponses:


19

L'approche de régression bêta consiste à reparamétrer en termes de et ϕ . Où μ sera l'équivalent de y_hat que vous prédisez. Dans ce paramétrage, vous aurez α = μ × ϕ et β = ( 1 - μ ) × ϕ . Ensuite, vous pouvez modéliser μ comme logit de la combinaison linéaire. ϕ peut avoir son propre a priori (doit être supérieur à 0), ou peut également être modélisé sur des covariables (choisissez une fonction de lien pour la maintenir supérieure à 0, comme exponentielle).μϕμα=μ×ϕβ=(1-μ)×ϕμϕ

Peut-être quelque chose comme:

for(i in 1:n) {
  y[i] ~ dbeta(alpha[i], beta[i])
  alpha[i] <- mu[i] * phi
  beta[i]  <- (1-mu[i]) * phi
  logit(mu[i]) <- a + b*x[i]
}
phi ~ dgamma(.1,.1)
a ~ dnorm(0,.001)
b ~ dnorm(0,.001)

Merci, c'est très utile! J'essaie d'adapter un modèle à vos conseils.
Joël

Cependant, lorsque j'exécute le modèle, j'obtiens des erreurs telles que: "Erreur dans le nœud y [6283] Valeurs parent invalides". Une idée de ce qui se passe ici?
Joël

@ Joël, quelle est la valeur de y [6283]? vous êtes-vous assuré que les valeurs des alphas et des bêtas sont limitées aux valeurs légales? Je m'attends à ce que quelque chose soit passé à 0 ou en dessous et cela donne l'erreur.
Greg Snow

Non, j'ai vérifié que toutes mes valeurs y sont strictement supérieures à 0 (et inférieures à 1). Peut-être que mes prieurs se heurtent aux valeurs empiriques y à un moment donné? Mais je ne sais pas comment vérifier cela, et mes prieurs semblent raisonnables - du moins pour moi!
Joël

1
@colin, je ne connais pas bien JAGS, donc il vaut mieux le demander sur un forum spécialement pour JAGS. Ou essayez-le dans un outil différent, je trouve que j'aime Stan pour Bayes de nos jours.
Greg Snow

18

Greg Snow a donné une excellente réponse. Pour être complet, voici l'équivalent dans la syntaxe Stan. Bien que Stan ait une distribution bêta que vous pourriez utiliser, il est plus rapide d'élaborer vous-même le logarithme de la densité bêta car les constantes log(y)et log(1-y)peuvent être calculées une fois au début (plutôt qu'à chaque fois que y ~ beta(alpha,beta)vous les appelleriez). En incrémentant la lp__variable réservée (voir ci-dessous), vous pouvez additionner le logarithme de la densité bêta sur les observations de votre échantillon. J'utilise l'étiquette "gamma" pour le vecteur de paramètre dans le prédicteur linéaire.

data {
  int<lower=1> N;
  int<lower=1> K;
  real<lower=0,upper=1> y[N];
  matrix[N,K] X;
}
transformed data {
  real log_y[N];
  real log_1my[N];
  for (i in 1:N) {
    log_y[i] <- log(y[i]);
    log_1my[i] <- log1m(y[i]);
  }
}
parameters {
  vector[K] gamma;
  real<lower=0> phi;
}
model {
  vector[N] Xgamma;
  real mu;
  real alpha_m1;
  real beta_m1;
  Xgamma <- X * gamma;
  for (i in 1:N) {
    mu <- inv_logit(Xgamma[i]);
    alpha_m1 <- mu * phi - 1.0;
    beta_m1 <- (1.0 - mu) * phi - 1.0;
    lp__ <- lp__ - lbeta(alpha,beta) + alpha_m1 * log_y[i] + 
                                        beta_m1 * log_1my[i];
  }
  // optional priors on gamma and phi here
}

Merci Ben! Très utile d'avoir également la syntaxe Stan.
Joël

Stan v2 a une déclaration d'échantillonnage "beta_proportion" qui, je crois, évite la nécessité de manipuler directement "lp__"
THK
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.