Пример #1
0
        internal static TrendType Sign(STAT sample1D, double alpha)
        {
            var x = sample1D.d;
            int N = x.Length;

            var c = Enumerable.Range(0, N - 1).Where(i => x[i + 1] >= x[i]).Count();

            double E = (1d / 2) * (N - 1);
            double D = 1d / 12 * (N + 1);
            double S = (c - E) / Math.Sqrt(D);

            //var u = BHData.Common.Quantile.Get_Quantile_normalization(BHData.Common.Constant.ParameterForQuantile);
            var u = Kvantili.Normal(alpha);


            if (Math.Abs(S) < u)
            {
                return(TrendType.Flat);
            }
            else if (S < -u)
            {
                return(TrendType.Falling);
            }
            else
            {
                return(TrendType.Growing);
            }
        }
Пример #2
0
        internal static TrendType Abbe(STAT sample, double alpha)
        {
            int    N        = sample.d.Length;
            var    elements = sample.d;
            double xAv      = sample.Expectation;
            double q2       = Enumerable.Range(0, N - 1).Sum(i => Math.Pow(elements[i] - elements[i + 1], 2)) / (N - 1);

            double s2 = elements.Sum(e => Math.Pow(e - xAv, 2)) / (N - 1);

            double y = q2 / (2 * s2);
            double u = (y - 1) * Math.Sqrt((N * N - 1) / (N - 2));

            //var kv = Quantile.Get_Quantile_normalization(Constant.ParameterForQuantile);
            var kv = Kvantili.Normal(alpha);

            if (Math.Abs(u) < kv)
            {
                return(TrendType.Flat);
            }
            else if (u < -kv)
            {
                return(TrendType.Falling);
            }
            else
            {
                return(TrendType.Growing);
            }
        }
Пример #3
0
        public ExteendedCoef GetPartialCoefCorrelationInfo(int i, int j)
        {
            //значение
            double rij = PartialR[i][j];

            //значимость
            int w = PartialR.GetLength(0) - 2;

            int    NN = PartialR.GetLength(0) * N;
            double V  = NN - w - 2;  //Это чисто мое обозначение для упрощения кол-ва степеней свободы

            double t = (rij * Math.Sqrt(V) / Math.Sqrt(1 - rij * rij));

            string state = Math.Abs(t) < Kvantili.Student(0.05, V) ? "Не значущий" : "Значущий";


            //интервальное оценивание
            double V1 = Math.Log((1 + rij) / (1 - rij)) / 2.0 - Kvantili.Normal(0.05) / (V - 1);
            double V2 = Math.Log((1 + rij) / (1 - rij)) / 2.0 + Kvantili.Normal(0.05) / (V - 1);


            double bottomborder = (Math.Exp(2 * V1) - 1) / (Math.Exp(2 * V1) + 1);
            double Topborder    = (Math.Exp(2 * V2) - 1) / (Math.Exp(2 * V2) + 1);

            return(new ExteendedCoef()
            {
                info = Environment.NewLine + "Частковий коефіцієнт кореляції r(" + i + ")(" + j + "):",
                BottomValue = bottomborder,
                Value = rij,
                TopValue = Topborder,
                State = state
            });
        }
Пример #4
0
        internal static TrendType ExtremalPoint(STAT sample1D, double alpha)
        {
            var p = 0;
            var x = sample1D.d;
            int N = x.Length;

            for (int i = 1; i < N - 1; i++)
            {
                if ((x[i] > x[i - 1] && x[i] > x[i + 1]) || (x[i - 1] > x[i] && x[i + 1] > x[i]))
                {
                    p++;
                }
            }
            double E = (2d / 3) * (N - 2);
            double D = (1d / 90) * (16 * N - 29);
            double S = (p - E) / Math.Sqrt(D);

            //var u = BHData.Common.Quantile.Get_Quantile_normalization(BHData.Common.Constant.ParameterForQuantile);

            var u = Kvantili.Normal(alpha);

            if (Math.Abs(S) < u)
            {
                return(TrendType.Flat);
            }
            else if (S < -u)
            {
                return(TrendType.Falling);
            }
            else
            {
                return(TrendType.Growing);
            }
        }
