Die Formel für Bayes'sche A / B-Tests macht keinen Sinn


10

Ich verwende die Formel aus dem Bayes'schen Ab-Test , um die Ergebnisse des AB-Tests nach der Bayes'schen Methode zu berechnen.

Pr(pB>pA)=i=0αB1B(αA+i,βB+βA)(βB+i)B(1+i,βB)B(αA,βA)

wo

  • αA in eins plus die Anzahl der Erfolge für A.
  • βA in eins plus die Anzahl der Fehler für A.
  • αB in eins plus die Anzahl der Erfolge für B.
  • βB in eins plus die Anzahl der Fehler für B.
  • B ist die Beta-Funktion

Beispieldaten:

control: 1000 trials with 78 successes
test: 1000 trials with 100 successes

Ein nicht-Bayes'scher Standard-Prop-Test liefert signifikante Ergebnisse (p <10%):

prop.test(n=c(1000,1000), x=c(100,78), correct=F)

#   2-sample test for equality of proportions without continuity correction
# 
# data:  c(100, 78) out of c(1000, 1000)
# X-squared = 2.9847, df = 1, p-value = 0.08405
# alternative hypothesis: two.sided
# 95 percent confidence interval:
#  -0.0029398  0.0469398
# sample estimates:
# prop 1 prop 2 
#  0.100  0.078 

während meine Implementierung der Bayes-Formel (unter Verwendung der Erklärungen im Link) mir sehr seltsame Ergebnisse lieferte:

# success control+1
a_control <- 78+1
# failures control+1
b_control <- 1000-78+1
# success control+1
a_test <- 100+1
# failures control+1
b_test <- 1000-100+1

is_control_better <- 0
for (i in 0:(a_test-1) ) {
  is_control_better <- is_control_better+beta(a_control+i,b_control+b_test) / 
                       (b_test+i)*beta(1+i,b_test)*beta(a_control,b_control)

}

round(is_control_better, 4)
# [1] 0

Das bedeutet , dass die ist , was keinen Sinn dieser Daten gegeben macht.P(TEST>CONTROL)0

Könnte jemand klarstellen?


Ein Bayesian Analyse Questiob mit einem p-valueTag? Ich dachte, die Bayesianer weigerten sich, irgendetwas mit p-Werten zu tun zu haben.
Dilip Sarwate

Ihr Recht! dachte nur, dass es mehr Aufmerksamkeit erregen würde!
Yehoshaphat Schellekens

@YehoshaphatSchellekens, wenn das der wahre Grund war, warum ich das p-valueTag entferne, da es nicht verwandt ist.
Tim

Sicher kein Problem.
Yehoshaphat Schellekens

Antworten:


17

Auf der von Ihnen zitierten Website befindet sich ein Hinweis

Die Beta-Funktion erzeugt sehr große Zahlen. Wenn Sie also unendliche Werte in Ihrem Programm erhalten, müssen Sie wie im obigen Code mit Logarithmen arbeiten. Die Log-Beta-Funktion Ihrer Standardbibliothek ist hier hilfreich.

Ihre Implementierung ist also falsch. Unten gebe ich den korrigierten Code an:

a_A <- 78+1
b_A <- 1000-78+1
a_B <- 100+1
b_B <- 1000-100+1

total <- 0

for (i in 0:(a_B-1) ) {
  total <- total + exp(lbeta(a_A+i, b_B+b_A)
                       - log(b_B+i)
                       - lbeta(1+i, b_B)
                       - lbeta(a_A, b_A))

}

Es wird insgesamt = 0,9576921 ausgegeben, dh "Wahrscheinlichkeit, dass B A auf lange Sicht schlägt" (unter Angabe Ihres Links), was gültig klingt, da B in Ihrem Beispiel einen größeren Anteil hat. So ist es nicht ein p - Wert , sondern vielmehr eine Wahrscheinlichkeit , dass B größer als A ist (man nicht erwarten , dass es sein <0,05).

Sie können die einfachen Simulationen ausführen, um die Ergebnisse zu überprüfen:

set.seed(123)

# does Binomial distributions with proportions
# from your data give similar estimates?

mean(rbinom(n, 1000, a_B/1000)>rbinom(n, 1000, a_A/1000))

# and does values simulated in a similar fashion to
# the model yield similar results?

fun2 <- function(n=1000) {
  pA <- rbeta(1, a_A, b_A)
  pB <- rbeta(1, a_B, b_B)
  mean(rbinom(n, 1000, pB) > rbinom(n, 1000, pA))
}

summary(replicate(1000, fun2(1000)))

In beiden Fällen lautet die Antwort ja.


Beachten Sie beim Code, dass eine for-Schleife nicht erforderlich ist und die Dinge in R im Allgemeinen langsamer werden. Sie können sie also alternativ vapplyfür saubereren und etwas schnelleren Code verwenden:

fun <- function(i) exp(lbeta(a_A+i, b_B+b_A)
             - log(b_B+i)
             - lbeta(1+i, b_B)
             - lbeta(a_A, b_A))

sum(vapply(0:(a_B-1), fun, numeric(1)))

Hmm ... ich frage mich, ob Sie tatsächlich auf Geschwindigkeit getestet haben, weil sie vapplynicht mehr vektorisiert sind als die forSchleife, im Gegenteil, sie sind im Grunde gleich. Gute Antwort.
David Arenburg

1
C / C ++ / Fortan- forSchleifen == vektorisiert; R- forSchleife! = Vektorisiert. Dies ist im Grunde die Definition von vektorisiert.
David Arenburg

1
@YehoshaphatSchellekens Bei Protokollen geht es nicht um bestimmte Software, sondern um allgemeine statistische Berechnungen. In dem Beispiel auf der Site, die Sie zitieren, wird Julia-Code bereitgestellt - Julia ist auch eine sehr gute Sprache für die statistische Programmierung und es werden immer noch Protokolle verwendet.
Tim

2
Eigentlich habe ich gerade eine Frage zu dieser genauen Diskussion über SO gestellt. Möglicherweise muss ich meinen Ansatz vapplyin Zukunft überdenken . Ich hoffe, ich bekomme ein für alle Mal eine nette Antwort.
David Arenburg

2
Ok, nachdem ich lange nachgedacht und die Kommentare und Antworten auf meine Frage zusammengefasst habe, denke ich, dass ich ein allgemeines Verständnis dafür gefunden habe, was vapplywirklich ist. Siehe meine Antwort hier
David Arenburg
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.