베이지안 A / B 테스트 공식은 의미가 없습니다


10

Bayesian 방법론을 사용하여 AB 테스트의 결과를 계산하기 위해 Bayesian ab 테스트 의 공식을 사용하고 있습니다.

홍보(>)=나는=0α1(α+나는,β+β)(β+나는)(1+나는,β)(α,β)

어디

  • α 에 A의 성공 횟수를 더한 것
  • β하나의 \ beta_A + A에 대한 실패 횟수
  • α 에 B의 성공 횟수를 더한 것
  • β하나의 \ beta_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 

링크의 설명을 사용하여 Bayes 수식을 구현하면 매우 이상한 결과를 얻었습니다.

# 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

이는 (이자형에스>영형아르 자형영형)0 이라는 것을 의미합니다.이 데이터가 주어지면 의미가 없습니다.

누군가가 명확히 할 수 있습니까?


p-value태그 가있는 베이지안 분석 질문 ? 베이지안은 p- 값과 관련이 없다고 생각했습니다.
Dilip Sarwate

당신의 권리! 더 많은 관심을 끌 것이라고 생각했습니다!
Yehoshaphat Schellekens

@YehoshaphatSchellekens p-value그것이 관련이 없기 때문에 태그를 제거하는 진짜 이유라면 .
Tim

물론 문제 없습니다.
Yehoshaphat Schellekens

답변:


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

}

그것은 총 = 0.9576921, 즉 "B가 장기적으로 A를 이길 확률"(링크 인용)을 출력합니다. 예제에서 B 이후 더 큰 소리가 나는 비율이 더 큽니다. 그래서, 그것은 것입니다 하지 P는 - 값이 아니라 B가 다음 큰 확률 (당신이 하지 가 될 것으로 기대 <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)))

두 경우 모두 대답은 '예'입니다.


코드에 관해서는 for 루프가 불필요하며 일반적으로 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기본적으로 동일합니다. 그래도 좋은 대답입니다.
David Arenburg

1
C / C ++ / Fortan for루프 == 벡터화; R for루프! = 벡터화. 이것이 기본적으로 벡터화의 정의입니다.
David Arenburg

1
@YehoshaphatSchellekens 로그와 요점은 특정 소프트웨어가 아니라 일반적인 통계 컴퓨팅에 관한 것입니다. 사이트의 예에서 julia 코드가 제공됩니다. julia는 통계 프로그래밍에 매우 유용한 언어이며 여전히 로그가 사용됩니다.
Tim

2
사실, 방금 우리가했던이 정확한 토론에 관한 질문vapply했습니다. 앞으로의 접근 방식을 다시 생각해야 할 수도 있습니다. 나는 한 번에 좋은 답변을 얻을 수 있기를 바랍니다.
David Arenburg

2
좋아, 오랫동안 내 생각에 대한 의견과 답변을 생각하고 요약 한 후에, 나는 vapply실제로 무엇인지에 대한 일반적인 이해를 생각해 냈습니다 . 내 답변보기 here
David Arenburg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.