贝叶斯A / B测试的公式没有任何意义


10

我正在使用贝叶斯ab测试的公式,以便使用贝叶斯方法计算AB测试的结果。

p>p一个=一世=0α-1个α一个+一世β+β一个β+一世1个+一世βα一个β一个

哪里

  • α一个加A的成功次数
  • β一个加A的失败次数
  • α加上B的成功次数
  • β加上B的失败次数
  • Beta函数

示例数据:

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

标准的非贝叶斯prop测试可以给我带来显着的结果(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ŤË小号Ť>CØñŤ[RØ大号0,对于此数据,这毫无意义。

有人可以澄清吗?


带有p-value标签的贝叶斯分析问题?我以为贝叶斯主义者拒绝与p值有任何关系。
Dilip Sarwate

你的权利!只是认为它将吸引更多的关注!
Yehoshaphat Schellekens 2015年

@YehoshaphatSchellekens,如果那是删除p-value标签的真正原因,因为它与标签无关。
蒂姆

Answers:


17

在您引用的网站上有一条通知

beta函数会产生非常大的数字,因此,如果您在程序中获得无穷大的值,请确保使用对数,如上面的代码所示。标准库的log-beta函数将在这里派上用场。

所以你的实现是错误的。下面我提供了更正的代码:

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是大于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)))

在这两种情况下,答案都是肯定的。


关于代码,请注意,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 forloop!=向量化。这基本上是矢量化的定义。
大卫·阿伦堡

1
@YehoshaphatSchellekens与日志有关的问题与某些软件无关,而与常规统计计算有关。在网站上的示例中,您引用了提供的julia代码-julia还是统计编程的很好的语言,并且仍然使用日志。
蒂姆

2
实际上,我只是问了一个关于 SO的确切讨论的问题,vapply将来我可能需要重新考虑自己的方法。希望我能一劳永逸地得到一些好的答案。
David Arenburg

2
好的,在仔细思考并总结我对问题的评论和答案之后,我认为我对vapply真正的含义有了一些一般的理解。在这里
David Arenburg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.