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); }
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); }