Hierarchische Bayes'sche Analyse der Proportionsunterschiede


8

Warum hierarchisch? : Ich habe versucht, dieses Problem zu untersuchen, und soweit ich weiß, handelt es sich um ein "hierarchisches" Problem, da Sie Beobachtungen über Beobachtungen aus einer Population machen, anstatt direkte Beobachtungen aus dieser Population zu machen. Referenz: http://www.econ.umn.edu/~bajari/iosp07/rossi1.pdf

Warum Bayesian? : Außerdem habe ich es als Bayesianisch markiert, da möglicherweise eine asymptotische / frequentistische Lösung für ein "experimentelles Design" existiert, bei dem jeder "Zelle" ausreichende Beobachtungen zugewiesen werden, aber für praktische Zwecke reale / nicht experimentelle Datensätze (oder bei am wenigsten meine) sind dünn besiedelt. Es gibt viele aggregierte Daten, aber einzelne Zellen können leer sein oder nur wenige Beobachtungen enthalten.

Das Modell in Zusammenfassung:

Sei U eine Population von Einheiten , auf die wir jeweils eine Behandlung von oder anwenden können und von denen wir jeweils Beobachtungen von 1 oder 0 beobachten aka Erfolge und Misserfolge. Sei für die Wahrscheinlichkeit, dass eine Beobachtung von Objekt unter Behandlung zu einem Erfolg führt. Beachten Sie, dass mit korreliert sein kann . TAB p i T i{1 ...N}iT p i A p i B.u1,u2,u3...uNTABpiTi{1...N}iTpiApiB

Um die Analyse durchführbar zu machen, nehmen wir (a) an, dass die Verteilungen und jeweils eine Instanz einer bestimmten Verteilungsfamilie sind, wie z. B. die Beta-Verteilung, (b), und wählen einige frühere Verteilungen für Hyperparameter aus.p B.pApB

Beispiel des Modells

Ich habe eine wirklich große Tüte Magic 8 Balls. Jeder 8-Ball kann beim Schütteln "Ja" oder "Nein" anzeigen. Außerdem kann ich sie mit dem Ball von rechts nach oben oder von oben nach unten schütteln (vorausgesetzt, unsere Magic 8-Bälle funktionieren verkehrt herum ...). Die Ausrichtung des Balls kann die Wahrscheinlichkeit, ein "Ja" oder ein "Nein" zu erhalten, vollständig ändern (mit anderen Worten, anfangs glauben Sie nicht, dass mit korreliert ). p i B.piApiB

Fragen:

Jemand hat zufällig eine Anzahl von Einheiten aus der Population ausgewählt und für jede Einheit eine beliebige Anzahl von Beobachtungen unter Behandlung und eine beliebige Anzahl von Beobachtungen unter Behandlung genommen und aufgezeichnet . (In der Praxis werden in unserem Datensatz die meisten Einheiten nur unter einer Behandlung beobachtet.)A B.nAB

Angesichts dieser Daten muss ich folgende Fragen beantworten:

  1. Wie kann ich (analytisch oder stochastisch) die gemeinsame posteriore Verteilung von und berechnen, wenn ich zufällig eine neue Einheit aus der Population ? (In erster Linie, damit wir den erwarteten Unterschied in den Anteilen bestimmen können, )p x A p x B Δ = p x A - p x B.uxpxApxBΔ=pxApxB
  2. Wie kann ich für eine bestimmte Einheit , mit Beobachtungen von Erfolgen und Fehlern die gemeinsame posteriore Verteilung für (analytisch oder stochastisch) berechnen und , um erneut eine Verteilung der Proportionsdifferenz y { 1 , 2 , 3 ... , n } s y f y p y A p y B Δ y p y A - p y B.uyy{1,2,3...,n}syfypyApyBΔypyApyB

: Obwohl wir wirklich erwarten, dass und sehr korreliert sind, modellieren wir dies nicht explizit. Im wahrscheinlichen Fall einer stochastischen Lösung würde dies meiner Meinung nach dazu führen, dass einige Probenehmer, einschließlich Gibbs, die posteriore Verteilung weniger effektiv untersuchen. Ist dies der Fall, und wenn ja, sollten wir einen anderen Sampler verwenden, die Korrelation irgendwie als separate Variable modellieren und die Verteilungen transformieren , um sie unkorreliert zu machen, oder den Sampler einfach länger laufen lassen?p B ppApBp

Antwortkriterien

