Dimensione del campione necessaria per stimare la probabilità di "successo" nella sperimentazione di Bernoulli


13

Supponiamo che un gioco offra un evento che, una volta completato, dà una ricompensa o non dà nulla. L'esatto meccanismo per determinare se viene data la ricompensa è sconosciuto, ma suppongo che venga utilizzato un generatore di numeri casuali e se il risultato è maggiore di un valore codificato, si ottiene la ricompensa.

Se voglio sostanzialmente decodificare quale valore i programmatori hanno usato per determinare con quale frequenza viene data la ricompensa (stimata del 15-30%), come posso calcolare il numero di campioni di cui ho bisogno?

Ho iniziato con la sezione "Stimatore della vera probabilità" qui: Checking_whether_a_coin_is_fair , ma non sono sicuro di seguire la strada giusta. Stavo ottenendo risultati di circa 1000 campioni necessari per un errore massimo del 3% con una sicurezza del 95%.

In definitiva, ecco cosa sto cercando di risolvere:

  • L'evento n. 1 dà una ricompensa 1.0R, X% delle volte
  • L'evento n. 2 dà una ricompensa 1.4R, Y% delle volte

Vorrei stimare X e Y in modo sufficientemente preciso per determinare quale evento è più efficiente. I campioni di grandi dimensioni sono un problema poiché posso ottenere solo 1 campione ogni 20 minuti, al massimo.


6
" Stavo ottenendo risultati di circa 1000 campioni necessari per un errore massimo del 3% con una sicurezza del 95%. " --- praticamente; ecco perché i sondaggi spesso campionano circa 1000 persone ... e quindi segnalano un margine di errore nell'ordine del 3%. Si applica abbastanza bene quando la percentuale non è vicina a 0 o 1 (è troppo ampia in quei casi)
Glen_b -Reinstate Monica

1
Cosa intendi con "che è anche più efficiente"? Intendi "quale evento ha il premio atteso maggiore"?
Glen_b

1
Sì, sto cercando di capire quale ha la più grande ricompensa prevista nel tempo. Non posso fare entrambi gli eventi: devo scegliere l'uno o l'altro. Mentre l'Evento n. 1 offre una ricompensa minore, è possibile che la ricompensa sia più frequente.
Brad

2
È possibile utilizzare samplig sequenziale , in cui la dimensione del campione non è fissata in anticipo. Il vantaggio di questo approccio è che garantisce sicurezza, indipendentemente dalla probabilità (sconosciuta). Vedi ad esempio qui ; specialmente l'ultimo documento di
Luis Mendo,

Risposte:


5

Supponendo che le prove individuali siano indipendenti, si osserva una variazione binomiale dove si decide su e si desidera stimare . Ora lo stimatore della massima verosimiglianza di , la frazione del campione ha varianza che si ottiene per . Quindi l'errore standard è 1 / n p p p = X / n p ( 1 - p )

XBin(n,p)
nppp^=X/n p=1p(1-p)n14np=12 . Un intervallo di confidenza approssimativo di un campione di grandi dimensioni ha metà larghezza di circa 2 errori standard, quindi per mantenerlo al massimo a0,03, diciamo, devi risolvere 21/4n=12n0.03 che dàn1112. Ora puoi risolvere altri requisiti per la mezza larghezza, allo stesso modo. Se sai (o sei disposto ad assumere) chepè limitato da 0,5, puoi fare con un po 'meno osservazioni.
22n0.03
n1112p

2

So che è meno elegante, ma ho dovuto simularlo. Non solo ho creato una simulazione piuttosto semplice, ma è inelegante e lenta da eseguire. È abbastanza buono, però. Un vantaggio è che, purché alcune delle basi siano giuste, mi dirà quando l'approccio elegante cadrà.

La dimensione del campione varierà in funzione del valore hardcoded.

Quindi ecco il codice:

#main code
#want 95% CI to be no more than 3% from prevalence
#expect prevalence around 15% to 30%
#think sample size is ~1000

my_prev <- seq(from=0.15, to=0.30, by = 0.002)

samp_sizes <- seq(from=400, to=800, by = 1)
samp_sizes

N_loops <- 2000

store <- matrix(0,
                nrow = length(my_prev)*length(samp_sizes),
                ncol = 3)
count <- 1

#for each prevalence
for (i in 1:length(my_prev)){

     #for each sample size
     for(j in 1:length(samp_sizes)){

          temp <- 0

          for(k in 1:N_loops){

               #draw samples
               y <- rbinom(n = samp_sizes[j],
                           size = 1,
                           prob = my_prev[i])

               #compute prevalence, store
               temp[k] <- mean(y)

          }

          #compute 5% and 95% of temp
          width <-  diff(quantile(x = temp,probs = c(0.05,0.95)))

          #store samp_size, prevalence, and CI half-width
          store[count,1] <- my_prev[i]
          store[count,2] <- samp_sizes[j]
          store[count,3] <- width[[1]]

          count <- count+1
     }

}


store2 <- numeric(length(my_prev))

#go through store
for(i in 1:length(my_prev)){
     #for each prevalence
     #find first CI half-width below 3%
     #store samp_size

     idx_p <- which(store[,1]==my_prev[i],arr.ind = T)
     idx_p

     temp <- store[idx_p,]
     temp

     idx_2 <- which(temp[,3] <= 0.03*2, arr.ind = T)
     idx_2

     temp2 <- temp[idx_2,]
     temp2

     if (length(temp2[,3])>1){
     idx_3 <- which(temp2[,3]==max(temp2[,3]),arr.ind = T)
     store2[i] <- temp2[idx_3[1],2]
     } else {
          store2[i] <- temp2[2]
     }


}


#plot it
plot(x=my_prev,y=store2,
     xlab = "prevalence", ylab = "sample size")
lines(smooth.spline(x=my_prev,y=store2),col="Red")
grid()

±

dimensione del campione vs prevalenza

A parte il 50%, sembrano essere necessarie "osservazioni un po 'meno", come suggerito da Kjetil.

Penso che puoi ottenere una stima decente della prevalenza prima di 400 campioni e adattare la tua strategia di campionamento mentre procedi. Non penso che ci dovrebbe essere un jog nel mezzo, quindi potresti saltare N_loops fino a 10e3 e urtare "by" in "my_prev" fino a 0,001.


Se questo è lento, è perché rendi i passaggi troppo piccoli!
kjetil b halvorsen,

@kjetilbhalvorsen - era abbastanza buono. Il "lento" era un disclaimer e un "corrimano" che può aiutare chi si trova a sentirsi più a suo agio nel coinvolgere il metodo. Se non conosci l'approccio analitico, una simulazione può aiutarti a insegnare te stesso o aiutarti a decidere se devi chiedere aiuto.
EngrStudent,

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.