BUGS / JAGS / STAN으로 비율을 어떻게 모델링 할 수 있습니까?


10

응답이 비례하는 모델을 만들려고합니다 (실제로 정당이 선거구에서 얻는 투표의 비율입니다). 분포는 정상적이지 않기 때문에 베타 분포로 모델링하기로 결정했습니다. 또한 여러 예측 변수가 있습니다.

그러나 BUGS / JAGS / STAN으로 작성하는 방법을 모르겠습니다 (JAGS가 최선의 선택이지만 실제로 중요하지는 않습니다). 내 문제는 예측 변수로 매개 변수를 합한 것인데 어떻게해야합니까?

이 코드는 (JAGS 구문에서) 이와 비슷하지만 y_hatand 및 y매개 변수 를 "링크"하는 방법을 모르겠습니다 .

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

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

( y_hat모수와 예측 변수의 교차 곱이므로 결정 론적 관계입니다. a그리고 예측 b하려고하는 계수입니다 x.)

제안 해 주셔서 감사합니다!


a, b, y_hat은 무엇입니까? 모델을 명확하게 정의해야합니다. 그건 그렇고 BUGS 구문은 수학 구문에 가깝습니다. 따라서 수학적 언어로 모델을 작성하는 방법을 알고 있다면 거의 모든 작업이 완료됩니다.
Stéphane Laurent

스테판, 고마워 a, b, y_hat을 정의하기 위해 질문을 편집했습니다. 나는 수학적으로 답을 모릅니다. 그렇지 않으면 대답은 실제로 훨씬 쉬울 것입니다 ;-)
Joël

나는 E (y) = alpha / (alpha + beta)라는 사실을 기반으로 할 수 있다고 생각하지만 실제로 얼마나 정확한지 알 수는 없습니다.
Joël

답변:


19

베타 회귀 접근법은 ϕ의 관점에서 매개 변수를 재조정하는 것입니다 . 여기서 μ 는 예측 한 y_hat과 같습니다. 이 파라미터 설정에서 α = μ × ϕβ = ( 1 μ ) × ϕ가 됩니다. 그런 다음 μ 를 선형 조합의 로짓으로 모델링 할 수 있습니다 . ϕ 는 고유 한 사전 값을 갖거나 (0보다 커야 함) 공변량에 대해 모델링 될 수 있습니다 (지수와 같이 0보다 크게 유지하기 위해 링크 함수 선택).μϕμα=μ×ϕβ=(1μ)×ϕμϕ

아마도 다음과 같습니다.

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)

감사합니다. 매우 도움이됩니다. 나는 당신의 조언으로 모델을 맞추려고합니다.
Joël

그러나 모델을 실행할 때 "노드 y [6283] 잘못된 부모 값 오류"와 같은 오류가 발생합니다. 여기서 무슨 일이 일어나고 있습니까?
Joël

@ Joël, y [6283]의 가치는 무엇입니까? 알파 및 베타 값이 유효한 값으로 제한되어 있는지 확인 했습니까? 뭔가가 0 이하로 떨어졌을 수 있으며 오류가 발생합니다.
Greg Snow

아니오, 나는 모든 y 값이 0보다 엄격하게 우수하다는 것을 확인했습니다 (1보다 열등합니다). 어쩌면 내 이전의 경험이 경험적인 y 값과 충돌 할 수 있습니까? 그러나 나는 이것을 확인하는 방법을 모른다. 그리고 나의 선행은 적어도 나에게 합리적인 것처럼 보인다!
Joël

1
@colin, JAGS를 잘 모르므로 JAGS 전용 포럼에서 더 나은 질문을 할 수 있습니다. 또는 다른 도구로 사용해보십시오. 요즘 Stan for Bayes를 좋아한다는 것을 알았습니다.
Greg Snow

18

그렉 스노우 (Greg Snow)는 큰 대답을했습니다. 완성도를 위해 Stan 구문과 동일합니다. 스탠은 당신이 사용할 수있는 베타 분포를 가지고 있지만, 그것은 상수 자신 때문에 베타 밀도의 로그 아웃 작업을 빠르게 log(y)하고는 log(1-y)처음 (이 아니라 때마다 한 번에 계산할 수있다 y ~ beta(alpha,beta)라는 것을). 예약 lp__변수를 늘리면 (아래 참조) 샘플의 관측치에 대한 베타 밀도의 로그를 합할 수 있습니다. 선형 예측 변수의 모수 벡터에 레이블 "감마"를 사용합니다.

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
}

고마워 벤! Stan 구문도 매우 유용합니다.
Joël

Stan v2에는 "lp__"를 직접 조작 할 필요가 없다고 생각되는 "beta_proportion"샘플링 문장이 있습니다.
THK
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.