Ich suche nach einer Antwort, die:

  • Hat Code, der vorzugsweise Python / PyMC verwendet, oder JAGS, den ich ausführen kann

  • Kann eine Eingabe von Tausenden von Einheiten verarbeiten

  • Wenn genügend Einheiten und Stichproben vorhanden sind, können Verteilungen für , und als Antwort auf Frage 1 , von denen gezeigt werden kann, dass sie mit den zugrunde liegenden Bevölkerungsverteilungen übereinstimmen (zu vergleichen mit Excel-Tabellen in den "Herausforderungsdatensätzen"). Sektion)p B ΔpApBΔ

  • Wenn genügend Einheiten und Stichproben vorhanden sind, können die richtigen Verteilungen für , und (ich werde die Excel- im Abschnitt "Herausforderungsdatensätze" zur Überprüfung verwenden) als Antwort auf Frage 2 ausgegeben werden , und es werden einige bereitgestellt Begründung, warum diese Verteilungen korrekt sindp B ΔpApBΔ

  • Wenn die Antwort dem letzten von mir veröffentlichten JAGS-Modell ähnelt, erklären Sie, warum es mit dpar(0.5,1)Priors funktioniert, aber nicht mit dgamma(2,20)Priors. Vielen Dank an Martyn Plummer im JAGS-Forum , die den Fehler in meinem JAGS-Modell erkannt hat. Beim Versuch, einen Prior von Gamma (Form = 2, Skalierung = 20) dgamma(2,20)festzulegen , habe ich angerufen, der tatsächlich einen Prior von Gamma (Form = 2, InverseScale = 20) = Gamma (Form = 2, Skalierung = 0,05) gesetzt hat.

Datensätze herausfordern

Ich habe einige Beispieldatensätze in Excel mit einigen verschiedenen möglichen Szenarien generiert, um die Dichtheit der p-Verteilungen und die Korrelation zwischen ihnen zu ändern und das Ändern anderer Eingaben zu vereinfachen. https://docs.google.com/file/d/0B_rPBjs4Cp0zLVBybU1nVnd0ZFU/edit?usp=sharing (~ 8 MB)

Eine Visualisierung der 4 in der Excel-Datei enthaltenen Datensätze

Meine bisherige versuchte / Teillösung (en)

1) Ich habe Python 2.7 und PyMC 2.2 heruntergeladen und installiert. Anfangs musste ein falsches Modell ausgeführt werden, aber als ich versuchte, das Modell neu zu formulieren, friert die Erweiterung ein. Durch Hinzufügen / Entfernen von Code habe ich festgestellt, dass der Code, der das Einfrieren auslöst, mc.Binomial (...) ist, obwohl diese Funktion im ersten Modell funktioniert hat. Daher gehe ich davon aus, dass etwas mit der Angabe des Codes nicht stimmt Modell.

import pymc as mc
import numpy as np
import scipy.stats as stats
from __future__ import division
cases=[0,0]
for case in range(2):
    if case==0:
        # Taken from the sample datasets excel sheet, Focused Correlated p's
        c_A_arr, n_A_arr, c_B_arr, n_B_arr=np.loadtxt("data/TightCorr.tsv", unpack=True)

    if case==1:
        # Taken from the sample datasets excel sheet, Focused Uncorrelated p's
        c_A_arr, n_A_arr, c_B_arr, n_B_arr=np.loadtxt("data/TightUncorr.tsv", unpack=True)

    scale=20.0
    alpha_A=mc.Uniform("alpha_A", 1,scale)
    beta_A=mc.Uniform("beta_A", 1,scale)
    alpha_B=mc.Uniform("alpha_B", 1,scale)
    beta_B=mc.Uniform("beta_B", 1,scale)
    p_A=mc.Beta("p_A",alpha=alpha_A,beta=beta_A)
    p_B=mc.Beta("p_B",alpha=alpha_B,beta=beta_B)

    @mc.deterministic
    def delta(p_A=p_A,p_B=p_B):
        return p_A-p_B

    obs_n_A=mc.DiscreteUniform("obs_n_A",lower=0,upper=20,observed=True, value=n_A_arr)
    obs_n_B=mc.DiscreteUniform("obs_n_B",lower=0,upper=20,observed=True, value=n_B_arr)

    obs_c_A=mc.Binomial("obs_c_A",n=obs_n_A,p=p_A, observed=True, value=c_A_arr)
    obs_c_B=mc.Binomial("obs_c_B",n=obs_n_B,p=p_B, observed=True, value=c_B_arr)


    model = mc.Model([alpha_A,beta_A,alpha_B,beta_B,p_A,p_B,delta,obs_n_A,obs_n_B,obs_c_A,obs_c_B])
    cases[case] = mc.MCMC(model)
    cases[case].sample(24000, 12000, 2)

    lift_samples = cases[case].trace('delta')[:]

    ax = plt.subplot(211+case)
    figsize(12.5,5)
    plt.title("Posterior distributions of lift from 0 to T")
    plt.hist(lift_samples, histtype='stepfilled', bins=30, alpha=0.8,
             label="posterior of lift", color="#7A68A6", normed=True)
    plt.vlines(0, 0, 4, color="k", linestyles="--", lw=1)
    plt.xlim([-1, 1])

