import java.io.IOException;
public class kruskalWallis {
int nGroup;
int nRecord;
int[] nRecPerGroup;
double[][] data;
double[][] rank;
double T;
double p;
/**
* @param args
*/
public static void main(String[] args) throws IOException {
// TODO 自動生成されたメソッド・スタブ
int n=10;
double[] d2=new double[n];
for(int i=0;i<d2.length;i++){
d2[i]=Math.random();
}
d2[3]=d2[6];
d2[2]=d2[5];
d2[4]=d2[5];
double[] d={1,3,5,2,4,6,3};
int[][] sortorder = MiscUtil.bublSortSameVals(d2);
double[][] d3={{1,4,6},{2,3,2,5},{1,6,2,3,4}};
kruskalWallis kw = new kruskalWallis(d3);
org.apache.commons.math.distribution.ChiSquaredDistributionImpl ch =
new org.apache.commons.math.distribution.ChiSquaredDistributionImpl(kw.nGroup-1);
try{
kw.p=1-ch.cumulativeProbability(kw.T);
} catch (org.apache.commons.math.MathException ex) {
}
System.out.println("T=\t"+kw.T+"\n"+"p=\t"+kw.p);
}
public kruskalWallis(double[][] d){
nGroup=d.length;
nRecPerGroup=new int[nGroup];
rank=new double[nGroup][0];
for(int i=0;i<d.length;i++){
nRecord+=d[i].length;
nRecPerGroup[i]=d[i].length;
rank[i]=new double[nRecPerGroup[i]];
}
double[] serialData=new double[nRecord];
int counter=0;
for(int i=0;i<d.length;i++){
for(int j=0;j<d[i].length;j++){
serialData[counter]=d[i][j];
counter++;
}
}
double[][] serialRank=MiscUtil.bublSortSameValsRank(serialData);
int counter1=0;
int counter2=0;
for(int i=0;i<serialRank.length;i++){
//System.out.println("counter1 2 "+counter1+ " "+counter2);
rank[counter1][counter2]=serialRank[i][4];
if(counter2==d[counter1].length-1){
counter1++;
counter2=0;
}else{
counter2++;
}
}
for(int i=0;i<rank.length;i++){
for(int j=0;j<rank[i].length;j++){
System.out.print(rank[i][j]+"\t");
}
System.out.print("\n");
}
double[] rankSumPerGroup = new double[d.length];
double elem0=0;
for(int i=0;i<rank.length;i++){
for(int j=0;j<rank[i].length;j++){
rankSumPerGroup[i]+=rank[i][j];
elem0+=rank[i][j]*rank[i][j];
}
}
double elem1 =0;
for(int i=0;i<rankSumPerGroup.length;i++){
elem1+=rankSumPerGroup[i]*rankSumPerGroup[i]/nRecPerGroup[i];
}
elem1 -=(double)(nRecord*(nRecord+1)*(nRecord+1))/4;
elem0 -=(double)(nRecord*(nRecord+1)*(nRecord+1))/4;
double elemS=1/((double)(nRecord-1))*elem0;
T=elem1/elemS;
//int df = nGroup-1;
//System.out.println("T=\t"+T+"\n"+"p=\t"+p);
}
/*
public static double[] rank(double[] d){
double[][] sortOrder = MiscUtil.bublSortSameValsRank(d);
double[] ret = new double[d.length];
for(int i=0;i<ret.length;i++){
ret[i]=(double)sortOrder[i][2]+(double)(d.length+1-sortOrder[i][1]-sortOrder[i][2])/2;
}
return ret;
}
*/
}