10. ТЕКСТ ПРОГРАММЫ ЕМ-АЛГОРИТМА ДЛЯ МНОГОМЕРНОГО НОРМАЛЬНОГО РАСПРЕДЕЛЕНИЯ
Приводимый в распечатке текст адаптирован из текста программы, входящей в состав диалоговой статистической системы ЦСМИ (см. раздел 9), функционирующей под управлением операционной системы РАФОС для ЭВМ, программно совместимых с ЭВМ СМ-4.
Данный вариант программы оформлен как независимая совокупность модулей (подпрограмм, написанных на Фортране), практически готовая для обращения.
Для вызова программы пользователь должен лишь написать три простые дополнительные процедуры-функции DEF, DEFOBS и COND (тип функций — LOGICAL »1). В DEF должен быть один входной параметр X вещественного типа, в DEFOBS - два входных параметра: первый —
число признаков, второй — вещественный массив
длины
(вектор значений одного объекта). Значение DEF должно быть равно .FALSE., если X — значение, и .TRUE., если X — пропуск. Значение DEFOBS должно быть равно .FALSE., если в
нет ни одного пропуска, и .TRUE., если в
есть хотя бы один пропуск. Значение COND, равное .TRUE., должно означать, что условие сходимости не удовлетворено (самое простое условие — достижение заданного числа итераций — реализовано в подпрограмме, содержащейся в тексте).
Структура программы хорошо видна из текста. Дополнительно прокомментируем лишь подпрограмму COVAR, в которой вычисляются вектор сумм по переменным и матрица сумм взаимных произведений по всем присутствующим переменным:
В этих выражениях используются обозначения из раздела 8.2 книги, а штрих в знаке суммирования обозначает, что суммы вычисляются только по наблюдениям, в которых присутствуют значения переменной
(в первой сумме) или переменных
и к (во второй сумме). Далее эти суммы складываются в (8.1) и (8.2), см. раздел 8.2 книги, с соответствующими компонентами для пропущенных значений. Суммы (27) вычисляются однократно за время работы программы. Благодаря этому приему увеличивается эффективность алгоритма.
Входной массив данных (таблица «объект-признак») X не должен содержать «пустых» переменных или наблюдений (т. е. полностью состоящих из пропусков), а также переменных, состоящих только из совпадающих значений.
В программе присутствует большое число массивов — входных, выходных и рабочих, поэтому целесообразно оформить их динамический вызов через один массив допустимого размера (что сделано в упомянутой системе). Из исходного текста исключены проверки на пустые переменные и т. п., поскольку, может быть, удобнее проводить их до обращения к программе, и, кроме того, их присутствие в тексте ухудшает восприятие алгоритма.
В распечатке имеется текст программы, реализующей оператор «свертки», описанный в разделе 6.5 (подпрограмма SWEEP2). Еще один доступный источник — [Clarke (1982)], программа в котором отличается от приведенной по двум пунктам: во-первых, в [Clarke (1982)] проводится проверка на вырожденность обрабатываемой матрицы, во-вторых, входная матрица разрушается в процессе вычисления.
Цель этой публикации — служить иллюстрацией к материалу книги, а также быть основой для разработки собственных программ по ЕМ-алгоритму, в том числе и для более сложных моделей, связанных с многомерным нормальным распределением. В распечатке продемонстрирована требующаяся в ЕМ-алгоритме для многомерного нормального распределения последовательность процедур и сами процедуры, типичные технические приемы и т. п. При профессиональном программировании, конечно, может потребоваться ввести в данный текст более эффективный алгоритм сортировки, включение проверок на правильное функционирование программы, способы более точного вычисления ковариаций и дисперсий, другие варианты вычисления начальных значений (см. раздел 8.2 книги) и т. п.