ベイジアンA / Bテストの式が意味をなさない


10

ベイジアン手法を使用してABテストの結果を計算するために、ベイジアンabテストの式を使用しています。

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

どこ

  • 1プラス Aの成功数αA
  • 1プラス Aの失敗数βA
  • 1プラス Bの成功数αB
  • 1プラス 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値とは何の関係もないことを拒否したと思いました。
Dilip Sarwate、2015年

あなたの右!もっと注目されると思いました!
Yehoshaphat Schellekens 2015

@YehoshaphatSchellekensもしそれが本当の理由だったのなら、p-valueタグは関係ないので削除します。
Tim

もちろん問題ありません。
Yehoshaphat Schellekens 2015

回答:


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が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、2015年

1
C / C ++ / Fortan forループ==ベクトル化; R forループ!=ベクトル化。これは基本的にベクトル化の定義です。
David Arenburg、2015年

1
@YehoshaphatSchellekensのログの要点は、特定のソフトウェアではなく、一般的な統計計算です。このサイトの例では、juliaコードが提供されています。juliaも統計プログラミングに非常に優れた言語であり、ログが使用されています。
Tim

2
実際、私がSOで行ったこの正確な議論について質問vapplyしたところ、将来に向けて私のアプローチを再考する必要があるかもしれません。いい答えが返ってくればいいと思います。
David Arenburg、2015年

2
私が質問について受け取ったコメントと回答を長い間考えてまとめた後、私vapplyは本当は何であるかについてのいくつかの一般的な理解を思いついたと思います。ここで
デビッドアレンブルク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.