Методами статистического моделирования исследованы распределения классических статистик, используемых при проверке гипотез о дисперсиях в серии выборок. Для статистик, используемых в критериях Бартлетта и Кокрена, получены таблицы процентных точек, применение которых правомерно при наблюдаемых законах, описываемых экспоненциальным семейством распределений.
Знакомой нужно было реализовать и сделать анализ дисперсии, вот решил поделиться с остальными.
Исходный код выглядит так:
Module Module1
Sub Main()
Dim mas(,) As Single
Dim maso(,) As Single
Dim m_x, m_y As Integer
Dim i, j As Integer
Dim chose As Integer
Dim zn As Random = New Random(100)
Dim tmXi, tmSikv As Single
Dim N As Single
Dim m1, m2 As Single
Dim x1 As Single
Dim m As Integer
Dim maxLen As Integer
Dim tmstr As String
Dim Xmax As Double
Dim fp As IFormatProvider
Console.WriteLine("Дисперсионный анализ - Критерий Бартлетта")
Console.WriteLine()
Console.WriteLine("Введите количество элементов в строке:")
m_x = Console.ReadLine
Console.WriteLine("Введите количество строк:")
m_y = Console.ReadLine
ReDim mas(m_x, m_y)
ReDim maso(m_x 2, m_y 2)
Console.WriteLine()
Console.WriteLine("Выберете тип заполнения таблицы")
Console.WriteLine("1 - Автоматическое заполнение таблицы случайными числами)")
Console.WriteLine("2 - Ручное заполнение таблицы")
chose = 0
While (chose <> 1 And chose <> 2)
chose = Console.ReadLine
End While
If chose = 1 Then
For i = 1 To m_x
For j = 1 To m_y
mas(i, j) = zn.NextDouble * 100
Next j
Next i
Else
For i = 1 To m_x
For j = 1 To m_y
Console.WriteLine("Введите значение элемента: столбец " i.ToString " строка " j.ToString)
mas(i, j) = Console.ReadLine
Next j
Next i
End If
'Переносим данные из исходной таблицы в расчетную
For i = 1 To m_x
For j = 1 To m_y
maso(i, j) = mas(i, j)
Next j
Next i
'Расчет Xi по каждому столцу
For i = 1 To m_x
tmXi = 0
For j = 1 To m_y
tmXi = maso(i, j)
Next j
maso(i, m_y 1) = (1 / m_y) * tmXi
Next i
'Расчет Si^2 по каждому столцу - оценки выборочных дисперсий
For i = 1 To m_x
tmSikv = 0
For j = 1 To m_y
tmSikv = (maso(i, j) - maso(i, m_y 1)) ^ 2
Next j
maso(i, m_y 2) = (1 / (m_y - 1)) * tmSikv
Next i
'Расчет N
For i = 1 To m_x
N = maso(i, m_y 1)
Next i
'Расчет M
For j = 1 To m_y
m1 = 0
m2 = 0
For i = 1 To m_x
m1 = maso(i, j) * maso(i, m_y 2)
Next i
For i = 1 To m_x
m2 = maso(i, j) * Math.Log(maso(i, m_y 2))
Next i
maso(m_x 1, j) = N * Math.Log((1 / N) * m1) - m2
Next j
'Расчет X^2
'm [2 .. 10] - это независимая оценка дисперсии
m = 2
For j = 1 To m_y
For i = 1 To m_x
x1 = (1 / maso(i, j)) - (1 / N)
Next i
maso(m_x 2, j) = maso(m_x 1, j) * (1 (1 / (3 * (m - 1))) * x1) ^ (-1)
Next j
'Марафет таблицы
For i = 0 To m_x
maso(i, 0) = i.ToString
Next i
For j = 0 To m_y
maso(0, j) = j.ToString
Next j
'Нахождение максимальной длинны элемента таблицы
For i = 1 To m_x
For j = 1 To m_y
If maxLen < maso(i, j).ToString.Length Then maxLen = maso(i, j).ToString.Length
Next j
Next i
'Вывод данных
For j = 0 To m_y 2
tmstr = ""
For i = 0 To m_x 2
tmstr = " | " ftxt(maxLen, maso(i, j))
Next i
Console.WriteLine(tmstr)
Next j
Console.WriteLine()
For j = 1 To m_y
If Xmax < maso(m_x 2, j) Then Xmax = maso(m_x 2, j)
Next j
Console.WriteLine()
Console.WriteLine("N = " N.ToString)
Console.WriteLine("Max X^2 = " Xmax.ToString)
Console.WriteLine()
Console.WriteLine("Нажмите любую клавишу для выхода из программы...")
Console.ReadKey()
End Sub
Private Function ftxt(ByVal kpr As Integer, ByVal txt As String) As String
ftxt = txt
For i As Integer = 0 To (kpr - txt.Length)
ftxt = " " ftxt
Next i
End Function
End Module
А выглядит это вот так:

С уважением, Сургай Владимир.