Bayesian A / B Testi Formülü bir anlam ifade etmiyor


10

Bayes metodolojisi kullanarak AB testi sonuçlarını hesaplamak için Bayesian ab test formülünü kullanıyorum.

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

nerede

  • αA bir arada artı A için başarı sayısı
  • βA bir arada artı A için başarısızlık sayısı
  • αB bir artı B için başarı sayısı
  • βB bir artı B için başarısızlık sayısı
  • B bir Beta fonksiyonu

Örnek veriler:

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

Standart Bayesian olmayan prop testi bana önemli sonuçlar verir (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 

Bayes formülünü uygulamam (bağlantıdaki açıklamaları kullanarak) bana çok garip sonuçlar verdi:

# 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

Bu, öğesinin olduğu anlamına gelir ve bu da bu veriler dikkate alındığında bir anlam ifade etmez.P(TEST>CONTROL)0

Birisi açıklığa kavuşturabilir mi?


Etiketi olan bir Bayes analizi araştırması p-valuemı? Bayeslilerin p değerleri ile ilgisi olmadığını düşündüm.
Dilip Sarwate

Haklısın! sadece daha fazla dikkat çekeceğini düşündüm!
Yehoshaphat Schellekens

@YehoshaphatSchellekens p-value, ilişkili olmadığı için etiketi kaldırmamın gerçek nedeni buysa .
Tim

Elbette, hiç sorun değil.
Yehoshaphat Schellekens

Yanıtlar:


17

Alıntı yaptığınız sitede bir uyarı var

Beta işlevi çok büyük sayılar üretir, bu nedenle programınızda sonsuz değerler alıyorsanız, yukarıdaki kodda olduğu gibi logaritmalarla çalıştığınızdan emin olun. Standart kitaplığınızın log-beta işlevi burada kullanışlı olacaktır.

uygulamanız yanlış. Aşağıda düzeltilmiş kodu sağlarım:

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))

}

Toplam = 0.9576921 çıktısı verir, yani "B'nin uzun vadede A'yı yenme olasılığı" (bağlantınızı alıntılar), örneğin örneğinizde B'nin geçerli olduğu daha büyük bir orana sahiptir. Yani, öyle değil bir p -değeri değil, B A'ya ardından büyük olacak bir olasılık (eğer do not olmasını bekliyoruz <0.05).

Sonuçları kontrol etmek için basit simülasyonları çalıştırabilirsiniz:

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)))

Her iki durumda da cevap evettir.


Kod hakkında olduğu gibi, döngü için gereksiz olduğunu ve genellikle R'de işleri daha yavaş hale getirdiğine dikkat edin, böylece alternatif vapplyolarak daha temiz ve biraz daha hızlı kod için kullanabilirsiniz:

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 ... Gerçekten hız için test vapplyyapıp yapmadığınızı merak ediyorum, çünkü döngüden daha fazla vektörel değil for, aksine, temelde aynılar . Güzel cevap olsa.
David Arenburg

1
C / C ++ / Fortan fordöngüleri == vectorized; R fordöngüsü! = Vektörize. Bu temelde vectorized'in tanımıdır.
David Arenburg

1
@YehoshaphatSchellekens günlükleri ile belirli bir yazılım değil, genel istatistiksel hesaplama ile ilgilidir. Sitedeki örnekte julia kodu verilmiştir - julia da istatistiksel programlama için çok iyi bir dildir ve hala günlükler kullanılır.
Tim

2
Aslında, SO hakkında yaptığımız bu tartışmayla ilgili bir soru sordumvapply , gelecekte yaklaşımımı yeniden düşünmem gerekebilir . Umarım bir kez ve herkes için güzel bir cevap alırım.
David Arenburg

2
Tamam, uzun bir süre düşündükten ve sorumla ilgili aldığım yorumları ve cevapları özetledikten sonra, vapplygerçekte ne olduğunu genel olarak anladım . Cevabımı burada görebilirsiniz
David Arenburg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.