public static PlotModel BoxPlot()
        {
            const int boxes = 10;

            var model = new PlotModel(string.Format("BoxPlot (n={0})", boxes)) { LegendPlacement = LegendPlacement.Outside };

            var s1 = new BoxPlotSeries
                {
                    Title = "BoxPlotSeries",
                    BoxWidth = 0.3
                };

            var random = new Random();
            for (var i = 0; i < boxes; i++)
            {
                double x = i;
                var points = 5 + random.Next(15);
                var values = new List<double>();
                for (var j = 0; j < points; j++)
                {
                    values.Add(random.Next(0, 20));
                }

                values.Sort();
                var median = GetMedian(values);
                int r = values.Count % 2;
                double firstQuartil = GetMedian(values.Take((values.Count + r) / 2));
                double thirdQuartil = GetMedian(values.Skip((values.Count - r) / 2));

                var iqr = thirdQuartil - firstQuartil;
                var step = iqr * 1.5;
                var upperWhisker = thirdQuartil + step;
                upperWhisker = values.Where(v => v <= upperWhisker).Max();
                var lowerWhisker = firstQuartil - step;
                lowerWhisker = values.Where(v => v >= lowerWhisker).Min();

                var outliers = values.Where(v => v > upperWhisker || v < lowerWhisker).ToList();

                s1.Items.Add(new BoxPlotItem(x, lowerWhisker, firstQuartil, median, thirdQuartil, upperWhisker, outliers));
            }

            model.Series.Add(s1);
            model.Axes.Add(new LinearAxis(AxisPosition.Left));
            model.Axes.Add(new LinearAxis(AxisPosition.Bottom) { MinimumPadding = 0.1, MaximumPadding = 0.1 });
            return model;
        }
        public static PlotModel MichelsonMorleyExperiment()
        {
            //// http://www.gutenberg.org/files/11753/11753-h/11753-h.htm
            //// http://en.wikipedia.org/wiki/Michelson%E2%80%93Morley_experiment
            //// http://stat.ethz.ch/R-manual/R-devel/library/datasets/html/morley.html

            var model = new PlotModel();

            var s1 = new BoxPlotSeries
            {
                Title = "Results",
                Stroke = OxyColors.Black,
                StrokeThickness = 1,
                OutlierSize = 2,
                BoxWidth = 0.4
            };

            // note: approximated data values (not the original values)
            s1.Items.Add(new BoxPlotItem(0, 740, 850, 945, 980, 1070, new[] { 650.0 }));
            s1.Items.Add(new BoxPlotItem(1, 750, 805, 845, 890, 970, new double[] { }));
            s1.Items.Add(new BoxPlotItem(2, 845, 847, 855, 880, 910, new[] { 640.0, 950, 970 }));
            s1.Items.Add(new BoxPlotItem(3, 720, 760, 820, 870, 910, new double[] { }));
            s1.Items.Add(new BoxPlotItem(4, 730, 805, 807, 870, 950, new double[] { }));
            model.Series.Add(s1);
            model.Annotations.Add(new LineAnnotation { Type = LineAnnotationType.Horizontal, LineStyle = LineStyle.Solid, Y = 792.458, Text = "true speed" });
            model.Axes.Add(new CategoryAxis("Experiment No.", "1", "2", "3", "4", "5"));
            model.Axes.Add(new LinearAxis(AxisPosition.Left, "Speed of light (km/s minus 299,000)") { MajorStep = 100, MinorStep = 100 });
            return model;
        }
        public void Load(string dataType)
        {
            DataType = dataType;

            var regions = _regionService.GetRegionsByIndex();
            var filtSubs = _computeService.GetFilteredSubjectsByComputeGroup();

            var grp1 = filtSubs[ComputeGroup.GroupOne];
            var grp2 = filtSubs[ComputeGroup.GroupTwo];

            List<List<double>> vtxStrs1 = new List<List<double>>();
            List<List<double>> vtxStrs2 = new List<List<double>>();
            foreach (var r in regions)
            {
                vtxStrs1.Add(new List<double>());
                vtxStrs2.Add(new List<double>());
            }

            // Calc our global and vertex strengths for our groups
            List<double> grp1Vals = CalculateStrength(grp1, dataType, vtxStrs1);
            List<double> grp2Vals = CalculateStrength(grp2, dataType, vtxStrs2);

            // Sig test the verticies
            _rsvms = new List<RegionalStrengthViewModel>();

            for (int i = 0; i < regions.Count; i++)
            {
                var lst1 = vtxStrs1[i];
                var lst2 = vtxStrs2[i];

                double ybt = 0; double ylt = 0; double yrt = 0;
                alglib.studentttest2(lst1.ToArray(), lst1.Count, lst2.ToArray(), lst2.Count, out ybt, out ylt, out yrt);

                RegionalStrengthViewModel rsvm = new RegionalStrengthViewModel
                {
                    ROI = regions[i],
                    GroupDifference = lst1.Average() - lst2.Average(),
                    PValue = ybt,
                };

                _rsvms.Add(rsvm);
            }

            int idx = 1;
            bool begin = true;
            var sortedRsvms = _rsvms.OrderBy(r => r.PValue);
            foreach (var rsvm in sortedRsvms)
            {
                double dIdx = (double)idx;
                double dReg = (double)regions.Count;
                double qval = (dIdx / dReg) * 0.05;

                rsvm.SignificantLevel = qval;

                if (rsvm.PValue < qval && begin)
                    rsvm.Significant = true;
                else
                {
                    begin = false;
                    rsvm.Significant = false;
                }

                idx++;
            }

            AXPlotModel = LoadPlotModel(_rsvms, r => r.X, r => r.Y);
            SGPlotModel = LoadPlotModel(_rsvms, r => (100 - r.Y), r => r.Z);
            CRPlotModel = LoadPlotModel(_rsvms, r => r.X, r => r.Z);

            double bt = 0; double lt = 0; double rt = 0;
            alglib.mannwhitneyutest(grp1Vals.ToArray(), grp1Vals.Count, grp2Vals.ToArray(), grp2Vals.Count, out bt, out lt, out rt);

            double tbt = 0; double tlt = 0; double trt = 0;
            alglib.studentttest2(grp1Vals.ToArray(), grp1Vals.Count, grp2Vals.ToArray(), grp2Vals.Count, out tbt, out tlt, out trt);

            GrpDiff = (grp1Vals.Average() - grp2Vals.Average()).ToString("0.0000");
            PValue = "p" + tbt.ToString("0.0000") + " u" + bt.ToString("0.0000");

            var model = new PlotModel() { IsLegendVisible = false };
            model.PlotMargins = new OxyThickness(0, 0, 0, 0);

            model.Axes.Add(new CategoryAxis("", "Group 1", "Group 2"));
            model.Axes.Add(new LinearAxis(AxisPosition.Left) { MinimumPadding = 0.1, MaximumPadding = 0.1, IntervalLength = 20 });

            var s1 = new BoxPlotSeries
            {
                Title = "BoxPlotSeries",
                Fill = OxyColors.White,
                Stroke = OxyColors.DarkBlue,
                StrokeThickness = 2,
                OutlierSize = 2,
                BoxWidth = 0.4
            };

            s1.Items.Add(MakeBoxPlotItem(0, grp1Vals));
            s1.Items.Add(MakeBoxPlotItem(1, grp2Vals));

            model.Series.Add(s1);
            GlobalPlotModel = model;
        }