Як я можу моделювати пропорцію 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.