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("Ошибка расчета критерия", "Критерий Вилкоксона"); } }
/// <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; } }
/// <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; } }