Пример #1
0
 private void критерийВилкоксонаToolStripMenuItem_Click(object sender, EventArgs e)
 {
     try
     {
         if (toolStripComboBox2.Text == toolStripComboBox3.Text)
         {
             throw new Exception("Необходимо взять разные выборки");
         }
         Form2 form2 = new Form2(new string[] { "0,10", "0,05", "0,02", "0,01", "0,002", "0,001" });
         if (form2.ShowDialog() == DialogResult.OK)
         {
             Form3 form3 = new Form3(new string[] { "Левосторонняя", "Правосторонняя", "Двусторонняя" });
             if (form3.ShowDialog() == DialogResult.OK)
             {
                 ArrayList        xal = new ArrayList(), yal = new ArrayList();
                 float            alpha = float.Parse(form2.comboBox1.Text);
                 CriticalAreaType ca    = CriticalAreaType.DoubleSided;
                 if (form3.comboBox1.Text == "Левосторонняя")
                 {
                     ca = CriticalAreaType.OneSidedLeft;
                 }
                 if (form3.comboBox1.Text == "Правосторонняя")
                 {
                     ca = CriticalAreaType.OneSidedRight;
                 }
                 if (form3.comboBox1.Text == "Двусторонняя")
                 {
                     ca = CriticalAreaType.DoubleSided;
                 }
                 foreach (DataRow r in dataSet1.Tables[toolStripComboBox1.Text].Rows)
                 {
                     xal.Add((float)(int)r[toolStripComboBox2.Text]);
                     yal.Add((float)(int)r[toolStripComboBox3.Text]);
                 }
                 float[]    x = (float[])xal.ToArray(typeof(float));
                 float[]    y = (float[])yal.ToArray(typeof(float));
                 Criterions c = new Criterions(x, y, alpha);
                 c.W(ca, 1000);
                 Form4 form4 = new Form4(c.criterion, c.leftBound, c.rightBound, c.result);
                 form4.ShowDialog();
             }
         }
     }
     catch
     {
         MessageBox.Show("Ошибка расчета критерия", "Критерий Вилкоксона");
     }
 }
Пример #2
0
        /// <summary>
        /// Критерий рандомизации компонент Фишера
        /// </summary>
        public void F(CriticalAreaType ca)
        {
            int   i, j, k, n = nx + ny, m;
            float comb, mins, s1 = 0, s2 = 0, sum, N = 0;

            bool[] z;
            Random rand = new Random();

            // Определение выборки с минимальной суммой
            for (i = 0; i < nx; i++)
            {
                s1 += x[i];
            }
            for (j = 0; j < ny; j++)
            {
                s2 += y[j];
            }
            if (s1 < s2)
            {
                mins = s1;
                m    = nx;
            }
            else
            {
                mins = s2;
                m    = ny;
            }
            z    = new bool[n];
            comb = C(n, m);
            if (comb > 5000)
            {
                comb = 5000;
            }
            for (i = 0; i < comb; i++)
            {
                // Случайный выбор элементов из объединенной выборки
                for (j = 0; j < n; j++)
                {
                    z[j] = false;
                }
                sum = 0;
                for (j = 0; j < m; j++)
                {
                    do
                    {
                        k = rand.Next() % n;
                    }while (z[k] == true);
                    z[k] = true;
                    if (k < nx)
                    {
                        sum += x[k];
                    }
                    else
                    {
                        sum += y[k - nx];
                    }
                }
                // Подсчет числа благоприятных исходов
                if (sum > mins)
                {
                    N++;
                }
                if (sum == mins)
                {
                    N += 0.5F;
                }
            }

            criterion = N / comb;
            if (ca == CriticalAreaType.OneSidedLeft)
            {
                leftBound  = alpha;
                rightBound = 1;
            }
            if (ca == CriticalAreaType.OneSidedRight)
            {
                leftBound  = 0;
                rightBound = 1 - alpha;
            }
            if (ca == CriticalAreaType.DoubleSided)
            {
                leftBound  = alpha / 2;
                rightBound = 1 - alpha / 2;
            }
            if (criterion >= leftBound && criterion <= rightBound)
            {
                result = true;
            }
            else
            {
                result = false;
            }
        }
