[[応用統計学]]

*概要 [#iea6d5ef]
-帰無仮説をたてる>日本人の母集団比率がA:O:B:AB=4:3:2:1である。
-教室では A:13人, O:12人, B:12人, AB:4人であった。
-よってχ2乗値は2.47651となる。
-帰無仮説の下で多数の試行を行い、χ2乗の値を比べる。
-χ2乗の値は、確率が低くなれば大きくなるという特性を持つ(誤差の2乗の値が大きくなる)。
-χ2乗の値が2.47651より大きい確率を調べる。
--確率が大きいならば2.47651というχ2乗値は、期待値に近い値だったということ。
--確率が小さいならば2.47651というχ2乗値は、期待値から遠い(確率的にあまり起こりえない)値だったということ。
---なぜならば、χ2乗の値がより大きい値をとる例は、より起こりにくい。より起こりにくいことは、あまり起こらない、つまり確率が小さくなる。より起こりにくいことが起こることが多いということは(上)、その値はおこりやすいと考えてよい。
-大体40~50%となるはず。この確率について考察する。
-通常この仮説が正しいか考える水準を(有意水準)1%や5%としてとるそれよりもはるかに大きい値なので、仮説にそう結果だと考えていい。
*実際 [#e736abe2]
-プログラムを書く
--下のはtakoの例、コンパイルにはdSFMTのライブラリが必要。探すか解読してね。
--そのまんまコピーはやめといたほうがいいよ
	#include <stdio.h>
	#include <math.h>
	#include <stdlib.h>
	#include <time.h>
	
	
	#define COUNT 41
	#define TIMES 10000
	
	#define SFMT_MEXP 19937
	#define HAVE_SSE2 1
	
	#include "dSFMT.c"
	
	double calc_kai2(double kimu[4],int dat[4]);
	void gennum(int cnt,double kimu_prob[4],int gen[4]);
	
	//A O B AB
	int main(void){
		//帰無仮説の確率
		double kimu_prob[4]={0.4,0.3,0.2,0.1};
		double kimu[4];
		//genは演算用、realに実際の教室での人数が入る
		int gen[4],real[4]={13,12,12,4};
		//TIMES(試行)回数分χ2乗値を格納する
		double kai2s[TIMES],kai2,prob_big;
		int i,bigger_cnt;
		
		int seed=(unsigned) time(NULL);
		init_gen_rand(seed);
		
		for(i=0;i<4;i++){
			kimu[i]=COUNT*kimu_prob[i];
		}
		printf("kr0:%f\n",kimu[0]);
		kai2=calc_kai2(kimu,real);
		
		printf("kai2:%f\n",kai2);
		for(i=0;i<TIMES;i++){
			gennum(COUNT,kimu_prob,gen);
			kai2s[i]=calc_kai2(kimu,gen);
			//printf("%f\n",kai2s[i]);
		}
		bigger_cnt=0;
		for(i=0;i<TIMES;i++){
			if(kai2<kai2s[i]){
				bigger_cnt++;
			}
		}
		prob_big=(double)(bigger_cnt)/TIMES;
		printf("prob_big:%f\n",prob_big);
		
		return 0;
	}
	
	double calc_kai2(double kimu[4],int dat[4]){
		int i;
		double kai2;
		kai2=0;
		for(i=0;i<4;i++){
			kai2+=(dat[i]-kimu[i])*(dat[i]-kimu[i])/kimu[i];
		}
		return kai2;
	}
	
	void gennum(int cnt,double kimu_prob[4],int gen[4]){
		int i,j,chk;
		double conv,rnum;
		for(i=0;i<4;i++){
			gen[i]=0;
		}
		for(i=0;i<cnt;i++){
			rnum=genrand_close_open();
			conv=0;
			for(j=0;j<4;j++){
				conv+=kimu_prob[j];
				if(rnum<conv){
					gen[j]++;
					//printf("%d\t%d\t%f\t%f\n",i,j,rnum,conv);
					break;
				}
				if(j==3){
					//ありえない場合
					printf("error:%d\t%d\t%f\t%f\n",i,j,rnum,conv);
				}
			}
		}
		chk=0;
		for(j=0;j<4;j++){
			chk+=gen[j];
		}
		if(chk!=cnt){
			//ありえない場合
			printf("error:%d\t",chk);
		}
	}

尤度について

 L=41!/(a!b!c!d!) *(a/n)^a*(b/n)^b*(c/n)^c*(d/n)^d
とした式をカイ二乗統計量の代わりに用いる。

後はif文中の kai2>kai2s を
\lambda=(定数)と設定し、
\lambdaを調整して(多分\lambda=1でいいと思います)
(\lambda)*kai2<kai2s とすれば尤度のほうもできると思われます。

導出過程は添付ファイルを見てください。~
そ、そうなの?…尤度比検定統計量
&mimetex(T = \sum_{i}n_{i}\log \frac{n_{i}/n}{p_i});~
を使えばいいのでは?それとも
 L=41!/(a!b!c!d!) *(Pa)^a*(Po)^b*(Pb)^c*(Pab)^d
ならかなり近い値になるかも? by tako

-しらべてみよう!なんとなくエントロピーに形が似てるよね。もしかしたら関係があるのかな?


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS