public Dictionary<string, double> GetStatistics(ITrendMethod method) { Dictionary<string, double> dict = new Dictionary<string, double>(); var mean = CalculateSignalMean(method); dict.Add("Średnia wartość sygnału", mean); dict.Add("Średni moduł odchyleń sygnału", CalculateMAD(method, mean)); var sumOfSq = CalculateSS(method, mean); dict.Add("Suma kwadratów odchyleń sygnału", sumOfSq); var MS = CalculateMS(method, sumOfSq); dict.Add("Średnie odchylenie kwadratowe sygnału", MS); var variance = CalculateVariance(method, sumOfSq); dict.Add("Wariancja sygnału", variance); dict.Add("Pierwiastek średniokwadratowy sygnału", CalculateRMS(MS)); var stdDev = CalculateStdDeviation(variance); dict.Add("Odchylenie standardowe sygnału", stdDev); dict.Add("Skośność sygnału", CalculateSkewness(method, mean, stdDev)); // // Błędy predykcji // List<double> errors = GetPredictionErrors(method); dict.Add("Średni błąd predykcji", CalculateMeanError(errors)); dict.Add("Średni moduł błędu predykcji", CalculateMeanAbsoluteError(errors)); var sumOfErrSquares = CalculateSumOfSquaredError(errors); dict.Add("Suma kwadratów błędów predykcji", sumOfErrSquares); dict.Add("Średniokwadratowy błąd predykcji", CalculateMeanSquaredError(errors, sumOfErrSquares)); var errVariance = CalculateErrorVariance(errors, sumOfErrSquares); dict.Add("Wariancja błędu predykcji", errVariance); dict.Add("Odchylenie standardowe błędów predykcji", CalculateErrorStdDev(errVariance)); dict.Add("Miara Durbina-Watsona", CalculateDurbinWatson(errors, sumOfErrSquares)); return dict; }
private void UpdateStatistics(ITrendMethod method) { Statistics stat = new Statistics(); Statistics = stat.GetStatistics(method); }
/// <summary> /// Mean Absolute Deviation 1/N * sum(x - mean(x)) /// </summary> /// <param name="method"></param> /// <param name="meanVal"></param> /// <returns></returns> private double CalculateMAD(ITrendMethod method, double meanVal) { return method.Samples.Sum(t => Math.Abs(t.Value - meanVal)) / method.Samples.Count; }
private List<double> GetPredictionErrors(ITrendMethod method) { List<double> errors = new List<double>(method.Samples.Count); foreach(var sample in method.Samples) { errors.Add(sample.Value - method.Predict(sample.Time)); } return errors; }
private double CalculateVariance(ITrendMethod method, double sumOfSquares) { if (method.Samples.Count > 1) return sumOfSquares / (method.Samples.Count - 1); else return 0.0; }
/// <summary> /// Suma kwadratów odchyleń /// </summary> private double CalculateSS(ITrendMethod method, double meanVal) { return method.Samples.Sum(t => Math.Pow(t.Value - meanVal, 2)); }
private double CalculateSkewness(ITrendMethod method, double mean, double stdDev) { if (stdDev == 0) return 0; return method.Samples.Sum(t => Math.Pow(t.Value - mean, 3)) / method.Samples.Count / Math.Pow(stdDev, 3); }
private double CalculateSignalMean(ITrendMethod method) { return method.Samples.Sum(t => t.Value) / method.Samples.Count; }
/// <summary> /// Średnie odchylenie kwadratowe /// </summary> private double CalculateMS(ITrendMethod method, double sumOfSquares) { return sumOfSquares / method.Samples.Count; }