Як я можу моделювати пропорцію BUGS / JAGS / STAN?


10

Я намагаюся побудувати модель, де відповідь є пропорційною (це фактично частка голосів, яку отримує партія в округах). Її розподіл не є нормальним, тому я вирішив моделювати його бета-розподілом. У мене також є кілька прогнозів.

Однак я не знаю, як це написати в BUGS / JAGS / STAN (JAGS був би найкращим моїм вибором, але це насправді не має значення). Моя проблема полягає в тому, що я складаю суму параметрів за допомогою предикторів, але що тоді я можу зробити з цим?

Код буде що - щось на зразок цього (в синтаксисі щербини), але знає , що Дон »як" ланка " y_hatі 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 близький до математичного синтаксису. Таким чином, якщо ви знаєте, як написати свою модель математичною мовою, то майже вся робота виконана.
Стефан Лоран

Стефане, дякую. Я редагував питання, щоб визначити a, b, y_hat. Я не знаю відповіді математично, інакше відповідь була б набагато простішою ;-)
Joël

Я підозрюю, що міг би побудувати на тому, що E (y) = альфа / (альфа + бета), але я не можу реально зрозуміти, як саме.
Joël

Відповіді:


19

Бета-регресійний підхід полягає в перемараторії з точки зору та . Де буде еквівалентно y_hat, який ви прогнозуєте. У цій параметризації у вас буде та . Тоді ви можете моделювати як logit лінійної комбінації. може мати власний попередній (повинен бути більшим за 0), або можна моделювати також на коваріатах ​​(виберіть функцію зв'язку, щоб вона не перевищувала 0, наприклад, експоненціальна).ϕ μ α = μ × ϕ β = ( 1 - μ ) × ϕ μ ϕμϕμα=μ×ϕβ=(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 або нижче, і це призводить до помилки.
Грег Сніг

Ні, я перевірив це, всі мої значення y суворо перевершують 0 (і поступаються 1). Можливо, мої пріори в якийсь момент стикаються з емпіричними значеннями y? Але я не знаю, як це перевірити, і мої пріори здаються розумними - принаймні мені!
Joël

1
@colin, я так добре не знаю JAGS, тому це може бути краще запитати на форумі спеціально для JAGS. Або спробуйте в іншому інструменті, я вважаю, що мені подобається Стен для Байєса в наші дні.
Грег Сніг

18

Грег Сноу дав чудову відповідь. Для повноти ось еквівалент у синтаксисі Стен. Хоча в Стен є бета-розподіл, який ви могли використовувати, швидше самостійно опрацювати логарифм бета-щільності, оскільки константи 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
}

Дякую Бен! Дуже корисно мати і синтаксис Стен.
Joël

Stan v2 має вибіркову заяву "beta_proportion", яка, на мою думку, ухиляється від необхідності безпосередньо маніпулювати "lp__"
THK
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.