第4章(3)Repeated Observations サンプルは対等・multiple量的変数 多標本1変数のパーミュテーションテストの例



  • 4.5
    • 複数の標本(n)があり、それらの違いはないものとできるとき、それぞれの標本に複数の観測(k)がなされて、n x k 行列状のデータが得られている。これについて、k変数は偏りがないことを示したいとする。具体的には、ある測定量について経時データをとりつつ、測定時が影響していないことを示したいときなど
    • 順列は、(k!)^nである
    • Friedman's Rankテストが統計量として知られている。
      • 各サンプルのデータをサンプル内で順序づけし、nサンプルにわたって、各計測時において平均値をとり¥bar{R_j}, j=1,2,.,,,kとする
        • T_F =¥sum_{j=1}^k (¥bar{R_j}-¥frac{k+1}{2})^2¥times ¥frac{12 n}{k(k+1)}
    • 対応するPermutation 統計量T_Rを次の式で与える
      • T_R=¥frac{¥sum_{j=1}^k(¥bar{X_{j.}}-¥bar{X_{..}})^2}{¥sum_{j=1}^k¥sum_{i=1}^n (X_{ji}-¥bar{X_{.i}}-¥bar{X_{j.}}-¥bar{X_{..}})^2}
        • ただし、¥bar{X_{..}}は全データの平均、¥bar{X_{.i}},¥bar{X_{j.}}は、それぞれ、サンプルごとの平均、変数ごとの平均。T_R算出用のエクセルはこちら
    • これらの一致はこの程度(掲載図、およびこちらの図)
    • ソースはこちら

public class RepeatedData {

public static void main(String[] args) {
//2D data
double[][] data ={
{320,278,236,222,232},
{478,513,415,359,292},
{921,701,645,526,458},
{213,230,261,253,199},
{273,338,323,332,222},
{392,302,289,305,172},
{469,443,292,235,233},
{422,389,359,331,185},
{613,649,626,588,636},
{395,318,298,269,328},
{462,400,360,247,284}
};

int numUnit = data.length;
int numVar = data[0].length;//No. categories



// 異なるdelta値での統計量を算出
int numseg = 1;
double[] delta = new double[numseg];

double initial=0;
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;
//}
/*
int[] categoryNum = new int[data.length];
for(int i=0;i<categoryNum.length;i++){
categoryNum[i] = data[i].length;
}


double[] concat = concatMult(data);
*/

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 to = GoFTR(data);
double to2 = Friedman(data);
/*
double[] toTd = GoFTypT(data,group);
double to = toTd[0];
double to2 = toTd[1];
double to3 = GoFT(data,group);
double to4 = GoFT2(data, group);

double t2ADo = GoFT2AD(data,group);
double t2fADo = GoFT2fAD(data,group);
double tchio = Chisq(data,group);
*/

double DEV= 0.00000001;
int perm =100;


System.out.println("to to2 " + to + " " + to2);


double[] t = new double[perm];
double[] t2 = new double[perm];
//double[] t2AD = new double[perm];
//double[] t2fAD = new double[perm];
//double[] tchi = new double[perm];

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

for(int j=0;j<data.length;j++){
shuffleDoubleMZ(data[j],mt);
}

//shuffleDoubleMZ(data[0],mt);

t[i] = GoFTR(data);
t2[i] = Friedman(data);
/*
double[] tmpt = GoFTypT(data,group);
t[i] = tmpt[0];
t2[i] = tmpt[1];
double tmpt2 = GoFT(data,group);
double tmpt3 = GoFT2(data,group);
t2AD[i] = GoFT2AD(data,group);
t2fAD[i] = GoFT2fAD(data,group);
tchi[i] = Chisq(data,group);
*/
System.out.println("t\tmwt\t" + t[i] +"\t" + t2[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