2) Ich habe JAGS 3.4 heruntergeladen und installiert. Nachdem ich im JAGS-Forum eine Korrektur für meine Prioritäten erhalten habe, habe ich jetzt dieses Modell, das erfolgreich ausgeführt wird:

Modell

var alpha_A, beta_A, alpha_B, beta_B, p_A[N], p_B[N], delta[N], n_A[N], n_B[N], c_A[N], c_B[N];
model {
    for (i in 1:N) {
        c_A[i] ~ dbin(p_A[i],n_A[i])
        c_B[i] ~ dbin(p_B[i],n_B[i])
        p_A[i] ~ dbeta(alpha_A,beta_A)
        p_B[i] ~ dbeta(alpha_B,beta_B)
        delta[i] <- p_A[i]-p_B[i]
    }
    alpha_A ~ dgamma(1,0.05)
    alpha_B ~ dgamma(1,0.05)
    beta_A ~ dgamma(1,0.05)
    beta_B ~ dgamma(1,0.05)
}

Daten

"N" <- 60
"c_A" <- structure(c(0,6,0,3,0,8,0,4,0,6,1,5,0,5,0,7,0,3,0,7,0,4,0,5,0,4,0,5,0,4,0,2,0,4,0,5,0,8,2,7,0,6,0,3,0,3,0,8,0,4,0,4,2,6,0,7,0,3,0,1))
"c_B" <- structure(c(5,0,2,2,2,0,2,0,2,0,0,0,5,0,4,0,3,1,2,0,2,0,2,0,0,0,3,0,6,0,4,1,5,0,2,0,6,0,1,0,2,0,4,0,4,1,1,0,3,0,5,0,0,0,5,0,2,0,7,1))
"n_A" <- structure(c(0,9,0,3,0,9,0,9,0,9,3,9,0,9,0,9,0,3,0,9,0,9,0,9,3,9,0,9,0,9,0,3,0,9,0,9,0,9,3,9,0,9,0,9,0,3,0,9,0,9,0,9,3,9,0,9,0,9,0,3))
"n_B" <- structure(c(9,0,9,3,9,0,9,0,9,0,3,0,9,0,9,0,9,3,9,0,9,0,9,0,3,0,9,0,9,0,9,3,9,0,9,0,9,0,3,0,9,0,9,0,9,3,9,0,9,0,9,0,3,0,9,0,9,0,9,3))

Steuerung

model in Try1.bug
data in Try1.r
compile, nchains(2)
initialize
update 400
monitor set p_A, thin(3)
monitor set p_B, thin(3)
monitor set delta, thin(3)
update 1000
coda *, stem(Try1)

Die eigentliche Anwendung für alle, die das Modell lieber auseinander nehmen möchten :)

Bei typischen A / B-Tests im Web werden die Auswirkungen einer einzelnen Seite oder Inhaltseinheit auf die Conversion-Rate mit möglichen Abweichungen berücksichtigt. Typische Lösungen umfassen einen klassischen Signifikanztest gegen die Nullhypothesen oder zwei gleiche Anteile oder neuere analytische Bayes'sche Lösungen, die die Beta-Verteilung als konjugiertes Prior nutzen.

Anstelle dieses Ansatzes mit nur einer Einheit von Inhalten, der im Übrigen viele Besucher für jede Einheit erfordern würde, die ich testen möchte, möchten wir Variationen in einem Prozess vergleichen, der mehrere Einheiten von Inhalten generiert (eigentlich kein ungewöhnliches Szenario) ...). Insgesamt haben die von Prozess A oder B erstellten Einheiten / Seiten viele Besuche / Daten, aber jede einzelne Einheit hat möglicherweise nur wenige Beobachtungen.


Sie haben wichtige Aspekte in Ihrer Beschreibung übersprungen. Was passiert als nächstes, nachdem Sie ein gleichmäßig gezeichnet haben? Etwas muss sein, sonst hast du absolut keine Informationen über irgendeinen der ! Was beobachten Sie dann? Beobachten Sie und beispielsweise eine unabhängige Auslosung von ? Oder beobachten Sie einfach die Auslosung von und zeichnen nicht auf ? Um all diese Dichteverteilungen abzuschätzen, müssen Sie den Vorgang sicherlich viele, viele Male wiederholen - wie viele? Oder nehmen Sie unter "Schätzung" an, dass Sie alle und die Verteilung des Ergebnisses Ihres Experiments berechnen möchten ? p x x o x o x x p xxpxxoxoxxpx
whuber

