第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!=2.4329 ¥times 10^{18}することもできるし、それよりは場合数を減らしてやって、20人を12人と8人の2群に分ける場合わけとして_{12}¥mathrm{C}_8 = 125970というパーミュテーションもできる
    • Permutation 統計量は、『平均¥bar{X_j}=¥frac{¥sum_i X_{ij}}{n_j}』をとって、その差を用いることもできるが、T = ¥sum_i X_{1i}がpermutationally equivalentなので、この方が簡単。
    • この統計量で計算して、pとして、10^{-4}オーダーの値が返る

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