Wie kann ich einen Anteil mit BUGS / JAGS / STAN modellieren?

10

Ich versuche, ein Modell zu erstellen, bei dem die Antwort ein Anteil ist (es ist tatsächlich der Stimmenanteil, den eine Partei in Wahlkreisen erhält). Die Verteilung ist nicht normal, daher habe ich beschlossen, sie mit einer Beta-Verteilung zu modellieren. Ich habe auch mehrere Prädiktoren.

Ich weiß jedoch nicht, wie ich es in BUGS / JAGS / STAN schreiben soll (JAGS wäre meine beste Wahl, aber es spielt keine Rolle). Mein Problem ist, dass ich eine Summe von Parametern durch Prädiktoren mache, aber was kann ich dann damit machen?

Der Code wäre ungefähr so ​​(in JAGS-Syntax), aber ich weiß nicht, wie ich die y_hatund y-Parameter "verknüpfen" soll .

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

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

( y_hatist nur das Kreuzprodukt von Parametern und Prädiktoren, daher die deterministische Beziehung. aUnd bsind die Koeffizienten, die ich xals Prädiktor zu schätzen versuche ).

Vielen Dank für Ihre Vorschläge!

Joël
quelle
Was sind a, b, y_hat? Sie sollten Ihr Modell klar definieren. Übrigens ist die BUGS-Syntax der mathematischen Syntax sehr ähnlich. Wenn Sie also wissen, wie Sie Ihr Modell in mathematischer Sprache schreiben, ist fast die gesamte Arbeit erledigt.
Stéphane Laurent
Stéphane, danke. Ich habe die Frage bearbeitet, um a, b, y_hat zu definieren. Ich kenne die Antwort auch mathematisch nicht, sonst wäre die Antwort in der Tat viel einfacher ;-)
Joël
Ich vermute, dass ich auf der Tatsache aufbauen könnte, dass E (y) = Alpha / (Alpha + Beta), aber ich kann nicht wirklich herausfinden, wie genau.
Joël

Antworten:

19

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

Möglicherweise so etwas wie:

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
quelle
Danke, das ist sehr hilfreich! Ich versuche, ein Modell mit Ihrem Rat zu versehen.
Joël
Wenn ich das Modell ausführe, erhalte ich jedoch folgende Fehler: "Fehler im Knoten y [6283] Ungültige übergeordnete Werte". Irgendeine Idee, was hier los ist?
Joël
@ Joël, was ist der Wert von y [6283]? Haben Sie sichergestellt, dass die Werte der Alphas und Betas auf gesetzliche Werte beschränkt sind? Ich gehe davon aus, dass etwas auf 0 oder darunter gefallen ist und dies den Fehler ergibt.
Greg Snow
Nein, ich habe überprüft, dass alle meine y-Werte 0 (und 1) streng überlegen sind. Vielleicht kollidieren meine Prioritäten irgendwann mit den empirischen y-Werten? Aber ich weiß nicht, wie ich das überprüfen soll, und meine Vorgesetzten scheinen vernünftig - zumindest für mich!
Joël
1
@colin, ich kenne JAGS nicht so gut, daher kann dies in einem Forum speziell für JAGS besser abgefragt werden. Oder probieren Sie es in einem anderen Tool aus. Ich finde, dass ich Stan for Bayes heutzutage mag.
Greg Snow
18

Greg Snow gab eine großartige Antwort. Der Vollständigkeit halber ist hier das Äquivalent in der Stan-Syntax. Obwohl Stan eine Beta-Verteilung hat, die Sie verwenden könnten, ist es schneller, den Logarithmus der Beta-Dichte selbst zu berechnen, da die Konstanten log(y)und log(1-y)zu Beginn einmal berechnet werden können (anstatt jedes Mal, y ~ beta(alpha,beta)wenn dies aufgerufen wird). Durch Inkrementieren der reservierten lp__Variablen (siehe unten) können Sie den Logarithmus der Beta-Dichte über die Beobachtungen in Ihrer Stichprobe summieren. Ich benutze die Bezeichnung "Gamma" für den Parametervektor im linearen Prädiktor.

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
quelle
Danke Ben! Sehr nützlich, um auch die Stan-Syntax zu haben.
Joël
Stan v2 hat eine "beta_proportion" Sampling-Anweisung, die meines Erachtens die direkte Manipulation von "lp__" überflüssig macht
THK