Пример #5
0
        //совпадение к н-меных ДК матриц
        public static string ComparingKNdimDC(STATND[] stats, double alpha)
        {
            int k, n;

            int[]    Nd;
            Vector[] Averagexd;
            double[] Sd;
            //начало работы с к н-мерными = заполнение переменных
            StartWorkWithKNdim(stats, out k, out n, out Nd, out Averagexd, out Sd);

            double S = 0;
            int    N = 0;

            for (int i = 0; i < k; i++)
            {
                S += Sd[i] * (Nd[i] - 1);
                N += Nd[i];
            }
            S /= (N - k);

            double V = 0;   //статистика

            for (int i = 0; i < k; i++)
            {
                V += (Nd[i] - 1) / 2d * Math.Log(Math.Abs(S / Sd[i]));
            }

            //делаем выводы
            double kv = Kvantili.Hi2(alpha, n * (n + 1) * (k - 1) / 2);

            //для удобства
            string resultStr               = "";
            Func <double, double> r        = val => Math.Round(val, 4);
            Action <string>       mess2log = str => resultStr += str + Environment.NewLine;

            mess2log("V = " + r(V));
            mess2log("kv = " + r(kv));

            if (V <= kv)
            {
                //гипотезу принято; ДК совпадают
                mess2log("V<kv");
                mess2log("Гіпотезу прийнято!");
                mess2log("DC співпадають!");
            }
            else
            {
                //гипотезу не принято
                mess2log("V>kv");
                mess2log("Гіпотезу НЕ прийнято!");
                mess2log("DC НЕ співпадають!");
            }

            return(resultStr);
        }
Пример #6
0
        //значимость множественных коэф корреляции
        public string SignificanceOfMultipleR(int i)
        {
            int NN = stats[0].d.Length * N;

            double r = MultipleR[i];

            double f = (NN - n - 1) / (double)n * r * r / (1 - r * r);


            string res = f > Kvantili.Fishera(0.05, n, NN - n - 1) ? "Значущий" : "Не значущий";// or <  ! но пока пусть будет так

            return(String.Format("{1}Множинний коефіцієнт ({0}) - {2}", i, Environment.NewLine, res));
        }
Пример #7
0
        //значимость статистики Кендалла
        public string MeasureOfConnectionKendella_significance()
        {
            double Tau          = kendal;
            double Uk           = Kvantili.Normal(alpha / 2.0);
            double U            = 3 * Tau / Math.Sqrt(2 * (2 * N + 5)) * Math.Sqrt(N * (N - 1));
            string significance = "Tau = " + Math.Round(Tau, 4) + Environment.NewLine + "U(" + (1 - alpha / 2.0) + ")= " + Math.Round(Uk, 4) + Environment.NewLine;

            significance += "U = " + Math.Round(U, 4) + Environment.NewLine;
            if (Math.Abs(U) <= Uk)
            {
                significance += "Оцінка значуща!";
            }
            else
            {
                significance += "Оцінка не значуща!";
            }
            return(significance);
        }
Пример #8
0
        //значимость коеф сообщений Пирсона
        public string СoefficientConnectionsPirsona_significance()
        {
            double C            = Math.Sqrt(Hi2 / (N + Hi2));
            double nu           = (SizeN - 1) * (SizeM - 1);
            double Hi2k         = Kvantili.Hi2(1 - alpha, nu);
            string significance = "C = " + Math.Round(C, 4) + Environment.NewLine + "Hi^2(" + (1 - alpha) + ", " + nu + ")= " + Math.Round(Hi2k, 4) + Environment.NewLine;

            significance += "Hi^2 = " + Math.Round(Hi2, 4) + Environment.NewLine;
            if (Hi2 >= Hi2k)
            {
                significance += "Оцінка значуща!";
            }
            else
            {
                significance += "Оцінка не значуща!";
            }
            return(significance);
        }
