Accord.Statistics.Testing.LeveneTest.compute C# (CSharp) Method

compute() private method

private compute ( double samples, LeveneTestMethod method, double percent ) : void
samples double
method LeveneTestMethod
percent double
return void
        private void compute(double[][] samples, LeveneTestMethod method, double percent)
        {
            this.Method = method;
            int N = 0, k = samples.Length;

            // Compute group means
            var means = new double[samples.Length];

            switch (method)
            {
                case LeveneTestMethod.Mean:
                    for (int i = 0; i < means.Length; i++)
                        means[i] = samples[i].Mean();
                    break;

                case LeveneTestMethod.Median:
                    for (int i = 0; i < means.Length; i++)
                        means[i] = samples[i].Median();
                    break;

                case LeveneTestMethod.TruncatedMean:
                    for (int i = 0; i < means.Length; i++)
                        means[i] = samples[i].TruncatedMean(percent);
                    break;
            }

            // Compute absolute centered samples
            var z = new double[samples.Length][];
            for (int i = 0; i < z.Length; i++)
            {
                z[i] = new double[samples[i].Length];
                for (int j = 0; j < z[i].Length; j++)
                    z[i][j] = Math.Abs(samples[i][j] - means[i]);
            }

            // Compute means for the centered samples
            var newMeans = new double[samples.Length];
            for (int i = 0; i < newMeans.Length; i++)
                newMeans[i] = z[i].Mean();

            // Compute total mean
            double totalMean = 0;
            for (int i = 0; i < samples.Length; i++)
            {
                for (int j = 0; j < samples[i].Length; j++)
                    totalMean += z[i][j];
                N += samples[i].Length;
            }
            totalMean /= N;

            double sum1 = 0; // Numerator sum
            for (int i = 0; i < samples.Length; i++)
            {
                int n = samples[i].Length;
                double u = (newMeans[i] - totalMean);
                sum1 += n * u * u;
            }

            double sum2 = 0; // Denominator sum
            for (int i = 0; i < samples.Length; i++)
            {
                for (int j = 0; j < samples[i].Length; j++)
                {
                    double u = z[i][j] - newMeans[i];
                    sum2 += u * u;
                }
            }

            double num = (N - k) * sum1;
            double den = (k - 1) * sum2;

            double W = num / den;
            int degree1 = k - 1;
            int degree2 = N - k;

            Compute(W, degree1, degree2, TwoSampleHypothesis.FirstValueIsGreaterThanSecond);
        }
    }