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.
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.
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.
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.
Angesichts dieser Daten muss ich folgende Fragen beantworten:
- 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.
- 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.
: 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 p
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 Δ
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 Δ
Wenn die Antwort dem letzten von mir veröffentlichten JAGS-Modell ähnelt, erklären Sie, warum es mitVielen 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)dpar(0.5,1)
Priors funktioniert, aber nicht mitdgamma(2,20)
Priors.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)
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.