private void groupStatistics(){
        if(!this.dataEntered)throw new IllegalArgumentException("no data has been entered");
        
        this.groupMeansBD = new BigDecimal[this.nGroups];               // group means as BigDecimal
        this.groupMeans = new double[this.nGroups];                     // group means as double
        this.groupSD = new double[this.nGroups];                        // group standard deviations
        this.groupSE = new double[this.nGroups];                        // group standard errors
        this.groupClb = new double[this.nGroups];                       // lower bound of the group mean critical probability confidence limit
        this.groupCub = new double[this.nGroups];                       // upper bound of the group mean critical probability confidence limit
        this.groupMinimumBD = new BigDecimal[this.nGroups];             // group minimum nas BigDecimal
        this.groupMinimum = new double[this.nGroups];                   // group minimum nas double
        this.groupMaximumBD = new BigDecimal[this.nGroups];             // group maximum as BigDecimal
        this.groupMaximum = new double[this.nGroups];                   // group maximum as double
        this.groupSSBD = new BigDecimal[this.nGroups];                  // group sum of squares as BigDecimal
        this.groupSS = new double[this.nGroups];                        // group sum of squares as double
        
        this.groupMedians = new double[this.nGroups];                   // group medians as double
        this.groupMediansBD = new BigDecimal[this.nGroups];             // group medians as BigDecimal
        this.groupMomentSkewness = new double[this.nGroups];            // group moment skewnesses as double 
        this.groupMedianSkewness = new double[this.nGroups];            // group median skewnesses as double 
        this.groupQuartileSkewness = new double[this.nGroups];          // group quartile skewnesses as double 
        this.groupQuartileSkewnessBD = new BigDecimal[this.nGroups];    // group quartile skewnesses as BigDecimal 
        this.groupKurtosis = new double[this.nGroups];                  // group kurtoses as double 
        this.groupKurtosisBD = new BigDecimal[this.nGroups];            // group kurtoses as BigDecimal  
        this.groupExcessKurtosis = new double[this.nGroups];            // group excess kurtoses as double 
        this.groupExcessKurtosisBD = new BigDecimal[this.nGroups];      // group excess kurtoses as BigDecimal
        
        this.groupProbPlotR = new double[this.nGroups];                 // group Gaussian probability plot correlation coefficients
        this.groupProbPlotGradient = new double[this.nGroups];          // group Gaussian probability plot gradient
        this.groupProbPlotIntercept = new double[this.nGroups];         // group Gaussian probability plot intercept
        this.groupProbPlotMu = new double[this.nGroups];                // group Gaussian probability plot mu
        this.groupProbPlotSigma = new double[this.nGroups];             // group Gaussian probability plot sigma
                    
        Stat st = null;
        ProbabilityPlot pp = null;
        for(int i=0; i<this.nGroups; i++){
            st = new Stat(this.responses0[i]);
            this.groupMeans[i] = st.mean();
            this.groupMeansBD[i] = new BigDecimal(this.groupMeans[i]); 
            this.groupSD[i] = st.standardDeviation();
            this.groupSE[i] = st.standardError();
            double[] limits = st.meanConfidenceLimits(this.criticalSignificance);
            this.groupClb[i] = limits[0];                     
            this.groupCub[i] = limits[1];                     
            this.groupMinimum[i] = st.minimum();
            this.groupMinimumBD[i] = new BigDecimal(this.groupMinimum[i]);
            this.groupMaximum[i] = st.maximum();
            this.groupMaximumBD[i] = new BigDecimal(this.groupMaximum[i]);
            double ss = 0.0;
            for(int j=0; j<this.nResponsesPerGroup[i]; j++){
                double hold = this.responses0[i][j] - this.groupMeans[i];
                ss += hold*hold;
            }
            this.groupSS[i] = ss;
            this.groupSSBD[i] = new BigDecimal(ss);
            this.groupMedians[i] = st.median_as_double();
            this.groupMediansBD[i] = new BigDecimal(this.groupMedians[i]);            
            this.groupMomentSkewness[i] = st.momentSkewness_as_double(); 
            this.groupMedianSkewness[i] = st.medianSkewness_as_double(); 
            this.groupQuartileSkewness[i] = st.quartileSkewness_as_double();  
            this.groupQuartileSkewnessBD[i] = new BigDecimal(this.groupQuartileSkewness[i]);
            this.groupKurtosis[i] = st.kurtosis_as_double(); 
            this.groupKurtosisBD[i] = new BigDecimal(this.groupKurtosis[i]);  
            this.groupExcessKurtosis[i] = st.excessKurtosis_as_double();  
            this.groupExcessKurtosisBD[i] = new BigDecimal(this.groupExcessKurtosis[i]);
            pp = new ProbabilityPlot(this.responses0[i]);
            pp.supressDisplay();
            pp.gaussianProbabilityPlot();
            this.groupProbPlotR[i] = pp.gaussianCorrelationCoefficient();
            this.groupProbPlotGradient[i] = pp.gaussianGradient();
            this.groupProbPlotIntercept[i] = pp.gaussianIntercept();
            this.groupProbPlotMu[i] = pp.gaussianMu();
            this.groupProbPlotSigma[i] = pp.gaussianSigma();
        }
        
        double [] allAsOne = new double[this.nTotalResponses];
        int k = 0;
        for(int i=0; i<this.nGroups; i++){
            for(int j=0; j<this.nResponsesPerGroup[i]; j++){
                allAsOne[k++] = this.responses0[i][j];
            }
        }
        Stat st1 = new Stat(allAsOne);
        this.totalMean = st1.mean();
        this.totalMeanBD = new BigDecimal(this.totalMean); 
        this.totalSD = st1.standardDeviation();
        this.totalSE = st1.standardError();
        double[] limits = st1.meanConfidenceLimits(this.criticalSignificance);
        this.totalClb = limits[0];                     
        this.totalCub = limits[1];                     
        this.totalMinimum = st1.minimum();
        this.totalMinimumBD = new BigDecimal(this.totalMinimum);
        this.totalMaximum = st1.maximum();
        this.totalMaximumBD = new BigDecimal(this.totalMaximum);
        double ss = 0.0;
        for(int j=0; j<this.nTotalResponses; j++){
        double hold = allAsOne[j] - this.totalMean;
            ss += hold*hold;
        }
        this.totalSS = ss;
        this.totalSSBD = new BigDecimal(ss);
        this.totalMedian = st1.median_as_double();
        this.totalMedianBD = new BigDecimal(this.totalMedian);            
        this.totalMomentSkewness = st1.momentSkewness_as_double(); 
        this.totalMedianSkewness = st1.medianSkewness_as_double(); 
        this.totalQuartileSkewness = st1.quartileSkewness_as_double();  
        this.totalQuartileSkewnessBD = new BigDecimal(this.totalQuartileSkewness);
        this.totalKurtosis = st1.kurtosis_as_double(); 
        this.totalKurtosisBD = new BigDecimal(this.totalKurtosis);  
        this.totalExcessKurtosis = st1.excessKurtosis_as_double();  
        this.totalExcessKurtosisBD = new BigDecimal(this.totalExcessKurtosis);
        ProbabilityPlot pp1 = new ProbabilityPlot(allAsOne);
        pp1.supressDisplay();
        pp1.gaussianProbabilityPlot();
        this.totalProbPlotR = pp1.gaussianCorrelationCoefficient();
        this.totalProbPlotGradient = pp1.gaussianGradient();
        this.totalProbPlotIntercept = pp1.gaussianIntercept();
        this.totalProbPlotMu = pp1.gaussianMu();
        this.totalProbPlotSigma = pp1.gaussianSigma();
            
        this.groupStatsDone = true;
    }