Пример #9
0
        //проверка незавизимости X, Y
        public string IndependenceHypothesis()
        {
            CalcHi2();

            string result = "Перевірка незалежності X та Y";
            double kv     = Kvantili.Hi2(alpha, (SizeM - 1) * (SizeN - 1));

            result += String.Format("Hi2 = {0}\nKvantil = {1}\n", Hi2, kv);

            if (Hi2 > kv)
            {
                result += "Гіпотеза вірна";
            }
            else
            {
                result += "Гіпотеза НЕ вірна\nІснує зв'язок";
            }

            return(result);
        }
Пример #10
0
        //значимость Стюарта
        public string CheckSignificanceOfStuart()
        {
            //минимум
            double min = Math.Min(SizeM, SizeN);

            //сумма под корнем
            double Sum = 0;

            for (int i = 0; i < SizeN; i++)
            {
                for (int j = 0; j < SizeM; j++)
                {
                    double A = 0, B = 0;

                    //считаем А
                    for (int k = 0; k < SizeN; k++)
                    {
                        for (int l = 0; l < SizeM; l++)
                        {
                            A += nij[k][l];
                        }
                    }

                    for (int k = 0; k < i - 1; k++)
                    {
                        for (int l = 0; l < j - 1; l++)
                        {
                            A += nij[k][l];
                        }
                    }

                    //считаем B
                    for (int k = 0; k < SizeN; k++)
                    {
                        for (int l = 0; l < j - 1; l++)
                        {
                            B += nij[k][l];
                        }
                    }

                    for (int k = 0; k < i - 1; k++)
                    {
                        for (int l = 0; l < SizeM; l++)
                        {
                            B += nij[k][l];
                        }
                    }

                    //считаем саму сумму
                    Sum += nij[i][j] * Math.Pow(A - B, 2);
                }
            }

            double sigma = 2 * min / (N * N * N * (min - 1)) * Math.Sqrt(N * N * Sum - 4 * N * (P - Q));

            //проверка на значимость(работа с квантилем)
            double Tau = this.stuart;

            double tk           = Kvantili.Student(alpha, SizeM + SizeN - 2);
            double t            = Tau / sigma;
            string significance = "Tau = " + Math.Round(Tau, 4) + Environment.NewLine + "t(" + (1 - alpha / 2.0) + ", " + (SizeM + SizeN - 2) + " )= " + Math.Round(tk, 4) + Environment.NewLine;

            significance += "T = " + Math.Round(t, 4) + Environment.NewLine;
            if (Math.Abs(t) <= tk)
            {
                significance += "Оцінка значуща!";
            }
            else
            {
                significance += "Оцінка не значуща!";
            }
            return(significance);
        }
