public static bool TryGet <TRegression>(IList <double> listIndependent, IList <double> listDependent, int minPoints, out IIrtRegression regression, IList <Tuple <double, double> > removedValues = null) where TRegression : IIrtRegression, new() { return(TryGet(new TRegression(), listIndependent, listDependent, minPoints, out regression, removedValues)); }
public static double R(IIrtRegression regression) { if (regression?.XValues == null || regression.YValues == null || regression.XValues.Length == 0 || regression.YValues.Length == 0) { return(double.NaN); } var yMean = new Statistics(regression.YValues).Mean(); var totalSumOfSquares = regression.YValues.Sum(y => (y - yMean) * (y - yMean)); var sumOfSquaresOfResiduals = regression.XValues.Select((x, i) => Math.Pow(regression.YValues[i] - regression.GetY(x), 2)).Sum(); return(Math.Sqrt(1 - sumOfSquaresOfResiduals / totalSumOfSquares)); }
private double GetR(IIrtRegression regression, bool includeOutliers) { var r = IrtRegression.R(regression); if (!double.IsNaN(r)) { return(r); } var pointSet = !includeOutliers?RegularPoints.ToArray() : RegularPoints.Concat(OutlierPoints).ToArray(); var statsX = new Statistics(pointSet.Select(point => point.X)); var statsY = new Statistics(pointSet.Select(point => point.Y)); return(statsY.R(statsX)); }
public static bool TryGet(IIrtRegression existing, IList <double> listIndependent, IList <double> listDependent, int minPoints, out IIrtRegression regression, IList <Tuple <double, double> > removedValues = null) { regression = null; removedValues?.Clear(); if (listIndependent.Count != listDependent.Count || listIndependent.Count < minPoints) { return(false); } var listX = new List <double>(listIndependent); var listY = new List <double>(listDependent); while (true) { regression = existing.ChangePoints(listX.ToArray(), listY.ToArray()); if (Accept(regression, minPoints) || listX.Count <= minPoints) { break; } var furthest = 0; var maxDistance = 0.0; for (var i = 0; i < listY.Count; i++) { var distance = Math.Abs(regression.GetY(listX[i]) - listY[i]); if (distance > maxDistance) { furthest = i; maxDistance = distance; } } removedValues?.Add(new Tuple <double, double>(listX[furthest], listY[furthest])); listX.RemoveAt(furthest); listY.RemoveAt(furthest); } return(Accept(regression, minPoints)); }
public static void GetCurve(IIrtRegression regression, RetentionTimeStatistics statistics, out double[] hydroScores, out double[] predictions) { var minHydro = double.MaxValue; var maxHydro = double.MinValue; foreach (var hydroScore in statistics.ListHydroScores) { minHydro = Math.Min(minHydro, hydroScore); maxHydro = Math.Max(maxHydro, hydroScore); } var sortedX = regression.XValues.OrderBy(x => x).ToList(); if (minHydro < sortedX[0]) { sortedX.Insert(0, minHydro); } if (maxHydro > sortedX[sortedX.Count - 1]) { sortedX.Add(maxHydro); } hydroScores = sortedX.ToArray(); predictions = sortedX.Select(regression.GetY).ToArray(); }
public static bool Accept(IIrtRegression regression, int minPoints) { return(regression.XValues != null && regression.XValues.Length >= minPoints && R(regression) >= RCalcIrt.MIN_IRT_TO_TIME_CORRELATION); }