Формула для байєсівського тестування A / B не має сенсу


10

Я використовую формулу баєсівського тестування ab для того, щоб обчислити результати тесту АВ за методологією Байєса.

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

де

  • αA в одному плюс кількість успіхів для A
  • βA в один плюс кількість відмов для A
  • αB в один плюс кількість успіхів для B
  • βB в один плюс кількість відмов для B
  • B- це бета-функція

Приклад даних:

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

Стандартний не байєсовський пробний тест дає мені значні результати (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 

в той час як моя реалізація формули Байєса (використовуючи пояснення у посиланні) дала мені дуже дивні результати:

# 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

це означає, що те P(TEST>CONTROL) є 0, що не має сенсу з огляду на ці дані.

Може хтось уточнить?


Байєсівський питання аналізу з p-valueтегом? Я думав, що байєси відмовляються мати щось спільне з p-значеннями.
Діліп Сарват

Ваше право! просто думав, що це приверне більше уваги!
Йосафат Шеллекенс

@YehoshaphatSchellekens, якщо це була справжня причина, за якою я видаляю p-valueтег, оскільки він не пов'язаний.
Тім

А як же, немає проблем.
Йосафат Шеллекенс

Відповіді:


17

На сайті, який ви цитуєте, є повідомлення

Бета-функція дає дуже велику кількість, тому якщо ви отримуєте нескінченні значення у своїй програмі, обов'язково працюйте з логарифмами, як у наведеному вище коді. Тут стане в нагоді ваша стандартна функція бета-версії бібліотеки.

тож ваша реалізація неправильна. Нижче я надаю виправлений код:

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

}

Він виводить total = 0,9576921, тобто "шанси на те, що B буде перемогти A в довгостроковій перспективі" (цитуючи ваше посилання), що звучить дійсно, оскільки B у вашому прикладі має більшу частку. Таким чином, це НЕ р -значення, а ймовірність того, що B більше , то A (ви НЕ очікуєте , що це буде <0,05).

Ви можете запустити прості симуляції, щоб перевірити результати:

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

В обох випадках відповідь "так".


Щодо коду, зауважте, що цикл непотрібний, і вони зазвичай роблять повільніше у R, тому ви можете альтернативно використовувати vapplyдля чистішого та трохи швидшого коду:

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

Хм ... Цікаво, чи ти насправді випробував на швидкість, адже vapplyце не більше векторозії, ніж forпетля, навпаки, вони в основному однакові. Хоча приємна відповідь.
Девід Аренбург

1
C / C ++ / forпетлі Фортана == векторизовані; R forпетля! = Векторизована. Це в основному визначення векторизованого.
Девід Аренбург

1
@YehoshaphatSchellekens суть із журналами полягає не в певному програмному забезпеченні, а в загальних статистичних обчисленнях. У прикладі на сайті, який ви цитуєте, наводиться код julia - julia також є дуже хорошою мовою для статистичного програмування, і все ще використовуються журнали.
Тім

2
Насправді, я щойно задав питання щодо цієї точної дискусії, яку ми мали щодо SO, мені може знадобитися переосмислити свій підхід до vapplyмайбутнього. Я сподіваюся, що раз і назавжди отримаю приємну відповідь.
Девід Аренбург

2
Гаразд, після довгого роздуму та підбиття підсумків коментарів та відповідей, отриманих на моє запитання, я думаю, що я придумав загальне розуміння того, що vapplyнасправді є. Дивіться мою відповідь тут
Девід Аренбург
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.