Пример #11
0
        private static RegressionResult GetConfidenceIntervalsOnRegressionParametrs(double alpha, int n, List <STAT> XStats, STAT yStat, Vector YVector, Vector ExtendedparamsVector)
        {
            //это величина доьавлением/отниманием которой получаются доверительные интервалы на параметры регресии
            double[] confidenceValues = new double[n + 1];

            //берем исходные иксы
            List <Vector> XInputVectors = XStats.Select(stat => new Vector(stat.d)).ToList();

            //добавляю игрекв первую колонку
            XInputVectors.Insert(0, YVector);

            Matrix X = Matrix.Create.JoinVectors(XInputVectors);

            //ищем квантиль
            int    N  = XStats[0].d.Length * n;
            int    Nu = N - n; //по формуле N-n
            double kv = Kvantili.Student(alpha, Nu);

            //коэф детерминации
            XStats.Add(yStat);                                       //добавляем y к иксам, чтобы получить общую матрицу

            STATND STATNDForR        = new STATND(XStats.ToArray()); //заносим полученную матрицу в многомерный анализ
            double MultipleR         = STATNDForR.GetMultipleR(n);
            double DeterminationCoef = MultipleR * MultipleR;

            //ищем остаточную дисперсию и сигму
            double S2    = (double)(N - 1) / (N - n) * yStat.Dispersia * (1 - DeterminationCoef);
            double sigma = Math.Sqrt(S2);

            //значимость параметров
            string[] paramsState = new string[7];
            double   KvForParams = Kvantili.Student(alpha, N - n);

            //ищем сkk
            Matrix C = (X.Transpose() * X).Inverse();

            for (int i = 0; i < n + 1; i++)
            {
                //дл интервальных оценок
                double Ckk = C[i, i];
                confidenceValues[i] = kv * sigma * Math.Sqrt(Ckk);

                //проверка параметров регрессии на значимость
                paramsState[i] = Math.Abs(ExtendedparamsVector[i] / (sigma * Math.Sqrt(Ckk))) <= KvForParams? "не значущий": "Значущий";
            }

            //переносим из массива в вектор
            Vector ConfidenceVector = new Vector(confidenceValues);

            //доверительные границы
            Vector topLimits    = ExtendedparamsVector + ConfidenceVector;
            Vector bottomLimits = ExtendedparamsVector - ConfidenceVector;

            //проверка значимости регрессии
            string state                  = "";
            double f                      = (double)(N - n - 1) / n * DeterminationCoef * DeterminationCoef / (1 - DeterminationCoef * DeterminationCoef);
            int    Nu1                    = n;
            int    Nu2                    = N - n - 1;
            Func <double, double> r       = v => Math.Round(v, 4);
            Action <string>       Add2Log = s => state += s + Environment.NewLine;

            Add2Log("f = " + r(f));
            Add2Log("kv = " + r(kv));
            if (f > kv)
            {
                Add2Log("f > kv");
                Add2Log("Регресійна модель Значуща");
            }
            else
            {
                Add2Log("f <= kv");
                Add2Log("Регресійна модель НЕ Значуща");
            }

            //Интервалы дисперсии
            double nominator  = S2 * (N - n);
            double TopDisp    = nominator / Kvantili.Hi2((2d - alpha) / 2, N - n);
            double BottomDisp = nominator / Kvantili.Hi2(-alpha / 2d, N - n);

            string disprsionIntervals = String.Format("{0}<={1}<={2}", r(BottomDisp), r(S2), r(TopDisp));

            RegressionResult result = new RegressionResult()
            {
                BotoomConfidenceLimits = bottomLimits,
                RegressionParams       = ExtendedparamsVector,
                TopConfidenceLimits    = topLimits,
                R                   = DeterminationCoef,
                state               = state,
                ParamsState         = paramsState,
                DispersionIntervals = disprsionIntervals
            };

            return(result);
        }
