2017-09-12 5 views
2

Ich bin auf der Suche nach einem Modell, um mehrere Wahrscheinlichkeiten für Binomialdaten mit Stan zu schätzen. Ich habe für jede Wahrscheinlichkeit Beta-Priors verwendet, aber ich habe gelesen, dass Hyperpriors zum Sammeln von Informationen verwendet werden, und ermutigen, die Schätzungen zu schrumpfen.Hyperpriors für hierarchische Modelle mit Stan

Ich habe dieses Beispiel zu sehen, die hyperprior in pymc zu definieren, aber ich bin nicht sicher, wie mit Stan etwas ähnlichem zu tun

@pymc.stochastic(dtype=np.float64) 
def beta_priors(value=[1.0, 1.0]): 
    a, b = value 
    if a <= 0 or b <= 0: 
     return -np.inf 
    else: 
     return np.log(np.power((a + b), -2.5)) 

a = beta_priors[0] 
b = beta_priors[1] 

Mit a und b dann als Parameter für die frühere Beta verwendet wird .

Kann jemand mir irgendwelche Hinweise geben, wie etwas Ähnliches mit Stan gemacht würde?

+1

Das Handbuch enthält viele Beispiele, wie man hierarchische und mehrstufige Modelle erstellt (worüber Sie hier sprechen). Unsere grundlegenden Empfehlungen für Prioren finden Sie im Handbuch Kapitel in Regression und auch auf dieser Wiki-Seite: https://github.com/stan-dev/stan/wiki/Prior-Choice-Recommendations –

+1

Es gibt auch Fallstudien zu hierarchischen Modellen, speziell eine direkt über binäre Variablen, die Hyperprior für Binome mit einer logistischen Regression mit nur einem Schnittpunkt kontrastiert (das Ergebnis ist, dass Sie wahrscheinlich keine Beta-Binomials oder Dirichlet-Multinomials verwenden möchten): http: // mc-stan. org/users/documentation/Fallstudien/Pool-Binary-Versuche.html –

+0

@BobCarpenter Das sieht wirklich hilfreich aus - danke. Ich mache das für AB-Tests, und für kompliziertere Tests hielt ich es für sinnvoller, in einem Regressionsrahmen zu arbeiten. Die Möglichkeit, Varianten wie in der Fallstudie zu bewerten, könnte auch nützlich sein, um Ergebnisse an Kollegen zu kommunizieren. –

Antwort

0

Folgende Vorschläge in den Kommentaren Ich bin nicht sicher, ob ich diesem Ansatz folgen werde, aber als Referenz dachte ich, ich würde zumindest die Antwort auf meine Frage veröffentlichen, wie dies in Stan erreicht werden könnte.

Nach einigen Fragen auf Stan Discourses und weitere Untersuchungen fand ich, dass die Lösung war, eine benutzerdefinierte Dichteverteilung zu setzen und die target += Syntax verwenden. Also das Äquivalent für Stan des Beispiels für pymc wäre:

parameters { 
    real<lower=0> a; 
    real<lower=0> b; 
    real<lower=0,upper=1> p; 
    ... 
} 

model { 
    target += log((a + b)^-2.5); 

    p ~ beta(a,b) 
    ... 
} 
1

Um richtig, dass zu normalisieren, müssen Sie eine Pareto-Verteilung. Zum Beispiel, wenn Sie eine Verteiler p(a, b) ∝ (a + b)^(-2.5) möchten, können Sie

a + b ~ pareto(L, 1.5); 

wo a + b > L verwenden. Es gibt keine Möglichkeit, die Dichte mit Unterstützung für alle Werte größer als oder gleich Null zu normalisieren --- es benötigt eine endliche L als untere Grenze. Es gibt eine Diskussion über die Verwendung nur dieses Prior als die Zählkomponente eines hierarchischen Prior für einen Simplex.

Wenn a und b sind Parameter, können sie entweder beide gezwungen werden, positiv zu sein, oder Sie können a ungezwungen verlassen und erklären

real<lower = L - a> b; 

a + b > L zu versichern. L kann eine kleine Konstante oder etwas vernünftiger sein angesichts Ihrer Kenntnis von a und b.

Sie sollten vorsichtig sein, da dies a + b nicht identifizieren wird. Wir verwenden diese Konstruktion als Stand der hierarchischen für Simplexen wie:

parameters { 
    real<lower = 1> kappa; 
    real<lower = 0, upper = 1> phi; 
    vector<lower = 0, upper = 1>[K] theta; 

model { 
    kappa ~ pareto(1, 1.5); // power law prior 
    phi ~ beta(a, b); // choose your prior for theta 
    theta ~ beta(kappa * phi, kappa * (1 - phi)); // vectorized 

ein erweitere Beispiel ist in meiner Stan Fallstudie von wiederholten binären Studien, die von der Fallstudien-Seite auf das Stan web site (die Fallstudie Verzeichnis erreichbar ist derzeit unter dem Dokumentationslink von der Registerkarte Benutzer verknüpft).