public double CalcPowerRSquared()
        {
            if (YVals.Count != 0)
            {
                var yValMean = YVals.Average();

                double totalSumSquares = yVals.Sum(val => Math.Pow((val - yValMean), 2));

                //var modelCoeffsRSquared = CalcModelCoeffs(pOrder);
                //var modelCoeffsRSquared = CalcLogModelCoeffs();
                //var modelCoeffsRSquared = CalcExpModelCoeffs();
                var modelCoeffsRSquared = CalcPowerModelCoeffs();

                //List<double> calculatedYVals = xVals.Select(x => CalcResultVal(x)).ToList();
                //List<double> calculatedYVals = xVals.Select(x => CalcLogResultVal(x)).ToList();
                //List<double> calculatedYVals = xVals.Select(x => CalcExpResultVal(x)).ToList();
                List <double> calculatedYVals = xVals.Select(x => CalcPowerResultVal(x)).ToList();

                double residualSumSquares = 0;

                for (var i = 0; i < yVals.Count; i++)
                {
                    residualSumSquares += Math.Pow((YVals[i] - calculatedYVals[i]), 2);
                }

                var resultVal = 1 - residualSumSquares / totalSumSquares;

                return(resultVal >= 0 ? resultVal : 0);
            }
            return(0);
        }
Example #2
0
 public void Clear()
 {
     Y2Vals.Clear();
     YVals.Clear();
     XVals.Clear();
 }
        //Creates DataPoint objects from the trendline/regression model
        public ObservableCollection <Common.DataPoint> CreateRegressionModelDataPoints(Int32 polyOrder)
        {
            //Recalculate model coefficients to ensure correct regression model
            CalcModelCoeffs(polyOrder);

            if (polyOrder + 1 != modelCoeffs.Count)
            {
                return(null);
            }

            //Determine qty. of returned data points -> Target: 100 data points
            var maxXVal = XVals.Max();
            var minXVal = XVals.Min();

            Int32 dataPointQty = 100;

            var stepSize = (maxXVal - minXVal) / dataPointQty;

            //Create collection to return
            ObservableCollection <DataPoint> calcDataPoints = new ObservableCollection <DataPoint>();

            switch (modelCoeffs.Count)
            {
            //Case of a constant dependent variable
            case 1:
                if (XVals.Count >= 1)
                {
                    for (int i = 0; i <= dataPointQty; i++)
                    {
                        var point = new DataPoint
                        {
                            XValue = minXVal + stepSize * i,
                            YValue = YVals.FirstOrDefault()
                        };

                        calcDataPoints.Add(point);
                    }
                    return(calcDataPoints);
                }
                return(null);


            //Linear regression model
            case 2:
                if (XVals.Count >= 2)
                {
                    for (int i = 0; i <= dataPointQty; i++)
                    {
                        var point = new DataPoint();
                        point.XValue = minXVal + stepSize * i;
                        point.YValue = modelCoeffs[0] + modelCoeffs[1] * point.XValue;
                        calcDataPoints.Add(point);
                    }
                    return(calcDataPoints);
                }
                return(null);

            //Quadratic Regression Model
            case 3:
                if (XVals.Count >= 3)
                {
                    for (int i = 0; i <= dataPointQty; i++)
                    {
                        var point = new DataPoint();
                        point.XValue = minXVal + stepSize * i;
                        point.YValue = modelCoeffs[0] + modelCoeffs[1] * point.XValue + modelCoeffs[2] * Math.Pow(point.XValue, 2);
                        calcDataPoints.Add(point);
                    }
                    return(calcDataPoints);
                }
                return(null);

            //3rd Order Polynomial
            case 4:
                if (XVals.Count >= 4)
                {
                    for (int i = 0; i <= dataPointQty; i++)
                    {
                        var point = new DataPoint();
                        point.XValue = minXVal + stepSize * i;
                        point.YValue = modelCoeffs[0] + modelCoeffs[1] * point.XValue + modelCoeffs[2] * Math.Pow(point.XValue, 2) + modelCoeffs[3] * Math.Pow(point.XValue, 3);
                        calcDataPoints.Add(point);
                    }
                    return(calcDataPoints);
                }
                return(null);

            //4th Order Polynomial
            case 5:
                if (XVals.Count >= 5)
                {
                    for (int i = 0; i <= dataPointQty; i++)
                    {
                        var point = new DataPoint();
                        point.XValue = minXVal + stepSize * i;
                        point.YValue = modelCoeffs[0] + modelCoeffs[1] * point.XValue + modelCoeffs[2] * Math.Pow(point.XValue, 2) + modelCoeffs[3] * Math.Pow(point.XValue, 3) + modelCoeffs[4] * Math.Pow(point.XValue, 4);
                        calcDataPoints.Add(point);
                    }
                    return(calcDataPoints);
                }
                return(null);

            //5th Order Polynomial
            case 6:
                if (XVals.Count >= 6)
                {
                    for (int i = 0; i <= dataPointQty; i++)
                    {
                        var point = new DataPoint();
                        point.XValue = minXVal + stepSize * i;
                        point.YValue = modelCoeffs[0] + modelCoeffs[1] * point.XValue + modelCoeffs[2] * Math.Pow(point.XValue, 2) + modelCoeffs[3] * Math.Pow(point.XValue, 3) + modelCoeffs[4] * Math.Pow(point.XValue, 4) + modelCoeffs[5] * Math.Pow(point.XValue, 5);
                        calcDataPoints.Add(point);
                    }
                    return(calcDataPoints);
                }
                return(null);
            }

            return(null);
        }