Up

2項分布の信頼区間

Visual C++ フォームアプリケーション作成についてのTips

 

2項分布

のパラメータについて、信頼係数の信頼区間を求める。

N回の試行においてk回当該の事象が生起したときの信頼区間は、次式

で与えられる(岡本、1998pp. 176-179)。

 上記の方法で与えられる信頼区間と確率との関係は、「芝・南風原(1990)、pp. 90-92」で論じられている。

 上記の信頼区間を算出するプログラムCalcIntervalP.exeを用意した。プログラムファイル名CalcIntervalP.exeをクリックしてダウンロード・実行することができる。プログラムは.NET Framework 4.5対応である。プログラムのソースコードなどは圧縮ファイルCalcIntervalP.zipとしてまとめた。圧縮ファイル名CalcIntervalP.zipをクリックしてダウンロードしたものを解凍すれば、Visual C++ 2012で開くことができる。

 プログラムを実行すると図1のフォームが提示される。

図1

 

Nとkの値を設定して「Calc」ボタンをクリックすると図2のように計算結果が表示される。

図2

 

 信頼係数は、%を単位として適当な値を設定することができる。例えば、90%を設定して「Calc」ボタンをクリックすると、図3のようになる。

図3

 

CopyボタンをクリックするとRichTextBox内のテキストがクリップボードにコピーされる。Copyボタンをクリックしてから、例えばメモ帳に貼り付けると図4のようになる。

図4

 

 

Programming Tips

 

Visual C++/CLRによるフォームアプリケーションプログラミングにおいて、フォームのヘッダーファイルForm1.hにコードを書き込むとフォームの参照クラス型のメンバーとなるので、注意が必要である。フォームの参照クラス型のメンバーとしない場合は、別にヘッダーファイルやコードファイルを用意して、そこで宣言、定義する必要がある。例えば、式(2)、(3)におけるおよびはバイセクション法の関数Bisection

                Bisection( Cum_prob, -1.0, pa/2.0, 0.0, 1.0, UB, 1.0e-9 );

                Bisection( UCum_prob, 1.0, pa/2.0, 0.0, 1.0, LB, 1.0e-9 );

と呼び出して求めている。このとき累積確率などを与える関数Cum_probおよびUCum_probを引数とするために、これらの関数はフォームのヘッダーファイルForm1.hとは別のファイルcommon.cppおよびcommon.hで定義・宣言を行っている。

なお、関数Bisectionの頭部は、

        //     Bisection法による根の計算  

        void Bisection( double (*f)(double),

                        double s,                                       //   fが増加関数のときs > 0.0

                        double c,                                       //   根に対する関数値

                        double L_b, double U_b,                         //   根の存在区間の下限と上限

                        double & Root,                                  //   f(Root) = c

                        double acc );

となっている。

また、2項分布(1)における2項係数はそのまま計算するとオーバーフローを起こしやすい。2項係数の計算におけるオーバーフローと確率計算におけるアンダーフローを避けるため、式(1)を対数変換を利用した式

を用いて、

Math::Exp(LogCombi[i] + (i * Math::Log(p) + (N - i) * Math::Log(1.0 - p)))

と確率を求めている。上式におけるLogCombi[i]

である。これは、common.cppに用意した配列に計算の最初に以下のコードによって値を設定している。

                 LogCombi = new double[N+1];

                 for (int i = 0; i <= N; i++){

                        if ((i == 0) || (i == N)) LogCombi[i] = 0.0;

                        else {

                                double v = 0.0;

                                for (int j = i; j >= 1; j--)

                                        v += Math::Log(N + 1.0 - j) - Math::Log( j );

                                LogCombi[i] = v;

                        }

                 }

 

 

なお、Visual C++プログラミングの解説書として<岡本安晴「大学生のための心理学VC++プログラミング入門」勁草書房>を上梓した。

 

 

参考文献

岡本安晴(1998)「Delphiで学ぶデータ分析法」CQ出版

祐順・南風原朝和(1990)「行動科学における統計解析法」東京大学出版会

 

Up