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