逐次確率比検定を試す
はじめに
あらかじめ標本サイズを決めるのではなく、十分と判断されるまでダイナミックに判断を繰り返す逐次確率比検定を参考に、
チョコボールの銀のエンジェルの出現確率について判断するとどうなるか試してみる。
逐次確率比検定とは
- ベイズ統計学の枠組みで、ベイズ更新の機能を通して1つずつ標本抽出していきながら同時に検定にも用いる事ができる
- 逐次決定過程 : 標本抽出をするたびに判断を行い、結論がでたと認められるタイミングで停止する過程
- 行動
- action0 : 結論を保留し、標本抽出を再度行う
- action1 : 帰無仮説H1を採択
- action2 : 対立仮説H2を採択
尤度比検定(Likelihood Ratio Test)
逐次確率比検定(Sequential Probability Ratio Test)
- あるA,B>0に対して、n回目まで抽出した標本での尤度比λnに対し、以下のようにする
- B<λn<A : action0
- λn <= B : action1
- A <= λn : action2
- B = β / (1 - α)
- A = (1 - β) / α
- α:第1種の誤りの確率(有意水準)
- β:第2種の誤りの確率(危険率,1-β=検出力)
二項分布の場合
- n回の独立試行のうち、k回が事象Tで、(n-k)回が事象Sで、各試行における事象Tである確率pは一定であるような場合、事象Tは二項分布となる
- P[X=k;p] = nCk * p^k * (1-p)^{n-k}
- H1 : p = θ1 (出現確率pがθ1より小さい)
- H2 : p = θ2 (出現確率pがθ2より大きい)
- 尤度比λn = {(1-θ2)/(1-θ1)}^n * {(θ2/(1-θ2))/(θ1/(1-θ1))}^k
- β/(1-α) < λn < (1-β)/αである限り抽出を繰り返す
チョコボールのエンジェル
チョコボールのエンジェルとは
- http://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A7%E3%82%B3%E3%83%9C%E3%83%BC%E3%83%AB
- チョコボールは森永製菓から発売されているチョコレート菓子
- 菓子はすべて栃木県の小山市の森永製菓小山工場で生産されている
- パッケージに「くちばし」と呼ばれる取り出し口がついており、そこに低い確率で「エンジェル」のイラストがついている
- 金のエンジェル、銀のエンジェルがあり、かつ、金のエンジェルの出現確率<銀のエンジェルの出現確率であることがわかっている
- 金のエンジェルは1枚で「おもちゃの缶詰」と呼ばれるプレゼントと交換可能
- 銀のエンジェルは5枚で「おもちゃの缶詰」と交換可能
- チョコボールの種類として、以下がある
- これまで、このエンジェルの出現確率を求めるため、数々の検証が行われている
チョコボールのエンジェル出現確率の変動
- http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1486515029
- 懸賞額が「景品表示法」により定まっているため、年(や時期)によって異なりうる
- しかし、数々の検証により、おおよそ金は1%、銀は5%の確率で含まれている模様
購入判断
- 銀のエンジェルがでる確率が5%以上ならばチョコボールを買い続けるけど、1%以下ならば買い続けるのはバカらしいのでやめたい、とする
- 判断方法として、逐次確率比検定の二項分布の場合に照らし合わせて考えてみる
- 常にエンジェルが入っている確率は、抽出期間内において、時期に依らず一定であると仮定
チョコボールの標本抽出方法
定義
- 以下と定義して計算する
- H1 : p = 0.1
- H2 : p = 0.5
- チョコボールの値段は安いので、標本サイズが増えたとしても、厳しめに判定したいとする
- α = 0.05
- β = 0.005
コード
シミュレーションしてみる。
#include <iostream> #include <vector> #include <cmath> static const double PI = 3.141592653589793238; static const double EPS = 1e-9; //xorshift // 注意: longではなくint(32bit)にすべき unsigned long xor128(){ static unsigned long x=123456789, y=362436069, z=521288629, w=88675123; unsigned long t; t=(x^(x<<11)); x=y; y=z; z=w; return w=(w^(w>>19))^(t^(t>>8)); } //[0,1)の一様乱数 // 注意: int_maxぐらいで割った方がよい double frand(){ return xor128()%10000000000/static_cast<double>(10000000000); } bool getChocoBall(double p){ double r = frand(); if(r < p) return true; return false; } int main(){ int n = 0, k = 0; double p = 0.005; //実際の出現確率 double theta1 = 0.01; //H1 double theta2 = 0.05; //H2 double alpha = 0.05; //有意水準 double beta = 0.005; //危険度 while(true){ n++; //購入 bool res = getChocoBall(p); if(res) k++; //対数尤度比の計算 double cal = 0.0; cal += n * log( (1.0-theta2)/(1.0-theta1) ); cal += k * log( (theta2/(1.0-theta2)) / (theta1/(1.0-theta1)) ); //判定 double B = log( beta / (1.0-alpha) ); double A = log( (1.0-beta) / alpha ); //std::cout << B << "\t" << cal << "\t" << A << std::endl; if(cal+EPS < B){ std::cout << "STOP" << std::endl; //買うのをやめたい break; } else if(A+EPS < cal){ std::cout << "CONTINUE" << std::endl; //これからも買い続けよう break; } std::cout << n << "(" << k << ") : MEASURING..." << std::endl; } return 0; }
結果
1000回ずつ、買い続けるか(CONTINUE)、買うのをやめるか(STOP)を判定したものを比較してみる。
実際の確率 | STOPになった個数 | CONTINUEになった個数 | 抽出回数についての標本平均 | 抽出回数についての標本分散 |
---|---|---|---|---|
p=0.001 | 1000 | 0 | 179.05 | 428.654 |
p=0.005 | 998 | 2 | 220.804 | 3607.37 |
p=0.01 | 966 | 34 | 302.276 | 19772.7 |
p=0.02 | 537 | 463 | 449.92 | 128463 |
p=0.03 | 63 | 937 | 255.586 | 52570.5 |
p=0.04 | 5 | 995 | 130.009 | 12308.3 |
p=0.05 | 1 | 999 | 87.434 | 5358.39 |
p=0.10 | 0 | 1000 | 32.315 | 436.67 |
参考
- http://ja.wikipedia.org/wiki/%E5%B0%A4%E5%BA%A6%E6%AF%94%E6%A4%9C%E5%AE%9A
- http://en.wikipedia.org/wiki/Sequential_probability_ratio_test
- 松原「ベイズ統計学概説-フィッシャーからベイズへ」
- http://www.math.s.chiba-u.ac.jp/~wang/teaching/b20409.pdf
- http://www.econ.kyoto-u.ac.jp/~sueishi/statistics/stat9.pdf
- http://www.ne.jp/asahi/personal/kobayashi-osamu/Writings/Reports/AdaptiveTest.9212/AdaptiveTest.9212.html