Entschuldigung, vielleicht war der Satz " wird einheitlich aus 1 ... N gezogen" irreführend. Angesichts einer großen Anzahl vorhandener Beobachtungen zu verschiedenen möchte ich die Verteilung von . Es ist etwas analog dazu, 50 Personen aus einer Bevölkerung zu befragen, ihre Körpergröße zu beobachten und dann nach der Verteilung der Körpergröße für eine Person zu fragen, die "zufällig aus der Bevölkerung gezogen" wurde. Ich habe gerade Uniform verwendet, da die Bevölkerung in diesem Fall aufgezählt wurde, und ich sehe, dass es verwirrend ist. (Weiter mit der Analogie, in diesem Szenario können wir die Menschen nicht messen, sondern nur ein paar binäre Antworten beobachten)o x p xxoxpx
Fabio Beltramini

Ich habe am Ende der Frage ein Beispiel hinzugefügt, das hoffentlich klar macht, was ich versuche zu tun.
Fabio Beltramini

Vielen Dank. Die Frage bleibt jedoch verwirrend. Im Beispiel beobachten Sie ein geordnetes Wertepaar : Zeiten und Erfolge. Nach welcher "Verteilung" fragen Sie dann genau? Welcher Eigenschaft des großen Würfelbeutels würde er genau entsprechen?
whuber

1
Das Wertepaar (Rollen & Erfolge) vermittelt Informationen über eine latente Variable, p. Die Verteilung, die ich möchte, ist die Verteilung der Ps in der Tasche. Wenn wir keine Verteilungsklasse annehmen, zu der sie gehört, gibt es natürlich beliebig viele Möglichkeiten, aber wenn wir sagen, dass p beispielsweise beta-verteilt ist, kommt es darauf an, nur die am besten passenden Parameter dafür auszuwählen Klasse von Verteilungen. Wenn es hilft, betrachten Sie jetzt anstelle von Würfeln mit p = 1 / 4,1 / 6,1 / 8, dass jedes Objekt ap von Beta (2,2) ... oder Beta (4,4) usw. hat.
Fabio Beltramini

Antworten:


2

Da die Zeit für das Kopfgeld abgelaufen ist und ich keine Antworten erhalten habe, werde ich die Antwort veröffentlichen, die ich finden konnte, obwohl meine begrenzte Erfahrung mit Bayes'schen Schlussfolgerungen darauf hindeutet, dass dies mit einer gesunden Dosis Skepsis aufgenommen werden sollte.

I) Einrichtung

  1. Ich habe JAGS 3.4 und R 3.0.1 heruntergeladen und installiert
  2. Ich habe die Pakete rjags und coda installiert, indem ich R initiiert und install.packages (pkgname) verwendet habe.

II) Modell und Daten - Verwendet die Modell- und Datendateien, die bereits in der Frage aufgeführt sind. Um Frage 1 zu beantworten, habe ich den Daten eine zusätzliche Beobachtung hinzugefügt, wobei alle vier Variablen 0 sind.

III) Beantwortung von Fragen

  1. Ich habe JAGS für das Modell / die Daten ausgeführt (öffnen Sie die Befehlszeile, gehen Sie in das Verzeichnis mit Ihren Dateien und geben Sie> jags-terminal Command.cmd ein. Es wurde ausgeführt und gab einige Dateien aus
  2. In R habe ich die folgenden Befehle verwendet:
    • Bibliothek ("rjags") zum Laden des installierten Pakets (und der erforderlichen Paketcoda)
    • setwd (), um zu dem Verzeichnis zu gelangen, in dem sich die Ausgabedateien befanden
    • results = read.coda ("STEMchain1.txt", "STEMindex.txt")
  3. Um die erste Frage zu beantworten:
    • Als PDF-Plot "Plot (Ergebnisse [, 3 * N])"
    • Als Quantile "Quantil (Ergebnisse [, 3 * N], c (0,025,0,25,0,5,0,75,0,975))"
    • Wobei N die Anzahl der Beobachtungen ist und die letzte Beobachtung der Position der Beobachtung "alle Nullen" entspricht. (1 bis n ist für die Variable p_A, n + 1 bis 2n ist für p_B und 2n + 1 bis 3n ist für Delta)
  4. Beantworten Sie die zweite Frage wie oben, ändern Sie jedoch 3 * N -> 2 * N + y

Ich bin mir nicht sicher, ob dies der richtige Weg ist, um die Antwort zu erhalten, oder ob ein komplexeres Modell bessere Ergebnisse liefern würde, insbesondere im Fall von Korrelationen, aber hoffentlich mischt sich irgendwann jemand mit mehr Erfahrung ein ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.