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αB1B(α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.