Como posso modelar uma proporção com BUGS / JAGS / STAN?

10

Estou tentando construir um modelo em que a resposta seja proporcional (na verdade, é a parcela de votos que um partido obtém nos círculos eleitorais). Sua distribuição não é normal, então decidi modelá-la com uma distribuição beta. Eu também tenho vários preditores.

No entanto, não sei como escrevê-lo em BUGS / JAGS / STAN (JAGS seria minha melhor escolha, mas isso realmente não importa). Meu problema é que eu faço uma soma de parâmetros pelos preditores, mas o que posso fazer com isso?

O código seria algo assim (na sintaxe JAGS), mas não sei como "vincular" os parâmetros y_hate y.

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

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

( y_haté apenas o produto cruzado de parâmetros e preditores, daí a relação determinística. ae bsão os coeficientes que tento estimar, xsendo preditores).

Obrigado por suas sugestões!

Joël
fonte
O que são a, b, y_hat? Você deve definir claramente seu modelo. A propósito, a sintaxe do BUGS está próxima da sintaxe matemática. Portanto, se você sabe escrever seu modelo em linguagem matemática, quase todo o trabalho está feito.
Stéphane Laurent
Stéphane, obrigado. Editei a pergunta para definir a, b, y_hat. Eu não sei a resposta matematicamente quer, caso contrário, a resposta seria certamente muito mais fácil ;-)
Joël
Suspeito que eu possa desenvolver o fato de que E (y) = alfa / (alfa + beta), mas não consigo descobrir exatamente como exatamente.
Joël

Respostas:

19

μϕμα=μ×ϕβ=(1μ)×ϕμϕ

Possivelmente algo como:

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)
Greg Snow
fonte
Obrigado, isso é muito útil! Estou tentando encaixar um modelo com o seu conselho.
Joël
No entanto, quando executo o modelo, obtenho erros como: "Erro no nó y [6283] Valores pai inválidos". Alguma idéia do que está acontecendo aqui?
Joël
@ Joël, qual é o valor de y [6283]? você certificou-se de que os valores dos alfas e betas sejam restritos aos valores legais? Espero que algo tenha ido para 0 ou abaixo e que dê o erro.
Greg Neve
Não, verifiquei que todos os meus valores y são estritamente superiores a 0 (e inferiores a 1). Talvez meus prévios colidam com os valores empíricos y em algum momento? Mas não sei como verificar isso, e meus anteriores parecem sensatos - pelo menos para mim!
Joël
11
@colin, eu não conheço JAGS tão bem, então isso pode ser melhor solicitado em um fórum especificamente para JAGS. Ou tente em uma ferramenta diferente, acho que gosto de Stan para Bayes hoje em dia.
Greg Neve
18

Greg Snow deu uma ótima resposta. Para completar, aqui está o equivalente na sintaxe Stan. Embora Stan tenha uma distribuição beta que você possa usar, é mais rápido calcular o logaritmo da densidade beta, porque as constantes log(y)e log(1-y)podem ser calculadas uma vez desde o início (e não sempre que y ~ beta(alpha,beta)seria chamado). Ao incrementar a lp__variável reservada (veja abaixo), você pode somar o logaritmo da densidade beta sobre as observações em sua amostra. Eu uso o rótulo "gama" para o vetor de parâmetro no preditor linear.

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
}
Ben Goodrich
fonte
Obrigado Ben! Muito útil ter a sintaxe Stan também.
Joël
Stan v2 tem uma "beta_proportion" amostragem declaração que eu acredito que elimina a necessidade de manipular diretamente "lp__"
THK