Tamanho da amostra necessário para estimar a probabilidade de "sucesso" no ensaio de Bernoulli

13

Suponha que um jogo ofereça um evento que, após a conclusão, dê uma recompensa ou nada. O mecanismo exato para determinar se a recompensa é dada é desconhecido, mas presumo que um gerador de números aleatórios seja usado e, se o resultado for maior que algum valor codificado, você receberá a recompensa.

Se eu quiser basicamente fazer engenharia reversa do valor que os programadores usaram para determinar com que frequência a recompensa é concedida (estimada em 15 a 30%), como calculo o número de amostras de que preciso?

Comecei com a seção "Estimador de probabilidade verdadeira" aqui: Checking_whether_a_coin_is_fair , mas não tenho certeza se estou seguindo o caminho certo. Eu estava obtendo resultados de ~ 1000 amostras necessárias para um erro máximo de 3% com 95% de confiança.

Por fim, eis o que estou tentando resolver:

  • O evento 1 dá a recompensa 1.0R, X% do tempo
  • O evento # 2 dá a recompensa 1.4R, Y% do tempo

Eu gostaria de estimar X e Y com precisão suficiente para determinar qual evento é mais eficiente. Amostras grandes são um problema, pois só posso obter 1 amostra a cada 20 minutos, no máximo.

Brad
fonte
6
" Eu estava obtendo resultados de ~ 1000 amostras necessárias para um erro máximo de 3% com 95% de confiança. " --- praticamente; é por isso que as pesquisas costumam amostrar cerca de 1000 pessoas ... e, em seguida, reportar uma margem de erro na ordem de 3%. Aplica-se muito bem quando a percentagem não é próximo de 0 ou 1 (é muito grande nesses casos)
Glen_b -Reinstate Monica
1
O que você quer dizer com "o que é ainda mais eficiente"? Você quer dizer "qual evento tem a maior recompensa esperada"?
Glen_b -Reinstala Monica
1
Sim, estou tentando descobrir qual tem a maior recompensa esperada ao longo do tempo. Não posso fazer os dois eventos - tenho que escolher um ou outro. Embora o Evento # 1 ofereça menos recompensa, é possível que a recompensa seja mais frequente.
Brad
2
Você pode usar amostragem sequencial , na qual o tamanho da amostra não é previamente fixado. A vantagem dessa abordagem é que ela garante confiança, independentemente da probabilidade (desconhecida). Veja por exemplo aqui ; especialmente o último referenciado papel
Luis Mendo

Respostas:

5

XBin(n,p)
nppp^=X/np(1p)n14np=121/4n=12n0.03
22n0.03
n1112p
kjetil b halvorsen
fonte
2

Eu sei que é menos elegante, mas tive que simular. Não apenas criei uma simulação bastante simples, mas é deselegante e lenta de executar. É bom o suficiente, no entanto. Uma vantagem é que, enquanto alguns dos princípios básicos estiverem corretos, ele me dirá quando a abordagem elegante cair.

O tamanho da amostra varia em função do valor codificado.

Então aqui está o código:

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

±

tamanho da amostra vs prevalência

Longe de 50%, "um pouco menos de observações" parece ser necessária, como sugerido pela kjetil.

Eu acho que você pode obter uma estimativa decente da prevalência antes de 400 amostras e ajustar sua estratégia de amostragem à medida que avança. Não acho que deva haver uma corrida no meio e, portanto, você pode aumentar o N_loops até 10e3 e aumentar o "by" em "my_prev" para 0,001.

EngrStudent
fonte
Se isso for lento, é porque você torna os passos muito pequenos!
Kjetil b halvorsen
@kjetilbhalvorsen - foi bom o suficiente. O "lento" era um aviso e um "corrimão" que pode ajudar o solicitante a se sentir mais à vontade para usar o método. Se você não conhece a abordagem analítica, uma simulação pode ajudá-lo a se ensinar ou a decidir se precisa pedir ajuda.
precisa saber é o seguinte