public static double getPvalue(DataTable2D dataTable) {
        if(dataTable.isValid()==false) {
            throw new IllegalArgumentException("The provided Table does not have a rectangular format.");
        }
        
        Map<Object, Double> columnSum = new HashMap<>(); //it stores the column sums that are required by the algorithm

        List<Integer> tiesCounter = new ArrayList<>(); //it stores the total ties occurred along with the values that were involved in the tie in each case

        //Find Ranks from Data Table. We don't store them to reduce memory consumption
        for(Map.Entry<Object, AssociativeArray> entry1 : dataTable.entrySet()) {
            AssociativeArray row = entry1.getValue(); 
            
            //find the number of tied values and convert values into ranks
            AssociativeArray tiedValuesArray = Ranks.getRanksFromValues(row.copy()); //this copies the data before passing them into the Ranks.
            
            for(Object value : tiedValuesArray.values()) {
                tiesCounter.add( ((Number)value).intValue() );
            }
            
            for(Map.Entry<Object, Object> entry2 : row.entrySet()) {
                Object j = entry2.getKey();
                
                double v = TypeInference.toDouble(entry2.getValue());
                if(columnSum.containsKey(j)==false) {
                    columnSum.put(j, v);
                }
                else {
                    columnSum.put(j, columnSum.get(j)+v);
                }
            }

            //tiedValuesArray = null;
            //row = null;
        }

        int n=dataTable.size();
        int k=columnSum.size();

        double Fscore=0;
        for(Double value : columnSum.values()) {
            Fscore+=value*value;
        }
        //columnSum = null;
        Fscore=(12.0/(n*k*(k+1.0)))*Fscore - 3.0*n*(k+1.0);

        //Correct for ties
        if(!tiesCounter.isEmpty()) {
            double C=0.0;
            for(Integer Ti : tiesCounter) {
                C+=((Ti*Ti-1.0)*Ti); //faster than using pow()
            }
            Fscore/=(1.0-C/(n*k*(k*k-1.0))); //again faster than using pow()
        }

        double pvalue=scoreToPvalue(Fscore, k);

        return pvalue;
    }
public static double getPvalue ( DataTable2D dataTable ) { if ( dataTable . isValid ( ) == false ) { throw new IllegalArgumentException ( "The provided Table does not have a rectangular format." ) ; } Map < Object , Double > columnSum = new HashMap < > ( ) ; List < Integer > tiesCounter = new ArrayList < > ( ) ; for ( Map . Entry < Object , AssociativeArray > entry1 : dataTable . entrySet ( ) ) { AssociativeArray row = entry1 . getValue ( ) ; AssociativeArray tiedValuesArray = Ranks . getRanksFromValues ( row . copy ( ) ) ; for ( Object value : tiedValuesArray . values ( ) ) { tiesCounter . add ( ( ( Number ) value ) . intValue ( ) ) ; } for ( Map . Entry < Object , Object > entry2 : row . entrySet ( ) ) { Object j = entry2 . getKey ( ) ; double v = TypeInference . toDouble ( entry2 . getValue ( ) ) ; if ( columnSum . containsKey ( j ) == false ) { columnSum . put ( j , v ) ; } else { columnSum . put ( j , columnSum . get ( j ) + v ) ; } } } int n = dataTable . size ( ) ; int k = columnSum . size ( ) ; double Fscore = 0 ; for ( Double value : columnSum . values ( ) ) { Fscore += value * value ; } Fscore = ( 12.0 / ( n * k * ( k + 1.0 ) ) ) * Fscore - 3.0 * n * ( k + 1.0 ) ; if ( ! tiesCounter . isEmpty ( ) ) { double C = 0.0 ; for ( Integer Ti : tiesCounter ) { C += ( ( Ti * Ti - 1.0 ) * Ti ) ; } Fscore /= ( 1.0 - C / ( n * k * ( k * k - 1.0 ) ) ) ; } double pvalue = scoreToPvalue ( Fscore , k ) ; return pvalue ; }
Calculates the p-value of null Hypothesis .

@param dataTable
@return