第4章 多標本1変数パーミュテーションテストの例
- 4.1 イントロダクション
- 対象となるのは、(1)2群の平均や位置の比較、(2)one-way ANOVA、(3)goodness-of-fit fir irdered categirucak varuabkes、(4)without-interaction two-way ANOVA
- 4.2 2群の平均値の差の検定
- 全部で20人のデータ。2群に分けられて、群1は12人、群2は8人。20人はある点数を持ち、群1と群2との間に点数の分布の違いがあるかどうかを検定したい。
x1 = {66,57,81,62,61,60,73,59,80,55,67,70};
x2 = {64,58,45,43,37,56,44,42};
- 2群間の平均値が異なるかの検定というのはよくやられる。
- Permutation testでは、20人をパーミュテーションしてすることもできるし、それよりは場合数を減らしてやって、20人を12人と8人の2群に分ける場合わけとしてというパーミュテーションもできる
- Permutation 統計量は、『平均』をとって、その差を用いることもできるが、がpermutationally equivalentなので、この方が簡単。
- この統計量で計算して、pとして、オーダーの値が返る
public class univariateMultiSamplePerm {public static void main(String[] args) {
// 異なるdelta値での統計量を算出
int numseg = 100;
double[] delta = new double[numseg];
double initial=-20;
double dif = -initial*2/(double)numseg;
for(int i=0;i<delta.length;i++){
delta[i] = initial+dif*i;
}
//double[] delta = {-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10};
//double[] delta = {0};
//for(int i=0;i<delta.length;i++){
//delta[i] /= 0.1;
//}
double[] x1 = {1,2,3,4,5};
double[] x2 = {11,12,13,14,15};
//double[] x1 = {66,57,81,62,61,60,73,59,80,55,67,70};
//double[] x2 = {64,58,45,43,37,56,44,42};
double[] concat = concat(x1,x2);
int c = 100000000;
int seed = (int)(Math.random()*c);
//int seed = 10000;
String mval ="";
String mval2 ="";
for(int w=0;w<delta.length;w++){
MersenneTwisterFast mt = new MersenneTwisterFast(seed);
double[] concatMu = plusMu(concat,delta[w],x1.length);
double mw = MannWhitney(concatMu,x1.length);
//System.out.println("mw " + mw);
double DEV= 0.00000001;
int perm =10000;
double to = sumUpto(concatMu,x1.length);
//System.out.println("mu " + delta[w]);
//for(int i=0;i<concat.length;i++){
//System.out.println("concat concatMu " + concat[i] + " " + concatMu[i]);
//}
double[][] tmp0 = segment(concatMu,x1.length);
double to2 = difMean(tmp0[0],tmp0[1]);
double[] t = new double[perm];
double[] t2 = new double[perm];
double[] mwt = new double[perm];
for(int i=0;i<perm;i++){
//shuffleDoubleMZ(x1,mt);
//shuffleDoubleMZ(x2,mt);
shuffleDoubleMZ(concatMu,mt);
//concatMu = plusMu(concat,delta[w],x1.length);
//concat = concat(x1,x2);
double[][] tmp = segment(concatMu,x1.length);
t[i] = sumUpto(concatMu,x1.length);
t2[i] = difMean(tmp[0],tmp[1]);
mwt[i] = MannWhitney(concat,x1.length);
//System.out.println("t\tmwt\t" + t[i] +"\t" + t2[i] + "\t" + mwt[i]);
}
// 度数分布・信頼区間など
int[] h=signPerm.hist(t,20);
double[][] hdouble = signPerm.histAccum(t,1000);
// 統計量の信頼区間を算出表示
double confA = 0.000001;
double[] confInterval = signPerm.confInterval(hdouble,confA);
System.out.println("confident interval\t" + confInterval[0] + "\t" + confInterval[1]);
// 度数分布を標準出力
// System.out.println(histSt);
System.out.println("Histogram\n