private ScatterPointCollection CalculateResiduals() { var result = new List <ScatterplotPoint>(); for (var categoryIndex = 0; categoryIndex < _points.GroupsCount; categoryIndex++) { var category = _points.Groups[categoryIndex]; var categoryPoints = _points.Where(x => Math.Abs(x.Group) == category).ToArray(); var regression = new LinearRegressionBuilder(categoryPoints.Select(x => x.X).ToArray(), categoryPoints.Select(x => x.Y).ToArray()).Build(); foreach (var categoryPoint in categoryPoints) { var y = categoryPoint.Y - (regression.a0 + regression.a1 * categoryPoint.X); result.Add(new ScatterplotPoint() { Group = categoryPoint.Group, Date = categoryPoint.Date, X = categoryPoint.X, Y = y, SubGroup = categoryPoint.SubGroup }); } } return(new ScatterPointCollection(result)); }
private void DrawRegressionLine(ScatterplotPoint[] groupPoints, int groupIndex) { var regression = new LinearRegressionBuilder(groupPoints.Select(x => x.X).ToArray(), groupPoints.Select(x => x.Y).ToArray()).Build(); var categoryCalculator = new ScatterplotCalculator(groupPoints); var x1 = CanvasCalculator.GetX(categoryCalculator.MinX); var y1 = CanvasCalculator.GetY(regression.a0 + regression.a1 * categoryCalculator.MinX); var x2 = CanvasCalculator.GetX(categoryCalculator.MaxX); var y2 = CanvasCalculator.GetY(regression.a0 + regression.a1 * categoryCalculator.MaxX); var vLine = new Line() { X1 = x1, X2 = x2, Y1 = y1, Y2 = y2, StrokeThickness = 2, Stroke = new SolidColorBrush(new ColorPicker().Pick(groupIndex)) }; mainCanvas.Children.Add(vLine); DisplayResult(groupIndex, regression); }