La taille de l'échantillon est nécessaire pour estimer la probabilité de «succès» dans l'essai Bernoulli

13

Supposons qu'un jeu propose un événement qui, à la fin, donne une récompense ou ne donne rien. Le mécanisme exact pour déterminer si la récompense est donnée est inconnu, mais je suppose qu'un générateur de nombres aléatoires est utilisé, et si le résultat est supérieur à une valeur codée en dur, vous obtenez la récompense.

Si je veux essentiellement rétroconcevoir la valeur que les programmeurs ont utilisée pour déterminer la fréquence à laquelle la récompense est accordée (estimée à 15-30%), comment puis-je calculer le nombre d'échantillons dont j'ai besoin?

J'ai commencé avec la section "Estimateur de la probabilité réelle" ici: Checking_whether_a_coin_is_fair , mais je ne suis pas certain que je vais sur la bonne voie. J'obtenais les résultats de ~ 1000 échantillons nécessaires pour une erreur maximale de 3% à 95% de confiance.

En fin de compte, voici ce que j'essaie de résoudre:

  • L'événement n ° 1 donne une récompense 1.0R, X% du temps
  • L'événement # 2 récompense 1.4R, Y% du temps

Je voudrais estimer assez précisément X & Y pour déterminer quel événement est le plus efficace. Les grands échantillons sont un problème car je ne peux obtenir qu'un échantillon toutes les 20 minutes au maximum.

Brad
la source
6
" J'obtenais les résultats de ~ 1000 échantillons nécessaires pour une erreur maximale de 3% à 95% de confiance. " --- à peu près; c'est pourquoi les sondages échantillonnent souvent environ 1000 personnes ... puis rapportent une marge d'erreur de l'ordre de 3%. Cela s'applique assez bien lorsque le pourcentage n'est pas proche de 0 ou 1 (il est trop large dans ces cas)
Glen_b -Reinstate Monica
1
Qu'entendez-vous par «qui est encore plus efficace»? Vous voulez dire "quel événement a la plus grande récompense attendue"?
Glen_b -Reinstate Monica
1
Ouais, j'essaie de savoir qui a la plus grande récompense attendue au fil du temps. Je ne peux pas faire les deux événements - je dois choisir l'un ou l'autre. Bien que l'événement n ° 1 donne moins de récompense, il est possible qu'il donne la récompense plus souvent.
Brad
2
Vous pouvez utiliser un échantillonnage séquentiel , dans lequel la taille de l'échantillon n'est pas fixée à l'avance. L'avantage de cette approche est qu'elle garantit une confiance quelle que soit la probabilité (inconnue). Voir par exemple ici ; spécialement le dernier article
Luis Mendo

Réponses:

5

En supposant que vos essais individuels sont indépendants, vous observez une variable binomiale où vous décidez de et souhaitez estimer . Maintenant, l'estimateur du maximum de vraisemblance de , la fraction d'échantillon a la variance qui est obtenue pour . L'erreur standard est donc . Un intervalle de confiance approximatif sur un grand échantillon a une demi-largeur d'environ 2 erreurs standard, donc pour garder cela au maximum , disons, vous devez résoudre qui donnen p p p = X / n p ( 1 - p )

XBin(n,p)
nppp^=X/n p=1p(1p)n14n1/p=12 0,0321/4n=12n0.03n1112p
22n0.03
n1112 . Maintenant, vous pouvez résoudre les autres exigences de demi-largeur, de la même manière. Si vous savez (ou êtes prêt à supposer) que est borné à 0,5, vous pouvez le faire avec un peu moins d'observations.p
kjetil b halvorsen
la source
2

Je sais que c'est moins élégant, mais j'ai dû le simuler. Non seulement j'ai construit une simulation assez simple, mais elle est inélégante et lente à exécuter. C'est assez bon, cependant. Un avantage est que, tant que certaines bases sont correctes, cela me dira quand l'approche élégante tombera.

La taille de l'échantillon va varier en fonction de la valeur codée en dur.

Voici donc le code:

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

Et voici le graphique de la taille de l'échantillon en fonction de la prévalence de telle sorte que l'incertitude de l'IC à 95% pour la prévalence soit aussi proche que possible de 3% sans la dépasser.±

taille de l'échantillon vs prévalence

Loin de 50%, "un peu moins d'observations" semblent nécessaires, comme le suggère kjetil.

Je pense que vous pouvez obtenir une estimation décente de la prévalence avant 400 échantillons et ajuster votre stratégie d'échantillonnage au fur et à mesure. Je ne pense pas qu'il devrait y avoir un jogging au milieu, et vous pourriez donc faire passer N_loops jusqu'à 10e3, et faire passer le "by" dans "my_prev" à 0,001.

EngrStudent
la source
Si c'est lent, c'est parce que vous faites les étapes bien trop petites!
kjetil b halvorsen
@kjetilbhalvorsen - c'était assez bon. Le "lent" était un avertissement, et une "main courante" qui peut aider le demandeur à se sentir plus à l'aise pour engager la méthode. Si vous ne connaissez pas l'approche analytique, une simulation peut vous aider à vous enseigner vous-même ou à décider si vous devez demander de l'aide.
EngrStudent
1

Il semble que vous voulez estimer pour l' événement # 1 la valeur de et pour l' événement # 2 la valeur de . Vous pouvez facilement utiliser l'inégalité de Hoeffding pour déterminer les limites ici, ou si vous voulez des limites additives plutôt que multiplicatives, vous pouvez utiliser la limite de Chernoff .YXY

MotiN
la source