Công thức cho thử nghiệm A / B Bayes không có ý nghĩa gì


10

Tôi đang sử dụng công thức từ thử nghiệm ab Bayesian để tính kết quả xét nghiệm AB bằng phương pháp Bayesian.

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

Ở đâu

  • αA trong một cộng với số lần thành công cho A
  • βA trong một cộng với số lần thất bại cho A
  • αB trong một cộng với số lần thành công cho B
  • βB trong một cộng với số lần thất bại cho B
  • Bhàm Beta

Dữ liệu ví dụ:

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

Một thử nghiệm chống đỡ phi tiêu chuẩn Bayes cho tôi kết quả quan trọng (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 

trong khi việc thực hiện công thức Bayes (sử dụng các giải thích trong liên kết) đã cho tôi kết quả rất kỳ lạ:

# 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

điều đó có nghĩa rằng P(TEST>CONTROL)0 , mà không thực hiện bất kỳ ý nghĩa cho dữ liệu này.

Ai đó có thể làm rõ?


Một nhiệm vụ phân tích Bayes với một p-valuethẻ? Tôi nghĩ Bayes từ chối không liên quan gì đến giá trị p.
Dilip Sarwate

Quyền của bạn! chỉ cần nghĩ rằng nó sẽ thu hút sự chú ý nhiều hơn!
Yehoshaphat Schellekens

@YehoshaphatSchellekens nếu đó là lý do thực sự tôi xóa p-valuethẻ vì nó không liên quan.
Tim

Chắc chắn không có vấn đề.
Yehoshaphat Schellekens

Câu trả lời:


17

Trên trang web bạn trích dẫn có một thông báo

Hàm beta tạo ra số lượng rất lớn, vì vậy nếu bạn nhận được các giá trị vô hạn trong chương trình của mình, hãy chắc chắn làm việc với logarit, như trong đoạn mã trên. Chức năng log-beta của thư viện chuẩn của bạn sẽ có ích ở đây.

vì vậy việc thực hiện của bạn là sai. Dưới đây tôi cung cấp mã sửa:

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

}

Nó xuất ra tổng = 0,9576921, đó là "tỷ lệ cược B sẽ đánh bại A trong thời gian dài" (trích dẫn liên kết của bạn) những gì nghe có vẻ hợp lệ vì B trong ví dụ của bạn có tỷ lệ lớn hơn. Vì vậy, nó không phải là giá trị p mà là xác suất mà B lớn hơn A (bạn không hy vọng nó sẽ <0,05).

Bạn có thể chạy các mô phỏng đơn giản để kiểm tra kết quả:

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

Trong cả hai trường hợp, câu trả lời là có.


Về mã, lưu ý rằng vòng lặp là không cần thiết và nói chung chúng làm mọi thứ chậm hơn trong R, vì vậy bạn có thể sử dụng thay thế vapplycho mã sạch hơn và nhanh hơn một chút:

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 ... Tôi tự hỏi nếu bạn thực sự kiểm tra tốc độ, bởi vì vapplykhông có nhiều vectơ hơn forvòng lặp, ngược lại, về cơ bản chúng giống nhau. Câu trả lời tốt đẹp mặc dù.
David Arenburg 10/03/2015

1
Các forvòng lặp C / C ++ / Fortan == vector hóa; forVòng lặp R ! = Vectơ. Đây là cơ bản định nghĩa của vectorized.
David Arenburg 11/03/2015

1
@YehoshaphatSchellekens điểm với nhật ký không phải là về phần mềm nhất định mà là tính toán thống kê chung. Trong ví dụ trên trang web bạn trích dẫn mã julia được cung cấp - julia cũng là ngôn ngữ rất tốt để lập trình thống kê và các bản ghi vẫn được sử dụng.
Tim

2
Trên thực tế, tôi vừa hỏi một câu hỏi liên quan đến cuộc thảo luận chính xác này về SO, tôi có thể cần suy nghĩ lại về cách tiếp cận của mình vapplytrong tương lai. Tôi hy vọng tôi sẽ nhận được một số câu trả lời tốt đẹp một lần và mãi mãi.
David Arenburg 11/03/2015

2
Ok, sau khi suy nghĩ lâu và tổng hợp các ý kiến ​​và câu trả lời tôi nhận được cho câu hỏi của mình, tôi nghĩ rằng tôi đã đưa ra một số hiểu biết chung về những gì vapplythực sự là. Xem câu trả lời của tôi ở đây
David Arenburg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.