Exemple #1
0
        // Calculate Two sided P-Value
        void TwoSample(double clevel, double ccfs)
        {
            int    countA;
            int    countB;
            int    x, graph = 0, ifaultA = 0, ifaultB = 0;
            double p, avgA, avgB, SDA, SDB, SEA, SEB, SDAP, SDBP, SSA, SSB;
            double SED, SDD, cuAD, clAD, MoD, SKA, SKB, KTA, KTB;
            double sig2P, sig1P, p1, p2;
            double r, pr, tr, sr, sp, wA = 0.0, pwA = 0.0, wB = 0.0, pwB = 0.0;

            MathFunctions.MMPair minmaxA;
            MathFunctions.MMPair minmaxB;
            MathFunctions.HSBins binsA;
            MathFunctions.HSBins binsB;
            MathFunctions.SDBins SDbinsA;
            MathFunctions.SDBins SDbinsB;

            double Z;
            double cuA, clA, cuB, clB;

            double[] bufferA = CSVSplit(txtAData.Text);

            if (bufferA == null)
            {
                MessageBox.Show("Invalid A Data Format", "Data Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            countA = bufferA.Length;

            double[] bufferB = CSVSplit(txtBData.Text);

            if (bufferB == null)
            {
                MessageBox.Show("Invalid B Data Format", "Data Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            countB = bufferB.Length;

            if (chkPaired.Checked)
            {
                if (countA != countB)
                {
                    MessageBox.Show("Paired data specified, but unequal number of A/B values entered", "Data Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }

            if (countA < 2 || countB < 2)
            {
                MessageBox.Show("Data fields must contain at least two values", "Data Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            Writecolortext("P-Value criteria for FALSE null hypothesis < ", Color.Cyan, false);
            Writecolortext(String.Format("{0:G6}", clevel), Color.Yellow, true);
            Writeblankline();

            Writecolortext(" *** Performing Two Sample Test ***", Color.Cyan, true);
            Writeblankline();

            if (chkOutlier.Checked)
            {
                Writecolortext("*** Data after Chauvenets Criterion Outlier Removal Filter ***", Color.Red, true);

                if (chkPaired.Checked)
                {
                    Writeblankline();
                    Writecolortext("Removing Outliers in pairs ", Color.Purple, true);
                    countA = mf.RemoveOutliersPaired(ref bufferA, ref bufferB, countA, ccfs);
                    countB = countA;
                }
                else
                {
                    Writeblankline();
                    Writecolortext("Removing Outliers from ", Color.Purple, false);
                    Writecolortext("A", Color.Yellow, true);
                    countA = mf.RemoveOutliersUnpaired(ref bufferA, countA, ccfs);

                    Writeblankline();
                    Writecolortext("Removing Outliers from ", Color.Purple, false);
                    Writecolortext("B", Color.Yellow, true);
                    countB = mf.RemoveOutliersUnpaired(ref bufferB, countB, ccfs);
                }
            }
            else
            {
                Writecolortext(" *** Raw Data *** ", Color.Red, true);
            }

            Z       = mf.Critz(clevel / 2);
            avgA    = mf.Avg(bufferA, countA);
            avgB    = mf.Avg(bufferB, countB);
            minmaxA = mf.GetMinMax(bufferA, countA);
            minmaxB = mf.GetMinMax(bufferB, countB);
            SDA     = mf.SDSamp(bufferA, countA);
            SDB     = mf.SDSamp(bufferB, countB);
            SDAP    = mf.SDPop(bufferA, countA);
            SDBP    = mf.SDPop(bufferB, countB);

            cuA = avgA + Z * (SDA / Math.Sqrt(countA));
            clA = avgA - Z * (SDA / Math.Sqrt(countA));
            cuB = avgB + Z * (SDB / Math.Sqrt(countB));
            clB = avgB - Z * (SDB / Math.Sqrt(countB));
            SEA = mf.StandardError(bufferA, countA);
            SEB = mf.StandardError(bufferB, countB);

            SSA = mf.SumOfSquares(bufferA, countA);
            SSB = mf.SumOfSquares(bufferB, countB);

            SKA = mf.Skewness(bufferA, countA);
            SKB = mf.Skewness(bufferB, countB);
            KTA = mf.Kurtosis(bufferA, countA);
            KTB = mf.Kurtosis(bufferB, countB);

            mf.SWilks(bufferA, countA, ref wA, ref pwA, ref ifaultA);
            mf.SWilks(bufferB, countB, ref wB, ref pwB, ref ifaultB);

            double d          = mf.KSTwo(bufferA, countA, bufferB, countB);
            double CD         = mf.CohensD(bufferA, countA, bufferB, countB);
            double GlassDelta = mf.GlassDelta(bufferA, countA, bufferB, countB);
            double HedgesG    = mf.HedgesG(bufferA, countA, bufferB, countB);

            Writeblankline();
            Writekeyvalue("A Count = ", "0", countA);
            Writekeyvalue("B Count = ", "0", countB);

            Writeblankline();
            Writekeyvalue("A Min = ", "G6", minmaxA.min);
            Writekeyvalue("A Max = ", "G6", minmaxA.max);
            Writekeyvalue("B Min = ", "G6", minmaxB.min);
            Writekeyvalue("B Max = ", "G6", minmaxB.max);

            Writeblankline();
            Writekeyvalue("Sample Mean A = ", "G6", avgA);
            Writekeyvalue("Sample Mean B = ", "G6", avgB);

            Writeblankline();
            Writekeyvalue("Sample Median A = ", "G6", mf.Median(bufferA, countA));
            Writekeyvalue("Sample Median B = ", "G6", mf.Median(bufferB, countB));


            if (avgA < avgB)
            {
                Writeblankline();
                Writekeyvalue("Sample Mean Difference = ", "G6", Math.Abs(avgB - avgA), "+");
                Writekeyvalue("Sample Mean % Change = ", "0.#", Math.Abs(mf.PerDiff(avgA, avgB)), "+", "%");
            }

            if (avgA > avgB)
            {
                Writeblankline();
                Writekeyvalue("Sample Mean Difference = ", "G6", Math.Abs(avgB - avgA), "-");
                Writekeyvalue("Sample Mean % Change = ", "0.#", Math.Abs(mf.PerDiff(avgA, avgB)), "-", "%");
            }

            Writeblankline();
            Writecolortext("A ", Color.Green, false);
            Writecolortext(String.Format("{0}% CI = ", (1.0 - clevel) * 100), Color.Green, false);
            Writecolortext(String.Format("{0:G6} to {1:G6}", clA, cuA), Color.Yellow, true);
            Writecolortext("B ", Color.Green, false);
            Writecolortext(String.Format("{0}% CI = ", (1.0 - clevel) * 100), Color.Green, false);
            Writecolortext(String.Format("{0:G6} to {1:G6}", clB, cuB), Color.Yellow, true);

            Writeblankline();
            Writekeyvalue("Sample SD A = ", "G6", SDA);
            Writekeyvalue("Sample SD B = ", "G6", SDB);
            Writekeyvalue("Population SD A = ", "G6", SDAP);
            Writekeyvalue("Population SD B = ", "G6", SDBP);


            if (SDA < SDB)
            {
                Writeblankline();
                Writekeyvalue("Sample SD Difference = ", "G6", Math.Abs(SDB - SDA), "+");
                Writekeyvalue("Sample SD % Change = ", "0.#", Math.Abs(mf.PerDiff(SDA, SDB)), "+", "%");
            }

            if (SDA > SDB)
            {
                Writeblankline();
                Writekeyvalue("Sample SD Difference = ", "G6", Math.Abs(SDB - SDA), "-");
                Writekeyvalue("Sample SD % Change = ", "0.#", Math.Abs(mf.PerDiff(SDA, SDB)), "-", "%");
            }

            if (SDAP < SDBP)
            {
                Writekeyvalue("Population SD Difference = ", "G6", Math.Abs(SDBP - SDAP), "+");
                Writekeyvalue("Population SD % Change = ", "0.#", Math.Abs(mf.PerDiff(SDAP, SDBP)), "+", "%");
            }

            if (SDAP > SDBP)
            {
                Writekeyvalue("Population SD Difference = ", "G6", Math.Abs(SDBP - SDAP), "-");
                Writekeyvalue("Population SD % Change = ", "0.#", Math.Abs(mf.PerDiff(SDAP, SDBP)), "-", "%");
            }

            if (chkPaired.Checked)
            {
                SED = mf.SEofDifferences(bufferA, bufferB, countA);
                SDD = mf.SDofDifferences(bufferA, bufferB, countA);
                MoD = mf.MeanofDifferences(bufferA, bufferB, countA);

                cuAD = MoD + Z * (SDD / Math.Sqrt(countA));
                clAD = MoD - Z * (SDD / Math.Sqrt(countA));

                Writeblankline();
                Writekeyvalue("SD of Sample Differences = ", "G6", SDD);
                Writekeyvalue("SE of Sample Differences = ", "G6", SED);
                Writecolortext(String.Format("Sample Differences {0}% CI = ", (1.0 - clevel) * 100), Color.Green, false);
                Writecolortext(String.Format("{0:G6} to {1:G6}", clAD, cuAD), Color.Yellow, true);
            }

            Writeblankline();
            Writekeyvalue("Sample SE A = ", "G6", SEA);
            Writekeyvalue("Sample SE B = ", "G6", SEB);

            Writeblankline();
            Writekeyvalue("Sum of Squares A = ", "G6", SSA);
            Writekeyvalue("Sum of Squares B = ", "G6", SSB);

            Writeblankline();
            Writekeyvalue("Skewness A = ", "G6", SKA);
            Writekeyvalue("Skewness B = ", "G6", SKB);
            Writeblankline();
            Writekeyvalue("Kurtosis = ", "G6", KTA);
            Writekeyvalue("Kurtosis = ", "G6", KTB);

            Writeblankline();
            Writekeyvalue("Slope A = ", "G6", mf.Slope(bufferA, countA));
            Writekeyvalue("y-Intercept A = ", "G6", mf.Intercept(bufferA, countA));

            Writeblankline();
            Writekeyvalue("Slope B = ", "G6", mf.Slope(bufferB, countB));
            Writekeyvalue("y-Intercept B = ", "G6", mf.Intercept(bufferB, countB));

            Writeblankline();
            Writekeyvalue("Cohen's d = ", "G6", CD);
            Writekeyvalue("Glass Delta = ", "G6", GlassDelta);
            Writekeyvalue("Hedges's g = ", "G6", HedgesG);

            Writeblankline();
            Writecolortext("*** Shapiro Wilk Normality Test ***", Color.Blue, true);
            if (ifaultA == 0)
            {
                Writekeyvalue("A W = ", "G6", wA);
                Writekeyvalue("A p-Value = ", "G6", pwA);
            }

            if (ifaultB == 0)
            {
                Writekeyvalue("B W = ", "G6", wB);
                Writekeyvalue("B p-Value = ", "G6", pwB);
            }

            if (!chkPaired.Checked)
            {
                if (d > -1.0)
                {
                    double KSCrit = mf.KSCritValue(d, countA, countB, clevel);

                    Writeblankline();
                    Writecolortext("*** Kolmogorov-Smirnov Two Sample Test UnPaired ***", Color.Blue, true);
                    Writekeyvalue("D = ", "G6", d);
                    Writekeyvalue("D Critical = ", "G6", KSCrit);
                    Writekeyvalue("P-Value = ", "G6", mf.KSpValue(d, countA, countB));

                    Writecolortext("Null Hypothesis is", Color.Green, false);
                    if (d > KSCrit)
                    {
                        Writecolortext(" FALSE ", Color.Cyan, true);
                    }
                    else
                    {
                        Writecolortext(" TRUE ", Color.Cyan, true);
                    }
                }
            }
            else
            {
                double Wplus = 0, Wminus = 0;
                double wP = mf.WilcoxonSignedRankTest(bufferA, bufferB, ref Wplus, ref Wminus);

                if (wP > -1.0)
                {
                    Writeblankline();
                    Writecolortext("*** Wilcoxon Signed Rank Test Paired ***", Color.Blue, true);
                    Writekeyvalue("W Positive = ", "G6", Wplus);
                    Writekeyvalue("W Negative = ", "G6", Wminus);
                    Writekeyvalue("P-Value = ", "G6", wP);

                    Writecolortext("Null Hypothesis is", Color.Green, false);
                    if (wP <= clevel)
                    {
                        Writecolortext(" FALSE ", Color.Cyan, true);
                    }
                    else
                    {
                        Writecolortext(" TRUE ", Color.Cyan, true);
                    }
                }
            }

            Writeblankline();

            if (chkShowGraphs.Checked == true)
            {
                double[] xpointsA = new double[countA];
                double[] xpointsB = new double[countB];

                if (chkNormalize.Checked)
                {
                    graph = 2;
                }

                for (x = 1; x < countA + 1; x++)
                {
                    xpointsA[x - 1] = x;
                }
                for (x = 1; x < countB + 1; x++)
                {
                    xpointsB[x - 1] = x;
                }

                dgA = new Datagraph(graph, "A Series Plot")
                {
                    x     = xpointsA,
                    y     = bufferA,
                    count = countA,
                };

                dgB = new Datagraph(graph, "B Series Plot")
                {
                    x     = xpointsB,
                    y     = bufferB,
                    count = countB,
                };

                dgA.SetPoints();
                dgA.Visible = true;

                dgB.SetPoints();
                dgB.Visible = true;

                binsA = mf.SortBins(bufferA, countA);

                hsA = new Datagraph(4, "A Histogram Plot")
                {
                    xlabels = binsA.xlabels,
                    y       = binsA.values,
                    count   = binsA.values.Length,
                };

                binsB = mf.SortBins(bufferB, countB);

                hsB = new Datagraph(4, "B Histogram Plot")
                {
                    xlabels = binsB.xlabels,
                    y       = binsB.values,
                    count   = binsB.values.Length,
                };

                hsA.SetPoints();
                hsA.Visible = true;

                hsB.SetPoints();
                hsB.Visible = true;

                SDbinsA = mf.SDMakeBins(bufferA, countA);

                xpointsA = new double[SDbinsA.size];

                for (x = 1; x < SDbinsA.size + 1; x++)
                {
                    xpointsA[x - 1] = x * SDbinsA.binsize;
                }

                sdA = new Datagraph(0, "A Standard Deviation Plot")
                {
                    x     = xpointsA,
                    y     = SDbinsA.values,
                    count = SDbinsA.size,
                };

                sdA.SetPoints();
                sdA.Visible = true;

                SDbinsB = mf.SDMakeBins(bufferB, countB);

                xpointsA = new double[SDbinsB.size];

                for (x = 1; x < SDbinsB.size + 1; x++)
                {
                    xpointsA[x - 1] = x * SDbinsB.binsize;
                }

                sdB = new Datagraph(0, "B Standard Deviation Plot")
                {
                    x     = xpointsA,
                    y     = SDbinsB.values,
                    count = SDbinsB.size,
                };

                sdB.SetPoints();
                sdB.Visible = true;
            }


            if (!chkPaired.Checked)
            {
                Writecolortext("*** Welch t-test UnPaired ***", Color.Blue, true);

                p     = mf.PValueUnpaired(bufferA, countA, bufferB, countB);
                sig2P = mf.Critz(p);
                sig1P = mf.Critz(p * 0.5);

                Writeblankline();
                Writecolortext("Null Hypothesis is", Color.Green, false);
                if (p <= clevel)
                {
                    Writecolortext(" FALSE ", Color.Cyan, false);
                }
                else
                {
                    Writecolortext(" TRUE ", Color.Cyan, false);
                }
                Writecolortext("for Two Sided test", Color.Green, true);

                Writekeyvalue("P-Value Two Sided = ", "G6", p);
                if (p <= clevel)
                {
                    p2 = mf.PowerTwoTailed(avgA, SDAP, clevel, avgB, countB);
                    Writekeyvalue("Power Two Sided = ", "F1", p2 * 100, "", "%");

                    Writeblankline();
                }

                Writekeyvalue(String.Format("Sigma Level {0} ", (sig2P < 5.99) ? "=" : ">"), "0.#", sig2P);

                Writeblankline();
                Writecolortext("Null Hypothesis is", Color.Green, false);
                if (0.5 * p <= clevel)
                {
                    Writecolortext(" FALSE ", Color.Cyan, false);
                }
                else
                {
                    Writecolortext(" TRUE ", Color.Cyan, false);
                }
                Writecolortext("for One Sided test", Color.Green, true);

                if (avgA < avgB)
                {
                    Writekeyvalue("P-Value One Sided A < B = ", "G6", 0.5 * p);
                }
                else
                {
                    Writekeyvalue("P-Value One Sided A > B = ", "G6", 0.5 * p);
                }

                if (0.5 * p <= clevel)
                {
                    p1 = 1 - mf.PowerOneTailed(avgA, SDAP, clevel, avgB, countB);
                    Writekeyvalue("Power One Sided = ", "F1", p1 * 100, "", "%");

                    Writeblankline();
                }

                Writekeyvalue(String.Format("Sigma Level {0} ", (sig1P < 5.99) ? "=" : ">"), "0.#", sig1P);
            }
            else
            {
                if (chkShowGraphs.Checked == true)
                {
                    graph = 1;

                    if (chkNormalize.Checked)
                    {
                        graph = 3;
                    }

                    dg = new Datagraph(graph, "A/B Scatter Plot")
                    {
                        x     = bufferA,
                        y     = bufferB,
                        count = countA,
                    };

                    dg.SetPoints();
                    dg.Visible = true;
                }

                Writeblankline();
                Writecolortext("*** Welch t-test Paired ***", Color.Blue, true);

                p     = mf.PValuePaired(bufferA, bufferB, countA);
                sig2P = mf.Critz(p);
                sig1P = mf.Critz(p * 0.5);

                Writeblankline();
                Writecolortext("Null Hypothesis is", Color.Green, false);
                if (p <= clevel)
                {
                    Writecolortext(" FALSE ", Color.Cyan, false);
                }
                else
                {
                    Writecolortext(" TRUE ", Color.Cyan, false);
                }
                Writecolortext("for Two Sided test", Color.Green, true);

                Writekeyvalue("P-Value Two Sided = ", "G6", p);
                Writekeyvalue(String.Format("Sigma Level {0} ", (sig2P < 5.99) ? "=" : ">"), "0.#", sig2P);

                Writeblankline();
                Writecolortext("Null Hypothesis is", Color.Green, false);
                if (0.5 * p <= clevel)
                {
                    Writecolortext(" FALSE ", Color.Cyan, false);
                }
                else
                {
                    Writecolortext(" TRUE ", Color.Cyan, false);
                }
                Writecolortext("for One Sided test", Color.Green, true);

                if (avgA < avgB)
                {
                    Writekeyvalue("P-Value One Sided A < B = ", "G6", 0.5 * p);
                }
                else
                {
                    Writekeyvalue("P-Value One Sided A > B = ", "G6", 0.5 * p);
                }
                Writekeyvalue(String.Format("Sigma Level {0} ", (sig1P < 5.99) ? "=" : ">"), "0.#", sig1P);


                Writeblankline();
                Writeblankline();

                Writecolortext("*** Pearson's Correlation Coefficient ***", Color.Blue, true);

                r  = mf.R(bufferA, bufferB, countA);
                tr = r / Math.Sqrt((1 - r * r) / (countA - 2));
                pr = mf.PfromT(tr, countA - 2);

                Writeblankline();
                Writecolortext("A to B has ", Color.Green, false);

                if (r == 0.0)
                {
                    Writecolortext("No", Color.Cyan, false);
                }
                if (r == 1.0)
                {
                    Writecolortext("Perfect Positive", Color.Cyan, false);
                }
                if (r == -1.0)
                {
                    Writecolortext("Perfect Negative", Color.Cyan, false);
                }

                if (r > 0.0 && r < 0.3)
                {
                    Writecolortext("Weak Positive", Color.Cyan, false);
                }
                if (r >= 0.3 && r < 0.7)
                {
                    Writecolortext("Moderate Positive", Color.Cyan, false);
                }
                if (r >= 0.7 && r < 1.00)
                {
                    Writecolortext("Strong Positive", Color.Cyan, false);
                }

                if (r < 0.0 && r > -0.3)
                {
                    Writecolortext("Weak Negative", Color.Cyan, false);
                }
                if (r <= -0.3 && r > -0.7)
                {
                    Writecolortext("Moderate Negative", Color.Cyan, false);
                }
                if (r <= -0.7 && r > -1.00)
                {
                    Writecolortext("Strong Negative", Color.Cyan, false);
                }

                Writecolortext(" Correlation", Color.Green, true);

                Writeblankline();
                Writekeyvalue("R-Value = ", "G6", r);
                Writekeyvalue("Coefficient of Determination = ", "G6", r * r);
                Writeblankline();
                Writekeyvalue("P-Value = ", "G6", pr);

                sr = mf.Critz(pr);
                Writekeyvalue(String.Format("Sigma Level {0} ", (sr < 5.99) ? "=" : ">"), "0.#", sr);

                Writeblankline();

                if (pr <= clevel)
                {
                    Writecolortext("P-Value is", Color.Green, false);
                    Writecolortext(" Significant", Color.Cyan, true);
                }
                else
                {
                    Writecolortext("P-Value is", Color.Green, false);
                    Writecolortext(" Not Significant", Color.Cyan, true);
                }

                Writeblankline();
                Writeblankline();

                Writecolortext("*** Spearman's Correlation Coefficient ***", Color.Blue, true);

                sp = mf.R(mf.Rankify(bufferA), mf.Rankify(bufferB), countA);
                tr = sp / Math.Sqrt((1 - sp * sp) / (countA - 2));
                pr = mf.PfromT(tr, countA - 2);

                Writeblankline();
                Writecolortext("A to B has ", Color.Green, false);

                if (sp == 0.0)
                {
                    Writecolortext("No", Color.Cyan, false);
                }
                if (sp == 1.0)
                {
                    Writecolortext("Perfect Positive", Color.Cyan, false);
                }
                if (sp == -1.0)
                {
                    Writecolortext("Perfect Negative", Color.Cyan, false);
                }

                if (sp > 0.0 && sp < 0.3)
                {
                    Writecolortext("Weak Positive", Color.Cyan, false);
                }
                if (sp >= 0.3 && sp < 0.7)
                {
                    Writecolortext("Moderate Positive", Color.Cyan, false);
                }
                if (sp >= 0.7 && sp < 1.00)
                {
                    Writecolortext("Strong Positive", Color.Cyan, false);
                }

                if (sp < 0.0 && sp > -0.3)
                {
                    Writecolortext("Weak Negative", Color.Cyan, false);
                }
                if (sp <= -0.3 && sp > -0.7)
                {
                    Writecolortext("Moderate Negative", Color.Cyan, false);
                }
                if (sp <= -0.7 && sp > -1.00)
                {
                    Writecolortext("Strong Negative", Color.Cyan, false);
                }

                Writecolortext(" Correlation", Color.Green, true);

                Writeblankline();
                Writekeyvalue("ρ-Value = ", "G6", sp);
                Writekeyvalue("Coefficient of Determination = ", "G6", sp * sp);
                Writeblankline();
                Writekeyvalue("P-Value = ", "G6", pr);

                sr = mf.Critz(pr);
                Writekeyvalue(String.Format("Sigma Level {0} ", (sr < 5.99) ? "=" : ">"), "0.#", sr);

                Writeblankline();

                if (pr <= clevel)
                {
                    Writecolortext("P-Value is", Color.Green, false);
                    Writecolortext(" Significant", Color.Cyan, true);
                }
                else
                {
                    Writecolortext("P-Value is", Color.Green, false);
                    Writecolortext(" Not Significant", Color.Cyan, true);
                }
            }
        }
Exemple #2
0
        // Calculate One sided P-Value
        void OneSample(double clevel, double mean, double ccfs)
        {
            int    countA, x, graph = 0;
            double p, avgA, SDA, SEA, SDAP, SS, SK, KT, CD;
            double sig2P, sig1P;

            double[] xpointsA;
            double   w = 0, pw = 0;
            int      ifault = 0;

            MathFunctions.MMPair minmaxA;
            MathFunctions.HSBins HSbins;
            MathFunctions.SDBins SDbins;

            double Z;
            double cuA, clA;

            double[] bufferA = CSVSplit(txtAData.Text);

            if (bufferA == null)
            {
                MessageBox.Show("Invalid A Data Format", "Data Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            countA = bufferA.Length;

            if (chkShowGraphs.Checked == true)
            {
                HSbins = mf.SortBins(bufferA, countA);

                hsA = new Datagraph(4, "Histogram Plot")
                {
                    xlabels = HSbins.xlabels,
                    y       = HSbins.values,
                    count   = HSbins.values.Length,
                };

                hsA.SetPoints();
                hsA.Visible = true;

                xpointsA = new double[countA];

                for (x = 1; x < countA + 1; x++)
                {
                    xpointsA[x - 1] = x;
                }

                if (chkNormalize.Checked)
                {
                    graph = 2;
                }
                dgA = new Datagraph(graph, "Series Plot")
                {
                    x     = xpointsA,
                    y     = bufferA,
                    count = countA,
                };

                dgA.SetPoints();
                dgA.Visible = true;

                SDbins = mf.SDMakeBins(bufferA, countA);

                xpointsA = new double[SDbins.size];

                for (x = 1; x < SDbins.size + 1; x++)
                {
                    xpointsA[x - 1] = x * SDbins.binsize;
                }

                sdA = new Datagraph(0, "Standard Deviation Plot")
                {
                    x     = xpointsA,
                    y     = SDbins.values,
                    count = SDbins.size,
                };

                sdA.SetPoints();
                sdA.Visible = true;
            }

            Writecolortext("P-Value criteria for FALSE null hypothesis < ", Color.Cyan, false);
            Writecolortext(String.Format("{0:G6}", clevel), Color.Yellow, true);
            Writeblankline();

            Writecolortext(" *** Performing One Sample Test ***", Color.Cyan, true);

            if (chkOutlier.Checked)
            {
                Writeblankline();
                Writecolortext("*** Data after Chauvenets Criterion Outlier Removal Filter ***", Color.Red, true);

                Writeblankline();
                Writecolortext("Removing Outliers", Color.Purple, true);
                countA = mf.RemoveOutliersUnpaired(ref bufferA, countA, ccfs);
            }
            else
            {
                Writeblankline();
                Writecolortext(" *** Raw Data *** ", Color.Red, true);
            }

            Z    = mf.Critz(clevel / 2);
            avgA = mf.Avg(bufferA, countA);

            minmaxA = mf.GetMinMax(bufferA, countA);
            SDA     = mf.SDSamp(bufferA, countA);
            SDAP    = mf.SDPop(bufferA, countA);
            cuA     = avgA + Z * (SDA / Math.Sqrt(countA));
            clA     = avgA - Z * (SDA / Math.Sqrt(countA));
            SEA     = mf.StandardError(bufferA, countA);
            SS      = mf.SumOfSquares(bufferA, countA);
            SK      = mf.Skewness(bufferA, countA);
            KT      = mf.Kurtosis(bufferA, countA);
            mf.SWilks(bufferA, countA, ref w, ref pw, ref ifault);
            CD = (avgA - mean) / SDA;

            Writeblankline();
            Writekeyvalue("A Count = ", "0", countA);

            Writeblankline();
            Writekeyvalue("A Min = ", "G6", minmaxA.min);
            Writekeyvalue("A Max = ", "G6", minmaxA.max);

            Writeblankline();
            Writekeyvalue("Hypothesis Mean = ", "G6", mean);
            Writekeyvalue("Sample Mean A = ", "G6", avgA);
            Writeblankline();
            Writekeyvalue("Sample Median A = ", "G6", mf.Median(bufferA, countA));


            if (mean < avgA)
            {
                Writeblankline();
                Writekeyvalue("Sample A Mean Difference = ", "G6", Math.Abs(avgA - mean), "+");
                Writekeyvalue("Sample A Mean % Change = ", "0.#", Math.Abs(mf.PerDiff(mean, avgA)), "+", "%");
            }

            if (mean > avgA)
            {
                Writeblankline();
                Writekeyvalue("Sample A Mean Difference = ", "G6", Math.Abs(avgA - mean), "-");
                Writekeyvalue("Sample A Mean % Change = ", "0.#", Math.Abs(mf.PerDiff(mean, avgA)), "-", "%");
            }

            Writeblankline();
            Writecolortext("A ", Color.Green, false);
            Writecolortext(String.Format("{0}% CI = ", (1.0 - clevel) * 100), Color.Green, false);
            Writecolortext(String.Format("{0:G6} to {1:G6}", clA, cuA), Color.Yellow, true);

            Writeblankline();
            Writekeyvalue("Sample SD A = ", "G6", SDA);
            Writekeyvalue("Population SD A = ", "G6", SDAP);

            Writeblankline();
            Writekeyvalue("Sample SE A = ", "G6", SEA);

            Writeblankline();

            Writekeyvalue("Sum of Squares = ", "G6", SS);

            Writeblankline();
            Writekeyvalue("Skewness = ", "G6", SK);
            Writekeyvalue("Kurtosis = ", "G6", KT);

            Writeblankline();
            Writekeyvalue("Slope A = ", "G6", mf.Slope(bufferA, countA));
            Writekeyvalue("y-Intercept A = ", "G6", mf.Intercept(bufferA, countA));

            Writeblankline();
            Writekeyvalue("Cohen's d = ", "G6", CD);

            Writeblankline();

            if (ifault == 0)
            {
                Writecolortext("*** Shapiro Wilk Normality Test ***", Color.Blue, true);
                Writekeyvalue("A = ", "G6", w);
                Writekeyvalue("A p-Value = ", "G6", pw);
                Writeblankline();
            }

            Writecolortext("*** Welch t-test ***", Color.Blue, true);

            p     = mf.PValue(bufferA, countA, mean);
            sig2P = mf.Critz(p);
            sig1P = mf.Critz(p * 0.5);

            Writeblankline();
            Writecolortext("Null Hypothesis is", Color.Green, false);
            if (p <= clevel)
            {
                Writecolortext(" FALSE ", Color.Cyan, false);
            }
            else
            {
                Writecolortext(" TRUE ", Color.Cyan, false);
            }
            Writecolortext("for Two Sided test", Color.Green, true);

            Writekeyvalue("P-Value Two Sided = ", "G6", p);
            Writekeyvalue(String.Format("Sigma Level {0} ", (sig2P < 5.99) ? "=" : ">"), "0.#", sig2P);

            Writeblankline();
            Writecolortext("Null Hypothesis is", Color.Green, false);
            if (0.5 * p <= clevel)
            {
                Writecolortext(" FALSE ", Color.Cyan, false);
            }
            else
            {
                Writecolortext(" TRUE ", Color.Cyan, false);
            }
            Writecolortext("for One Sided test", Color.Green, true);

            if (avgA < mean)
            {
                Writekeyvalue("P-Value One Sided A < MEAN = ", "G6", 0.5 * p);
            }
            else
            {
                Writekeyvalue("P-Value One Sided A > MEAN = ", "G6", 0.5 * p);
            }
            Writekeyvalue(String.Format("Sigma Level {0} ", (sig1P < 5.99) ? "=" : ">"), "0.#", sig1P);
        }