Ukuran sampel diperlukan untuk memperkirakan probabilitas "sukses" dalam uji coba Bernoulli

13

Misalkan sebuah game menawarkan acara yang setelah selesai, baik memberikan hadiah, atau tidak memberikan apa pun. Mekanisme yang tepat untuk menentukan apakah hadiah diberikan tidak diketahui, tetapi saya berasumsi generator nomor acak digunakan, dan jika hasilnya lebih besar dari nilai hard-coded, Anda mendapatkan hadiahnya.

Jika pada dasarnya saya ingin merekayasa balik nilai apa yang digunakan programmer untuk menentukan seberapa sering hadiah diberikan (diperkirakan 15-30%), bagaimana cara menghitung jumlah sampel yang saya butuhkan?

Saya mulai dengan bagian "Estimator probabilitas sejati" di sini: Memeriksa_kapal_a_main_a_kartu , tapi saya tidak yakin saya menuju jalan yang benar. Saya mendapatkan hasil ~ 1000 sampel yang dibutuhkan untuk kesalahan maksimum 3% pada kepercayaan 95%.

Pada akhirnya, inilah yang saya coba pecahkan:

  • Acara # 1 memberikan hadiah 1.0R, X% dari waktu
  • Acara # 2 memberikan hadiah 1,4R, Y% dari waktu

Saya ingin memperkirakan X & Y cukup akurat untuk menentukan acara mana yang lebih efisien. Ukuran sampel besar adalah masalah karena saya hanya bisa mendapatkan 1 sampel setiap 20 menit, paling banyak.

Brad
sumber
6
" Saya mendapatkan hasil ~ 1000 sampel yang dibutuhkan untuk kesalahan maksimum 3% pada kepercayaan 95%. " --- cukup banyak; itu sebabnya jajak pendapat sering sampel sekitar 1000 orang ... dan kemudian melaporkan margin of error dalam urutan 3%. Ini berlaku dengan cukup baik ketika persentasenya tidak mendekati 0 atau 1 (terlalu lebar dalam kasus-kasus itu)
Glen_b -Reinstate Monica
1
Apa yang Anda maksud dengan "mana yang lebih efisien"? Apakah maksud Anda "acara mana yang memiliki penghargaan yang diharapkan lebih besar"?
Glen_b -Reinstate Monica
1
Ya, saya mencoba mencari tahu mana yang memiliki penghargaan yang diharapkan lebih besar dari waktu ke waktu. Saya tidak dapat melakukan kedua acara - harus memilih satu atau yang lain. Sementara Acara # 1 memberikan hadiah lebih sedikit, ada kemungkinan itu memberikan hadiah lebih sering.
Brad
2
Anda dapat menggunakan samplig berurutan , di mana ukuran sampel tidak diperbaiki sebelumnya. Keuntungan dari pendekatan ini adalah bahwa ia menjamin kepercayaan tidak peduli apa probabilitas (tidak diketahui). Lihat misalnya di sini ; khususnya makalah yang
Luis Mendo

Jawaban:

5

XBin(n,p)
nppp^=X/np(1p)n14n1/p=12 0,0321/4n=12n0.03n1112p
22n0.03
n1112p
kjetil b halvorsen
sumber
2

Saya tahu itu kurang elegan, tetapi saya harus mensimulasikannya. Saya tidak hanya membuat simulasi yang cukup sederhana, tetapi juga tidak bagus dan lambat untuk dijalankan. Cukup bagus. Satu keuntungan adalah bahwa, selama beberapa dasar-dasarnya benar, itu akan memberi tahu saya ketika pendekatan elegan jatuh.

Ukuran sampel akan bervariasi sebagai fungsi dari nilai hard-coded.

Jadi inilah kodenya:

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

±

ukuran sampel vs prevalensi

Jauh dari 50%, "pengamatan agak kurang" tampaknya diperlukan, seperti yang disarankan kjetil.

Saya pikir Anda bisa mendapatkan perkiraan prevalensi yang layak sebelum 400 sampel, dan sesuaikan strategi pengambilan sampel Anda. Saya tidak berpikir harus ada joging di tengah, dan jadi Anda mungkin menabrak N_loops hingga 10e3, dan menabrak "oleh" di "my_prev" ke 0,001.

EngrStudent
sumber
Jika ini lambat, itu karena Anda membuat langkah-langkahnya terlalu kecil!
kjetil b halvorsen
@kjetilbhalvorsen - itu cukup bagus. "Lambat" adalah penafian, dan "pegangan" yang dapat membantu penanya merasa lebih nyaman menggunakan metode ini. Jika Anda tidak tahu pendekatan analitik, simulasi dapat membantu Anda mengajar diri sendiri, atau membantu Anda memutuskan apakah Anda perlu meminta bantuan.
EngrStudent