La formula per i test bayesiani A / B non ha alcun senso


10

Sto usando la formula del test ab bayesiano per calcolare i risultati del test AB usando la metodologia bayesiana.

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

dove

  • αA in uno più il numero di successi per A
  • βA in uno più il numero di errori per A
  • αB in uno più il numero di successi per B.
  • βB in uno più il numero di errori per B.
  • B è la funzione Beta

Dati di esempio:

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

Un test prop standard non bayesiano mi dà risultati significativi (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 

mentre la mia implementazione della formula di Bayes (usando le spiegazioni nel link) mi ha dato risultati molto strani:

# 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

ciò significa che P(TEST>CONTROL) è 0 , il che non ha alcun senso dato questi dati.

Qualcuno potrebbe chiarire?


Una questiob di analisi bayesiana con un p-valuetag? Pensavo che i bayesiani si fossero rifiutati di avere qualcosa a che fare con i valori p.
— Dilip Sarwate

Destra! ho pensato che avrebbe attirato più attenzione!
— Yehoshaphat Schellekens l'

@YehoshaphatSchellekens se questa era la vera ragione per cui ho rimosso il p-valuetag poiché non è correlato.
— Tim

Certo nessun problema.
— Yehoshaphat Schellekens l'

Risposte:


17

Sul sito che citi c'è un avviso

La funzione beta produce numeri molto grandi, quindi se stai ottenendo infiniti valori nel tuo programma, assicurati di lavorare con i logaritmi, come nel codice sopra. La funzione log-beta della tua libreria standard sarà utile qui.

quindi la tua implementazione è sbagliata. Di seguito fornisco il codice corretto:

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

}

Produce un totale = 0,9576921, ovvero "probabilità che B batterà A nel lungo periodo" (citando il tuo link) ciò che sembra valido poiché B nel tuo esempio ha una proporzione maggiore. Quindi, è non è un p -valore, ma piuttosto una probabilità che B è maggiore di A (che non non aspetta che sia <0,05).

È possibile eseguire le simulazioni semplici per verificare i risultati:

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

In entrambi i casi la risposta è sì.


Per quanto riguarda il codice, nota che for loop non è necessario e generalmente rendono le cose più lente in R, quindi puoi alternativamente usare vapplyun codice più pulito e un po 'più veloce:

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 ... Mi chiedo se tu abbia effettivamente testato la velocità, perché vapplynon è più vectoroziato del forloop, al contrario, sono sostanzialmente gli stessi. Bella risposta però.
— David Arenburg,

1
C / C ++ / Fortan forloop == vettorializzato; R forloop! = Vettorializzato. Questa è sostanzialmente la definizione di vettorializzato.
— David Arenburg,

1
@YehoshaphatSchellekens il punto con i log non riguarda determinati software ma il calcolo statistico generale. Nell'esempio sul sito viene fornito il codice julia fornito: julia è anche un linguaggio molto buono per la programmazione statistica e vengono ancora utilizzati i registri.
— Tim

2
In realtà, ho appena fatto una domanda riguardo a questa esatta discussione che abbiamo avuto su SO, potrei aver bisogno di ripensare il mio approccio verso vapplyin futuro. Spero di avere una bella risposta una volta per tutte.
— David Arenburg,

2
Ok, dopo aver riflettuto a lungo e aver riassunto i commenti e le risposte che ho ricevuto sulla mia domanda, penso di aver trovato una comprensione generale di ciò vapplyche è veramente. Vedi la mia risposta qui
— David Arenburg,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.