Kruskal-Wallis

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;
		
	}
	*/

}