Пример #12
0
        //равенство двух многомерных средних в случае равных ДК
        public static string ComparingTwoNdimAverage(STATND xStat, STATND yStat, double alpha)
        {
            //проверки
            if (!xStat.CheckingLengthOfStats())
            {
                throw new ChekingLengthOfStatsException("xStat");
            }
            if (!yStat.CheckingLengthOfStats())
            {
                throw new ChekingLengthOfStatsException("yStat");
            }

            int nLen1 = xStat.N;
            int nLen2 = yStat.N;

            if (nLen1 != nLen2)
            {
                throw new DIfferentDimentionsLengthException();
            }
            //конец проверок

            //вынос нужных переменных
            int N1 = xStat.GetStat(0).d.Length;  //длинна всех признаков по иксу
            int N2 = yStat.GetStat(0).d.Length;  //длинна всех признаков по y
            int n  = nLen1;                      //количество признаков (должно быть одинаковым для x и y)

            double[][] S0 = ArrayMatrix.GetJaggedArray(n, n);
            double[][] S1 = ArrayMatrix.GetJaggedArray(n, n);

            //лямбды для удобного получения x и y
            Func <int, int, double> x = (NumberOfDim, NumberOfElementInDim) => xStat.GetStat(NumberOfDim).d[NumberOfElementInDim];
            Func <int, int, double> y = (NumberOfDim, NumberOfElementInDim) => yStat.GetStat(NumberOfDim).d[NumberOfElementInDim];

            //лямбды для получения суммы
            Func <int, double> xSum = NumberOfDim => xStat.GetStat(NumberOfDim).d.Sum();
            Func <int, double> ySum = NumberOfDim => yStat.GetStat(NumberOfDim).d.Sum();

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    double CommonDenominator = N1 + N2 - 2;

                    double S0Temp = 0;
                    double S1Temp = 0;

                    //по формулам
                    for (int l = 0; l < N1; l++)
                    {
                        S0Temp += x(i, l) * x(j, l);
                    }

                    for (int l = 0; l < N2; l++)
                    {
                        S0Temp += y(i, l) * y(j, l);
                    }

                    S1Temp = S0Temp; //до этого места формулы одинаковые

                    //подсчет частей, которые отличаются
                    S0Temp -= ((xSum(i) + ySum(i)) * (xSum(j) + ySum(j))) / (N1 + N2);

                    S1Temp -= (xSum(i) * xSum(j)) / N1;
                    S1Temp -= (ySum(i) * ySum(j)) / N2;

                    //перенос значений в матрицу
                    S0[i][j] = S0Temp / CommonDenominator;
                    S1[i][j] = S1Temp / CommonDenominator;
                }
            }

            //перенос значений в сложный тип - матрицу(для нахождения определителей)
            Matrix S0Matrix = new Matrix(S0);
            Matrix S1Matrix = new Matrix(S1);

            //подсчет статистики
            double V = N1 + N2 - 2 - n / 2d;

            V *= Math.Log(Math.Abs(S1Matrix.Determinant() / S0Matrix.Determinant()));

            //для удобства
            string resultStr               = "";
            Func <double, double> r        = val => Math.Round(val, 4);
            Action <string>       mess2log = str => resultStr += str + Environment.NewLine;

            //делаем выводы
            double kv = Kvantili.Hi2(alpha, n);

            mess2log("V = " + r(V));
            mess2log("kv = " + r(kv));

            if (V <= kv)
            {
                //гипотезу принято;//средние совпадают
                mess2log("V<kv");
                mess2log("Гіпотезу прийнято!");
                mess2log("Середні співпадають!");
            }
            else
            {
                //гипотезу не принято
                mess2log("V>kv");
                mess2log("Гіпотезу НЕ прийнято!");
                mess2log("Середні НЕ співпадають!");
            }

            return(resultStr);
        }
Пример #13
0
        //совпадение к н-меных  средних при расхождении ДК матриц
        public static string ComparingKNdimAverage(STATND[] stats, double alpha)
        {
            int k, n;

            int[]    Nd;
            Vector[] Averagexd;
            double[] Sd;
            //начало работы с к н-мерными = заполнение переменных
            StartWorkWithKNdim(stats, out k, out n, out Nd, out Averagexd, out Sd);

            //подсчет обобщенного среднего
            Vector GenerilizedAverage;          //само обобщенное среднее
            double leftPart  = 0;
            Vector RightPart = Vector.Create.New(n);

            for (int i = 0; i < k; i++)
            {
                double commonPart = Nd[i] / Sd[i];

                leftPart  += commonPart;
                RightPart += commonPart * Averagexd[i];
            }

            GenerilizedAverage = RightPart / leftPart; //обобщенное среднее подсчитано

            double V = 0;                              //результирующая статистика

            for (int i = 0; i < k; i++)
            {
                Vector v = Averagexd[i] - GenerilizedAverage;
                V += Nd[i] * v / Sd[i] * v;
            }

            //делаем выводы
            double kv = Kvantili.Hi2(alpha, n * (k - 1));

            //для удобства
            string resultStr               = "";
            Func <double, double> r        = val => Math.Round(val, 4);
            Action <string>       mess2log = str => resultStr += str + Environment.NewLine;

            mess2log("V = " + r(V));
            mess2log("kv = " + r(kv));

            if (V <= kv)
            {
                //гипотезу принято; средние совпадают
                mess2log("V<kv");
                mess2log("Гіпотезу прийнято!");
                mess2log("Середні співпадають!");
            }
            else
            {
                //гипотезу не принято
                mess2log("V>kv");
                mess2log("Гіпотезу НЕ прийнято!");
                mess2log("Середні НЕ співпадають!");
            }

            return(resultStr);
        }