Пример #3
0
        /// <summary>
        /// Критерий Вилкоксона
        /// </summary>
        /// <param name="ca"> Тип критической области </param>
        /// <param name="repeats"> Количество итераций при вычислении наблюдаемого значения </param>
        /// <returns> Наблюдаемое значение критерия Вилкоксона </returns>
        public void W(CriticalAreaType ca, int repeats)
        {
            int[]   r;      // Массив с текущими рангами xi
            float[] z;      // Объединенный массив
            float   p;      // Вероятность отклонения нулевой гипотезы

            int[]  ns;      // Массив с частотами появления сумм рангов
            int    sum, minSum, maxSum, i, j;
            Random rand = new Random();

            for (minSum = 0, i = 1; i <= nx; i++)
            {
                minSum += i;
            }
            for (maxSum = 0, i = ny + 1; i <= nx + ny; i++)
            {
                maxSum += i;
            }
            r  = new int[nx];
            ns = new int[maxSum - minSum + 1];
            z  = new float[nx + ny];
            for (i = 0; i < nx; i++)
            {
                r[i] = i + 1;
            }
            for (i = 0; i <= maxSum - minSum; i++)
            {
                ns[i] = 0;
            }

            // Построение закона распределения для суммы рангов
            i = nx - 1;
            while (true)
            {
                for (sum = 0, j = 0; j < nx; j++)
                {
                    sum += r[j];
                }
                ns[sum - minSum] += 1;
                if (r[nx - 1] == nx + ny)
                {
                    i = nx - 2;
                    while (i != -1 && r[i + 1] - r[i] < 2)
                    {
                        i--;
                    }
                    if (i == -1)
                    {
                        break;
                    }
                    r[i]++;
                    for (j = i + 1; j < nx; j++)
                    {
                        r[j] = r[j - 1] + 1;
                    }
                }
                else
                {
                    r[nx - 1]++;
                }
            }

            // Общее количество комбинаций
            for (i = 0; i <= maxSum - minSum; i++)
            {
                j += ns[i];
            }

            // Вычисление доверительного интервала
            p = 0;
            if (ca == CriticalAreaType.DoubleSided)
            {
                for (i = 0; p < alpha; i++)
                {
                    p += (float)(ns[i] + ns[maxSum - minSum - i]) / j;
                }
                i--;
                leftBound  = minSum + i;
                rightBound = maxSum - i;
            }

            if (ca == CriticalAreaType.OneSidedLeft)
            {
                for (i = 0; p < alpha; i++)
                {
                    p += (float)ns[maxSum - minSum - i] / j;
                }
                i--;
                leftBound  = int.MinValue;
                rightBound = maxSum - i;
            }

            if (ca == CriticalAreaType.OneSidedRight)
            {
                for (i = 0; p < alpha; i++)
                {
                    p += (float)ns[i] / j;
                }
                i--;
                leftBound  = minSum + i;
                rightBound = int.MaxValue;
            }

            // Нахождение наблюдаемого значения критерия
            sum = 0;
            for (int k = 0; k < repeats; k++)
            {
                for (i = 0; i < nx; i++)
                {
                    z[i] = x[i];
                }
                for (i = 0; i < ny; i++)
                {
                    z[i + nx] = y[i];
                }
                for (i = 0; i < nx; i++)
                {
                    r[i] = i + 1;
                }
                for (i = 0; i < nx + ny; i++)
                {
                    for (j = 0; j < nx + ny - 1; j++)
                    {
                        if (z[j] > z[j + 1] || (z[j] == z[j + 1] && rand.Next() % 2 == 0))
                        {
                            int k1, k2;
                            for (k1 = 0; k1 < nx; k1++)
                            {
                                if (r[k1] == j + 1)
                                {
                                    break;
                                }
                            }
                            for (k2 = 0; k2 < nx; k2++)
                            {
                                if (r[k2] == j + 2)
                                {
                                    break;
                                }
                            }
                            if (k1 < nx)
                            {
                                r[k1]++;
                            }
                            if (k2 < nx)
                            {
                                r[k2]--;
                            }
                            p        = z[j];
                            z[j]     = z[j + 1];
                            z[j + 1] = z[j];
                        }
                    }
                }
                for (i = 0; i < nx; i++)
                {
                    sum += r[i];
                }
            }

            criterion = sum / repeats;
            if (criterion >= leftBound && criterion <= rightBound)
            {
                result = true;
            }
            else
            {
                result = false;
            }
        }