ベルヌーイ試験で「成功」の確率を推定するために必要なサンプルサイズ


13

ゲームが、完了時に報酬を与えるか、何も与えないイベントを提供するとします。報酬が与えられるかどうかを決定する正確なメカニズムは不明ですが、乱数ジェネレーターが使用されていると想定しています。結果がハードコードされた値よりも大きい場合は、報酬が得られます。

報酬が与えられる頻度を決定するためにプログラマーが使用した値(推定15-30%)を基本的にリバースエンジニアリングする場合、必要なサンプル数をどのように計算しますか?

私はここの「真の確率の推定」セクションから始めました:Checking_whether_a_coin_is_fair、しかし私が正しい道を進んでいるかどうか確信がありません。95%の信頼度で最大3%のエラーが発生するために必要な〜1000サンプルの結果が得られました。

最終的に、私が解決しようとしているのは次のとおりです。

  • イベント#1は1.0Rの報酬を与え、時間のX%
  • イベント#2は、時間のY%で報酬1.4Rを提供します

XとYを正確に見積もり、どのイベントがより効率的かを判断したいと思います。最大で20分ごとに1つのサンプルしか取得できないため、サンプルサイズが大きいと問題になります。


6
95%の信頼度で最大3%のエラーが発生するために必要な最大1000個のサンプルの結果が得られました。」---かなりの量。そのため、世論調査では約1000人がサンプリングされることが多く、エラーのマージンは3%程度と報告されています。パーセンテージが0または1に近くない場合(これらの場合は幅が広すぎる場合)に非常によく当てはまります
Glen_b -Monica

1
「どちらがより効率的」とはどういう意味ですか?「どのイベントがより大きな期待報酬を持っている」という意味ですか?
Glen_b-2015

1
ええ、私は時間の経過とともに予想される報酬が大きい方を見つけようとしています。両方のイベントを行うことはできません。どちらか一方を選択する必要があります。イベント#1の報酬は少なくなりますが、より頻繁に報酬が与えられる可能性があります。
ブラッド

2
サンプルサイズが事前に固定されていない順次sampligを使用できます。このアプローチの利点は、(未知の)確率がどうであっても信頼性が保証されることです。たとえば、こちらをご覧ください。特に最後に参照された論文
Luis Mendo 2015年

回答:


5

あなたの個々の試験は独立していると仮定すると、あなたは二項変量観察 あなたが上で決めると推定したい。これで、最尤推定量であるサンプル分数分散がになり、。したがって、標準エラーはです。大標本の近似信頼区間には、約2の標準誤差があるため、最大に保つには、たとえば、 を解い て、

XBin(n,p)
nppp^=X/np(1p)n14np=121/4n=12n0.03
22n0.03
n1112。これで、同じ方法で、半角幅に関する他の要件を解決できます。が0.5から離れていることを知っている(または仮定しようとする)場合は、観測を少し少なくすることができます。p

2

エレガントさは劣っていますが、シミュレートする必要がありました。非常に単純なシミュレーションを作成しただけでなく、洗練されておらず実行速度も遅いです。それでも十分です。1つの利点は、いくつかの基本が正しい限り、エレガントなアプローチがいつ失敗するかを教えてくれることです。

サンプルサイズは、ハードコードされた値の関数として変化します。

だからここにコードです:

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

そして、これは、有病率の95%CIの不確実性がそれを超えずに 3%に可能な限り近いような、サンプルサイズと有病率のプロットです。±

標本サイズと有病率

50%から離れると、kjetilが示唆したように、「やや少ない観察」が必要と思われます。

400サンプルの前に、有病率の適切な推定値を取得し、サンプリング戦略を調整することができると思います。途中にジョギングがあるべきではないと思うので、N_loopsを10e3までバンプし、 "my_prev"の "by"を0.001までバンプします。


これが遅い場合は、ステップを小さすぎるためです。
kjetil b halvorsen 2018年

@kjetilbhalvorsen-それは十分良かった。「スロー」は免責事項であり、「手すり」は、メソッドに従事するのがより快適に感じられるようにするのに役立ちます。分析的なアプローチがわからない場合は、シミュレーションを使用すると、自分で学習したり、助けを求める必要があるかどうかを判断したりできます。
EngrStudent 2018年

1

イベント#1の場合はの値を、イベント#2の場合はの値を推定したいようです。ここで境界を決定するためにHoeffdingの不等式を簡単に使用できます。または、乗法の境界ではなく加法の境界が必要な場合は、Chernoffの境界を使用できます。XY

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.