/// <summary> /// Вычислить значение хи-квадрат /// </summary> /// <param name="values"></param> /// <param name="intervalNumber"></param> /// <returns></returns> public static double GetChiSquared(double[] values, int intervalNumber) { DescriptiveStatistic stat = new DescriptiveStatistic(values); int[] m = new int[intervalNumber]; //эмпирические частоты double[] mt = new double[intervalNumber]; //теоретические частоты const int round = 13; //насколько округлять расчеты, делается, чтобы все значения попали в интервал //формирование массива m double step = (stat.Interval) / intervalNumber; foreach (double val in values) { for (int i = 0; i < intervalNumber; i++) { if (Math.Round(val, round) <= Math.Round(stat.Min + step * (i + 1), round)) { ++m[i]; break; } } } if (m.Sum() != values.Length) { throw new Exception(); } //формирование массива mt for (int i = 0; i < mt.Length; i++) { double x = stat.Min + step * i + step / 2; double u = (x - stat.Average) / stat.StandardDeviation; double f = Math.Pow(Math.E, -u * u / 2) / Math.Sqrt(2 * Math.PI); double p = (step / stat.StandardDeviation) * f; mt[i] = stat.Count * p; } Console.WriteLine(string.Join(", ", m) + "\n" + string.Join(", ", mt)); //вычисление хи-квадрат double chiSquare = 0; for (int i = 0; i < intervalNumber; i++) { chiSquare += Math.Pow(m[i] - mt[i], 2) / mt[i]; } return(chiSquare); }
/// <summary> /// Получить таблицу со статистиками /// </summary> /// <param name="matrix"></param> /// <param name="round"></param> /// <returns></returns> public static double[][] GetTotalStatistic(double[][] matrix) { double[][] result = new double[Headers.Length][].Select(e => e = new double[matrix.Length]).ToArray(); for (int i = 0; i < matrix.Length; i++) { DescriptiveStatistic stat = new DescriptiveStatistic(matrix[i]); int j = 0; foreach (double value in stat.GetNextStatistic()) { result[j][i] = value; j++; } } return(MatrixOperations.Transpose(result)); }
/// <summary> /// Получить массив нормированных значений /// </summary> /// <returns></returns> public static double[][] GetNormalizedValues(double[][] values) { return(values.Select(e => e = new DescriptiveStatistic(e).GetNormalizedValues()).ToArray()); }