Текст
                    Игорь Гайдышев
АНАЛИЗ и ОБРАБОТКА ДАННЫХ Специальный справочник
Санкт-Петербург Москва • Харьков • Минск 2001
С^ППТЕР
Игорь Гайдышев
Анализ и обработка данных специальный справочник
Главный редактор Заведующий редакцией Руководитель проекта Литературный редактор Художник Корректоры
Верстка
Е. Строганова И. Корнеев А. Пасечник Е. Бочкарева Н. Биржаков И. Смирнова, И. Тимофеева А. Попов
ББК 32.973.233я22
УДК 681.3.01(03)
Гайдышев И.
Г14 Анализ и обработка данных: специальный справочник — СПб: Питер, 2001. — 752 с.: ил.
ISBN 5-318-00220-Х
Здесь вы найдете краткое описание большого количества алгоритмов анализа данных, с которыми приходилось работать авторам, а также известных математических методов, применяющихся в этих алгоритмах. Достаточно полно даны прокомментированные исходные тексты компьютерных программ, реализующих эти алгоритмы.
Книга может оказаться полезной в качестве справочника научным работникам, программистам, инженерам-исследователям, медикам, биологам и другим специалистам, профессионально имеющим дело с обработкой экспериментальной информации.
© И. Гайдышев, 2001
© Издательский дом «Питер», 2001
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как надежные. Тем не менее имея в виду возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственность за возможные ошибки, связанные с использованием книги.
ISBN 5-318-00220-Х
ЗАО «Питер Бук», 196105, Санкт-Петербург, ул. Благодатная, д. 67.
Лицензия ИД № 01940 от 05.06.2000.
Налоговая льгота — общероссийский классификатор продукции ОК 005-93, том 2; 95 3000-книги и брошюры.
Подписано к печати 11.07.01. Формат 60 * 90/16. Усл. п. л. 47. Тираж 5000 экз. Заказ 2002.
Отпечатано с готовых диапозитивов в АООТ «Типография „Правда**».
191119, С.-Петербург. Социалистическая ул., 14.
Краткое содержание
Введение............................................15
От издательства.....................................21
Глава 1. Статистики эмпирического ряда..............22
Глава 2. Проверка гипотез...........................76
Глава 3. Дисперсионный анализ......................175
Глава 4. Теория распределений......................206
Глава 5. Корреляционный анализ.....................268
Глава 6. Методы снижения размерности...............316
Глава 7. Факторный анализ..........................324
Глава 8. Распознавание образов без обучения........356
Глава 9. Распознавание образов с обучением.........390
Глава 10. Многомерное шкалирование.................444
Глава 11. Методы теории информации.................450
Глава 12. Планирование эксперимента................463
Глава 13. Линейная алгебра.........................470
Глава 14. Методы теории множеств ..................562
Глава 15. Аппроксимация зависимостей...............579
Глава 16. Дифференциальное и интегральное исчисления.637
Глава 17. Прочие математические алгоритмы..........655
Глава 18. Реализация программы анализа данных......676
Заключение.........................................713
Литература.........................................721
Приложение. Заголовочный файл......................740
Алфавитный указатель...............................748
Содержание
Введение...........................................15
Предмет......................................... 15
Аудитория....................................... 17
Примеры......................................... 18
Благодарности................................... 19
От издательства....................................21
Глава 1. Статистики эмпирического ряда.............22
Классификация признаков по шкалам измерения......23
Описательная статистика..........................26
Среднее значение, математическое ожидание.....27
Медиана.......................................32
Мода..........................................35
Дисперсия, среднее квадратичное отклонение....36
Среднее отклонение............................42
Средняя разность Джини........................43
Асимметрия....................................44
Эксцесс.......................................45
Коэффициент вариации..........................47
Показатель точности опыта.....................48
Минимум, максимум и размах выборки............50
Моменты распределения.........................51
Вариационная статистика..........................53
Параметры классовых интервалов................54
Группировка...................................56
Функции эмпирического распределения...........61
Ранжирование.....................................67
Проверка случайности выборки из нормальной совокупности.......................72
Репрезентативность выборки .......................73
Дальнейшие исследования и программные ресурсы....74
Глава 2. Проверка гипотез .........................76
Общая методика...................................76
Сравнение методик................................80
Содержание
7
Односторонняя и двусторонняя гипотезы............81
Независимые и сопряженные выборки ...............82
Параметрические тесты............................83
f-критерий Стьюдента..........................83
Критерий Стьюдента для связанных выборок......85
Проблема Беренса—Фишера.......................87
F-критерий Фишера.............................91
G-критерий различий средних...................92
Параметрические множественные сравнения.......93
Непараметрические тесты..........................98
Критерии рандомизации ........................99
Критерии с2..................................122
Х-критерий Ван дер Вардена...................127
Критерий О Розенбаума........................129
Критерий серий Вальда—Вольфовица.............131
Критерий Колмогорова—Смирнова................134
Точный метод Фишера—Ирвина...................140
Критерий знаков..............................141
Критерий медианы.............................143
Непараметрические множественные сравнения.....147
Проверка типа распределения эмпирических данных..151
Простые и сложные гипотезы...................151
Простейшие методы............................151
Критерии согласия............................152
Критерии отклонения распределения от нормальности..............................170
Дальнейшие исследования и программные ресурсы....173
Глава 3. Дисперсионный анализ.................... 175
Однофакторный анализ............................175
Однофакторный дисперсионный анализ...........176
Ранговый однофакторный анализ Краскела—Уоллиса.............................178
Критерий Джонкхиера—Терпстра.................180
/Vf-критерий Бартлетта.......................182
G-критерий Кокрена...........................184
Критерий Шеффе...............................185
Критерий Дункана.............................189
Критерий Тьюки...............................189
Многофакторный анализ...........................190
8
Содержание
Двухфакторный дисперсионный анализ...........191
Ранговый критерий Фридмана...................194
Критерий Пэйджа..............................196
Q-критерий Кокрена...........................198
Критерий Шеффе для связанных выборок.........201
Дальнейшие исследования и программные ресурсы....205
Глава 4. Теория распределений ....................206
Общая методика..................................206
Функции распределения и обратные функции распределения................209
Одномерные распределения........................209
Непрерывные распределения ...................210
Дискретные распределения.....................248
Генерация одномерных распределений...........261
Многомерные распределения.......................263
Многомерное нормальное распределение.........263
Генерация многомерных распределений..........264
Теоретические и эмпирические распределения......265
Дальнейшие исследования и программные ресурсы....266
Глава 5. Корреляционный анализ....................268
Корреляция количественных признаков.............268
Коэффициент корреляционного отношения Пирсона............................269
Коэффициент корреляции Фехнера...............271
Ковариация...................................273
Корреляция порядковых признаков.................274
Показатель ранговой корреляции Спирмэна......275
Коэффициент ранговой корреляции Кендалла.....278
Корреляция номинальных признаков................281
Полихорический коэффициент сопряженности Чупрова........................282
Коэффициент Жаккара..........................284
Простой коэффициент встречаемости ...........285
Показатель подобия Рассела и Рао.............286
Коэффициент сопряженности Бравайса...........287
Коэффициент ассоциации Юла...................288
Хеммингово расстояние........................289
Содержание
9
Корреляция признаков, измеренных в различных шкалах...................290
Коэффициент Гауэра...........................290
Бисериальная корреляция в случае порядковых признаков................294
Бисериальная корреляция в случае номинальных признаков ..............300
Точечно-бисериальная корреляция..............302
Множественные корреляции........................304
Коэффициент множественной корреляции.........304
Канонический корреляционный	анализ...........305
Коэффициент конкордации......................310
Критерии некоррелированности....................312
Коэффициент корреляции.......................312
Показатель ранговой корреляции...............312
Коэффициент ранговой корреляции..............313
Бисериальный коэффициент корреляции..........313
Точечно-бисериальный коэффициент корреляции...313
Коэффициент множественной корреляции.........314
Коэффициент конкордации......................314
Дальнейшие исследования и программные ресурсы....314
Глава 6. Методы снижения размерности .............316
Метод минимизации энтропии......................316
Преобразование Карунена—Лоэва...................320
Сжатие с помощью трехслойной нейронной сети.....322
Дальнейшие исследования.........................323
Глава 7. Факторный анализ.........................324
Метод главных факторов..........................327
Проблема общности............................334
Проблема факторов............................337
Измерение факторов...........................337
Метод максимума правдоподобия...................338
Центроидный метод...............................344
Проблема вращения...............................349
Критерии максимального числа факторов ..........352
Визуализация результатов факторного анализа.....354
Дальнейшие исследования и программные ресурсы....354
10
Содержание
Глава 8. Распознавание образов без обучения.....................................356
Меры различия и меры сходства..................356
Меры различия и информационная статистика...357
Меры сходства...............................359
Кластерный анализ..............................363
Метод ближней связи.........................364
Метод средней связи Кинга...................368
Метод Уорда.................................372
Метод k-средних Мак-Куина...................376
Метод корреляционных плеяд..................381
Вроцлавская таксономия......................383
Визуализация результатов кластерного анализа...386
Дальнейшие исследования и программные ресурсы...388
Глава 9. Распознавание образов с обучением......................................390
Выявление информативных параметров.............392
Метод Байеса...................................393
Линейный дискриминантный анализ Фишера.........396
Канонический дискриминантный анализ............404
Линейный дискриминантный анализ................417
Нейронная сеть прямого распространения.........425
Архитектура нейронной сети..................425
Обучение и распознавание....................430
Дальнейшие исследования и программные ресурсы...439
Глава 10. Многомерное шкалирование...............444
Метрический метод Торгерсона...................444
Дальнейшие исследования........................449
Глава 11. Методы теории информации...............450
Информация по Шеннону..........................450
Информация по Бриллюэну........................454
Избыточность...................................456
Разведочный информационный анализ...........456
Эквивокация.................................457
Организация системы............................457
Содержание
11
Дивергенция, информационные меры................458
Мера Кульбака................................458
Мера Махаланобиса............................460
Информационная статистика.......................461
Дальнейшие исследования.........................462
Глава 12. Планирование эксперимента...............463
Полный ортогональный план.......................463
Дробная реплика полного плана...................465
Дальнейшие исследования и программные ресурсы...469
Глава 13. Линейная алгебра........................470
Представление массивов..........................470
Векторные и матричные операции..................472
Векторные операции...........................472
Матричные операции...........................476
Единичная матрица............................486
Транспонированная матрица....................487
Векторные и матричные нормы .................488
Определитель матрицы.........................491
След матрицы.................................493
Обратная матрица.............................495
Псевдообратная матрица.......................500
Критерии положительной определенности и полуопределенности ........................502
Обусловленность матрицы......................506
Методы факторизации и приведения матриц.........509
Разложение Краута А = LU.....................509
Разложение Холецкого А = LLT.................513
Разложение по сингулярным числам.............515
Разложение А = QR, ортогонализация Грама—Шмидта . 520
Методы приведения к форме Хессенберга........526
Вычисление собственных значений и собственных векторов..........................534
Локализация собственных значений.............538
Стандартная проблема собственных значений....539
Обобщенная проблема собственных значений.....547
Линейные алгебраические уравнения...............549
Метод исключения Гаусса......................549
Итерационные методы .........................553
12
Содержание
Решение неопределенных систем................558
Дальнейшие исследования и программные ресурсы....560
Глава 14. Методы теории множеств..................562
Основные операции...............................562
Функции упорядочивания множеств.................564
Функции определения экстремума..................571
Метрики.........................................575
Метрика Минковского..........................576
Евклидова метрика............................576
Манхеттенское расстояние.....................577
Метрика доминирования, супремум-норма........578
Дальнейшие исследования.........................578
Глава 15. Аппроксимация зависимостей .............579
Математическое моделирование и регрессионный анализ..........................579
Общая методика..................................583
Полиномиальная аппроксимация....................585
Полином......................................585
Обращенный полином...........................588
Интерполяционный полином Лагранжа............591
Экспоненциально-степенная аппроксимация.........593
Экспоненциальная и показательная функции.....593
Степенная функция ...........................595
Гипербола....................................597
Экспоненциально-степенная функция............598
Логарифмическая функция.........................599
Гармонический анализ: тригонометрический многочлен Фурье..............601
Логистический анализ............................603
Функция Гомпертца...............................606
Нелинейная функция общего вида..................608
Симплексный метод Нелдера—Мида...............608
Метод сопряженных градиентов Флетчера—Ривса...614
Метод касательных Ньютона—Рафсона............618
Метод переменной метрики.....................621
Нейронная сеть прямого распространения..........626
Линейный множественный регрессионный анализ.....629
Дальнейшие исследования и программные ресурсы....635
Содержание
13
Глава 16. Дифференциальное и интегральное исчисления.........................637
Методы численного дифференцирования.............637
Первая производная...........................637
Матрица первых производных...................640
Матрица вторых производных...................646
Методы численного интегрирования................650
Формула прямоугольников......................651
Формула трапеций.............................651
Формула Симпсона.............................652
Ошибки разностных схем..........................653
Дальнейшие исследования.........................654
Глава 17. Прочие математические алгоритмы..........................655
Комбинаторика ..................................655
Число перестановок...........................655
Число сочетаний..............................656
Число благоприятных исходов..................657
Специальные функции.............................659
Г-функция Эйлера.............................659
В-функция Эйлера.............................664
Различные функции...............................665
Параметры вычислительной системы................673
Дальнейшие исследования.........................675
Глава 18. Реализация программы анализа данных ...................................676
Средства разработки приложений..................677
Выбор технологии программирования............677
Программные ресурсы..........................679
Программа анализа данных........................681
Разработка программы для MS-DOS..............684
Пример консольного приложения для Windows....686
Проектирование оконного приложения...........688
Модули анализа...............................692
Статистический анализ в браузере.............702
Тестирование программ...........................707
14
Содержание
Программная совместимость.....................709
Дальнейшие исследования.......................711
Заключение .....................................713
Программы медико-биологической статистики.....716
Терминология..................................717
Полнота и воспроизводимость...................718
Структуризация и компактность.................719
Точная адресация..............................719
Литература .....................................721
Книги и публикации............................721
Электронные источники.........................736
Системные программы и средства разработки .736
Демонстрационные версии программ анализа данных на CD.......................737
Виртуальные ресурсы Сети ..................738
Приложение. Заголовочный файл...................740
Алфавитный указатель............................748
Введение
Предмет
Существует множество наименований рассматриваемого предмета. С возникновением новых методик анализа общепринятые определения уже не могут обобщенно его назвать, поэтому термин «анализ данных», понимаемый в широком смысле, оказывается наиболее уместным [111, с. 7]. Под методами анализа данных в настоящее время понимают совокупность как традиционных статистических приемов обработки информации, так и методов, развитых в последние годы и на вероятностных идеях не основанных [76, с. 6]. Однако в любом случае мы не занимаемся отвлеченными от практики мысленными построениями — нас интересует немедленный практический результат. По словам известного организатора науки, «данные науки всегда проверялись практикой, опытом. Наука, порвавшая связи с практикой, с опытом, — какая же это наука?... Наука потому и называется наукой, что она не признает фетишей, не боится поднять руку на отживающее, старое и чутко прислушивается к голосу опыта, практики»1.
Методы анализа данных применялись нами как при обработке результатов научно-технических экспериментов, так и в медико-биологических исследованиях. Статистические методы, рассмотренные в главах 1, 2 и 3 настоящего издания, применялись в основном при обработке медико-биологических данных. Это вызвано тем, что технические системы дают гораздо больше шансов для построения подробной и физически обоснованной математической модели по сравнению с медико-биологическими системами. Если какой-либо технический процесс показывает нестабильность в эксперименте, стараются локализовать причину этой нестабильности с максимально возможной точностью — неконтролируемые изменения обычно очень малы [24, с. 9]. Иначе обстоит дело с медико-биологическими системами. Полной воспроизводимости и стабильности при их экспериментальном исследовании добиться трудно. Интересующий исследователя исход опыта в таких задачах зависит от столь большого числа факторов, что применение методов исследования, принятых
Сталин И. В. Речь на первом всесоюзном совещании стахановцев, 17 ноября 1935 г. // Вопросы ленинизма,— М.: ОГИЗ, 1939.— 502 с.
16
Введение
в технических науках, себя не оправдывает [44, с. 13]. Статистические методы на сегодняшний день являются для таких систем почти единственным способом количественного описания явлений и объектов. Стремлением удовлетворить потребности обработки полярных по сути экспериментов объясняется номенклатура методов исследования и представленного программного обеспечения. В книге совершенно не рассмотрены методы непосредственного получения экспериментальных данных. Предполагается, что данные для математической обработки уже получены и искажены ошибками различных типов [133], [135, с. 388]. Таким образом, любые исходные данные для анализа представляют собой не какие-либо физические или иные характеристики изучаемого объекта или явления, а характеристики объекта или явления в совокупности с измерительным устройством. Далее мы не будем касаться этой проблемы, подробно изучаемой в курсе типа «Экспериментальные методы исследований» и в многочисленных источниках, сосредоточившись только на обработке уже полученных данных, кроме самих данных, возможно, требуя лишь незначительной дополнительной информации об объекте исследования.
Наша книга посвящена краткому описанию алгоритмов анализа данных, с которыми нам приходилось работать, а также известных математических методов, которые в этих алгоритмах применялись. Достаточно полно даны прокомментированные исходные тексты компьютерных программ, необходимых для проведения расчета. В главе 18 рассмотрено несколько стратегических подходов к составлению программ анализа данных.
После написания основного объема книги знакомство с [8] вызвало у нас удивление близостью подходов к решению проблемы и дополнительно убедило в необходимости подобного издания на русском языке. Однако в указанном источнике рассмотрен численный анализ и дана одна глава с примерами приложения этого анализа к статистике. У нас же упор сделан на прикладной анализ и получение практических результатов, а численные методы описаны в той мере, в которой это необходимо для проведения такого анализа. Влияние на идею нашей книги оказали также руководства и информационные материалы по зарубежным пакетам прикладных программ IMSL1, SSP2 [174], [175], отечественным пакетам [114], [156] и классический труд [189].
1 Поставляется Visual Numerics, Inc. (w3vw.vni.c0m)
2 Scientific Subroutine Package. Сейчас ESSL, разработка IBM Corp, (www.ibm.com)
Аудитория
17
Аудитория
Для чтения данной книги, практического применения описанных в ней алгоритмов и работы с программами требуются небольшие, но твердые познания в математике и программировании в объеме курса втуза. Возможно, адресуя книгу в числе других категорий читателей программистам и исследователям, мы слишком много внимания уделяем элементарным методам. Это вызвано тем, что курс теории вероятностей и математической статистики не дает практических навыков обработки реальных экспериментальных данных, поэтому наличия таких навыков у читателя мы не предполагаем, однако общая подготовка дает прочную платформу для изучения данных разделов самостоятельно. Книга может оказаться полезной в качестве Справочника научным работникам, программистам, инженерам-исследователям, медикам, биологам и другим специалистам, профессионально имеющим дело с обработкой экспериментальной информации. Представленный материал прост, но все-таки книга не «... для читателя, не имеющего ровно никаких познаний в даннОхМ вопросе»1.
Некоторые авторы полагают, что в недалеком будущем эффективность научного программирования на несколько порядков возрастет благодаря использованию отлаженных готовых компонентов [9], [10]. При этом почему-то не предполагается знание программистами предмета, с которым они собираются работать. Хорошо, когда программный продукт создается командой профессионалов, в состав которой наряду с программистами входят математики, менеджеры и т. д., но с другой стороны, мы становимся свидетелями того, что программирование вполне осваивают инженеры, медики, биологи, экономисты. Нам встречалось много предметных специалистов, для которых программирование стало если не второй специальностью, то по крайней мере хобби. Взгляд на анализ данных не со ставшей уже привычной в компьютерной литературе точки зрения пользователя готовых программных продуктов [78], [187], а, наоборот, изнутри, с точки зрения математика-программиста, поможет инженерам, медикам, экономистам разобраться с тем, что они могут на сегодняшний день получить от методик анализа данных, а программистам — понять, что от них требуется. К тому же упомянутые в начале абзаца безошибочные программные компонен
1 Восленский М. С. Номенклатура. Господствующий класс Советского Союза. - М.: Сов. Россия: Октябрь, 1991.— С. 394.
18
Введение
ты перед их эффективным применением кто-то должен сначала разработать. О командной и авторской разработке см. также [106, с. 279].
Примеры
Описания почти всех методов расчета проиллюстрированы примером вызова функции в составе законченной программы с диагностическими и информационными сообщениями на русском или английском языке или в составе фрагмента программы, если примеры вызовов методов сходного назначения уже даны в той же самой главе, поэтому сделать полезную программу для другого метода не составит труда вследствие сходного интерфейса программных реализаций этих методов. Для программ статистических обязательно даны или указаны вызовы методов, реализующих вычисление критического значения критериальной статистики или ее аппроксимации. Иногда пример программного решения не приводится, а дается описание алгоритма и ссылки на подробные источники — часто вербальное описание идеи метода много важнее страниц формул. Например, для базовой реализации метода ^-средних (глава 8) оказалось достаточно трех строчек текста в первоисточнике.
Ссылки даны и в исходных текстах составленных нами функций на языках программирования С, C++ и JavaScript, которые, как правило, имеют имена создателей реализованных в этих функциях методов расчета. Перефразируя Урсулу Ле Гуин1, вы получите полный контроль над каким-либо объектом, вещью, существом, только назвав его «подлинным именем». К тому же поиск алгоритмов и их авторов в глобальной компьютерной сети Интернет наиболее эффективен по именам разработчиков.
Словами Пример применения отмечено начало листинга с примером вызова функции. Это — некоторый фрагмент или полный текст тестовой программы, реализующий вызов метода и отображающий примерные диагностические сообщения.
Словами Исходные коды отмечено начало листинга исходного текста функции, реализующей описанный метод. Это тот текст, который должен быть обязательной составной частью вашей программы, реализующей нужный для ваших расчетов метод. Описание рабочих переменных в примерах, выделение необходимой памяти для
1 Миры Урсулы Ле Гуин. Волшебник земноморья. - Рига: Полярис, 1997. - 383 с.
Благодарности
19
массивов и классов и ее корректное возвращение системе, а также ввод и вывод данных, являются заботой и делом вкуса программиста, поэтому данному вопросу для экономии места внимания мы уделяем непозволительно мало.
Словами Исходные коды и пример применения обозначено начало листинга исходного текста законченной программы, возможно, за исключением некоторых стандартных методов. Для построения исполняемого модуля потребуется включение в проект всех вызываемых функций либо в виде исходного текста, либо в виде объектных пли библиотечных модулей, либо в виде динамических библиотек, в зависимости от аппаратно-программной платформы и от привычки программиста. Кроме реализации определенного метода, в расчетах обычно участвует несколько вспомогательных стандартных функций, применяющихся, кроме описываемого, и в других алгоритмах. Поэтому все универсальные «многоцелевые» функции помещены в общие разделы. Для удобства работы в конце книги дан алфавитный указатель функций, что позволяет быстро найти код необходимой процедуры для включения ее в проект.
Благодарности
Автор искренне благодарит:
•	чл.-корр. РАМН, д. м. н. профессора В. И. Шевцова за оказанную всестороннюю поддержку,
•	профессора Г. Голуб за предостережения, высказанные при обсуждении проблемы разложения матриц по сингулярным числам, критическую оценку предложенного метода и предоставленные печатные источники,
•	д. м. н. К. С. Десятниченко за плодотворное творческое содружество, ряд ценных идей и внимание к новинкам в методах анализа данных,
•	д. м. н. М. М. Щудло за формулировку основных потребностей в методиках математико-статистического анализа данных, полученных в экспериментальных и клинических медицинских исследованиях ортопедо-травматологического профиля,
•	к. ф.-м. н. А. П. Кулаичева за пояснения к применению критериев согласия и введение в методики анализа сигналов,
•	А. Е.-Х. Югай за полезные замечания, позволившие уточнить и расширить положения глав 1,2 и 3 книги и сделавшие ее понятнее
20
Введение
категориям читателей, для которых книга изначально не была предназначена, что дало нам возможность значительно расширить потенциальную аудиторию,
•	Е. А. Помазова за помощь в работе над главой 18.
Особая благодарность В. А. Уткину за дружеские советы, внимательное чтение рукописи и рекомендации. Возможно, книга была бы гораздо лучше, если бы все рекомендации были нами приняты, поэтому ответственность за все ошибки и недочеты лежит только на авторе.
От издательства
Ваши замечания, предложения, вопросы отправляйте по адресу электронной почты comp@piter.com (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
Подробную информацию о наших книгах вы найдете на web-сайте издательства http://www. piter.com.
Глава 1. Статистики эмпирического ряда
Статистикой называют функцию, зависящую лишь от результатов наблюдений, поэтому любой вычисленный по эмпирическим данным показатель можно называть статистикой [37, с. 102].
В описаниях методов приняты традиционные для статистической науки понятия эмпирического ряда, выборки или совокупности, обозначающие одну и ту же сущность. Выборкой называют [187, с. 38] последовательность независимых одинаково распределенных случайных величин. Элементы выборки называются вариантами. В исходных текстах программ приняты понятия вектора1 или массива, характерные для линейной алгебры и для программирования соответственно. Если исследуемая совокупность представляет собой многомерную выборку, иначе набор векторов показателей (признаков, переменных), говорят о многомерном анализе данных [78, с. 146].
Совокупности состоят из отдельных элементов (объектов), которые объединены общностью некоторых свойств (признаков, переменных). Количество элементов совокупности можно называть по-разному. Так, если речь идет о выборке, количество ее элементов может называться численностью, величиной или размером. Если речь идет о векторе (одномерном массиве), говорят о размере (длине) вектора или размерности массива. Однако в многомерном анализе под размерностью часто понимают число измерений (векторов) показателей [135, с. 514]. Математически строгое определение размерности дано в [183, с. 84]. Исходя из всего сказанного, мы будем использовать определение численности в приложении к выборке, определение размера или длины в приложении к вектору, а определение размерности будет использовано там, где говорится о многомерных сущностях (матрицы, многомерные выборки и т. д.). В программировании под размером массива понимают как количество элементов массива, так и размер массива в байтах, в зависимости от контекста.
В случаях, не оговоренных отдельно, под вектором всегда понимается вектор-столбец.
Классификация признаков по шкалам измерения
23
Чаще всего приходится работать с некоторой частью совокупности, являющейся выборкой из полной исходной совокупности. В связи с этим различают генеральную совокупность, включающую в себя все объекты данного рода, и выборочную совокупность. Под выборочной совокупностью понимается совокупность, специальным (случайным) образом отобранная из генеральной совокупности и отражающая основные статистические свойства последней.
Классификация признаков по шкалам измерения
Пользователю, начинающему работать с методами анализа данных, полезно ознакомиться с классификацией признаков по типам. В этом случае говорят о шкале измерения [78, с. 146], [172, с. 34, 67, 108], [191, с. 271]. В источниках приняты различные принципы классификации признаков по шкалам измерений. Классификация в зависимости от числа допустимых арифметических операций над признаками, измеренными в данных шкалах, включает [187, с. 285]: • Номинальные признаки (признаки с неупорядоченными состояниями, классификационные признаки), например: велосипед, мотоцикл, автомобиль. Номинальные признаки Moiyr быть оцифрованы — 0,1,2, однако смысла эти цифры, за исключением возможности различать признаки между собой, не имеют. Частным случаем номинальных признаков являются бинарные (качественные, дихотомические) признаки, представляющие собой номинальные признаки с двумя градациями, например: «нет» — 0, «да» — 1. Мы рекомендуем для бинарных признаков использовать оцифровку типа 0 и 1, а не какую-либо иную (например, -1 и +1), так как только эти две цифры предполагается использовать в методах анализа бинарных признаков, в том числе и в запрограммированных нами алгоритмах.
• Порядковые признаки (признаки с упорядоченными состояниями, ординальные признаки), например: отлично, хорошо, удовлетворительно, плохо. Порядок состояний имеет смысл, признаки могут быть осмысленно оцифрованы (в данном примере: 5, 4, 3, 2) и могут сравниваться между собой, однако расстояния между ними не определены. Как и предыдущие, подобного типа признаки часто используются в задачах диагностики, в том числе медицинской.
24
Глава 1. Статистики эмпирического ряда
• Количественные (численные, вариационные) признаки, иногда подразделяемые на интервальные и относительные, различающиеся положением нулевой отметки на шкале измерения. Например, год рождения — относительный количественный признак, а срок службы в рядах вооруженных сил — интервальный количественный признак. Если в первом примере определены только операции различения, сравнения и вычитания, то во втором к ним добавляются операции сложения и отношения. Численные признаки определяют измеряемые или исчислимые количества (величины) и являются истинными количественными, причем могут измеряться как непрерывные, так и целочисленные признаки.
Выяснить, к какой шкале принадлежит измеряемый в эксперименте признак, поможет табл. 1.1.
Таблица 1.1. Действия над признаками, измеренными в различных шкалах
Шкала измерения	Допустимые действия	Пример применения
Номинальная	Различение	Наличие или отсутствие симптома
Порядковая	Различение, сравнение	Школьная оценка
Количественная	Различение, сравнение, сложение и/или вычитание, умножение и/или деление (отношение)	Температура, масса, время, длина
В таблице речь идет о применении того или иного математического действия (операции) по отношению к полученному в эксперименте признаку. Само собой разумеется, что могут быть проделаны допустимые действия над разными признаками, принадлежащими одной шкале. Можно также представить себе действия, совершенные над признаками, измеренными в разных шкалах, но данное исследование не является сейчас предметом нашего рассмотрения — мы говорим о первичных параметрах, являющихся результатами измерений, а не математических вычислений (вычисления, впрочем, могут быть выполнены экспериментальной аппаратурой).
Шкалы могут приводиться одна к другой: количественная шкала — к порядковой или номинальной, порядковая шкала — к номинальной. Обратные операции считаются некорректными. Приведение од
Классификация признаков по шкалам измерения
25
ной шкалы к другой обычно называют понижением шкалы. Приведение признаков к шкале, отличной от тех, в которых первоначально признаки были измерены, необходимо при анализе групп признаков, измеренных в разных шкалах [187, с. 308].
Понижение шкалы ведет к потере некоторой части информации об изучаемых признаках. Описанная в одноименном разделе настоящей главы процедура присвоения рангов количественным признакам фактически означает приведение количественной шкалы к порядковой. Вообще, любой алгоритм классификации исходных данных по группам приводит их к порядковой или номинальной шкале, причем переменные могут и не выражаться в терминах какой-либо числовой переменной [91, с. 719]. В этом случае авторы говорят о качественных, категоризированных [там же], описательных [89, с. 23] или атрибутивных [ 111, с. 20] признаках, имея в виду либо совокупность номинальной и порядковой шкал, либо только порядковую шкалу. С подробной классификацией признаков по шкалам измерения можно ознакомиться на сайте «Высокие статистические технологии» (www.antorlov.nm.ru). См. также [184, с. 19].
Рассмотренная классификация признаков по шкалам измерений не исчерпывает всех мыслимых типов классификаций. Так, для применения статистических методов, оперирующих частотами распределений, более существенной может оказаться классификация по такому критерию, как непрерывность теоретической функции эмпирического распределения. Для других методов определяющим является решение вопроса о том, какому теоретическому типу распределения соответствует эмпирическое распределение либо, в более узком смысле, является ли распределение нормальным. Если же различать условия исследования того или иного явления, признаки могут подразделяться на факториальные признаки (причина) и результативные признаки (следствие) [89, с. 23].
«Успех применения любого метода зависит от того, насколько хорошо анализируемые данные соответствуют основным предположениям, принятым при разработке статистического метода» [186, с. 299]. Методы анализа, разработанные для определенного типа признаков, могут привести к совершенно неверным выводам при их применении к признакам другого типа, поэтому нужно быть особенно внимательным при выборе метода, адекватного анализируемым данным. Тип исходных данных определяет, какими методами эти данные могут быть обработаны. «Формулы ... нельзя применять слепо и автоматически, без рассмотрения вопроса об их пригодности
26
Глава 1. Статистики эмпирического ряда
в каждом данном случае» [24, с. 8]. Так, при оценке различий дихотомических выборок (например, числа осложнений при использовании различных методов лечения) можно использовать непараметрический критерий Z2 в специальной форме, можно применять точный метод Фишера (если число переменных равно двум), но ни в коем случае нельзя использовать ряд других методов проверки гипотез, предназначенных для порядковых и количественных признаков. Хотя при формальном применении методик расчета и компьютерных программ какие-то цифры получены будут, содержательно интерпретировать их будет нельзя. Некоторые из качественных фирменных программных продуктов анализа данных имеют в своем составе специальные компоненты — мастера, волшебники или навигаторы, — облегчающие пользователям выбор нужного метода расчета в зависимости от типа представленных для анализа данных.
Описательная статистика
Описательная статистика — это традиционный набор основных статистических показателей эмпирической выборки. Мы будем рассматривать выборочные (эмпирические) статистические характеристики, то есть характеристики, рассчитанные по выборке, в противоположность статистическим характеристикам генеральной совокупности.
Статистические выводы могут быть затруднены из-за неоднородности данных. Поэтому для исключения влияния некоторых факторов производится стандартизация коэффициентов. Популярное в отечественной медико-биологической литературе использование стандартных ошибок статистических показателей, строго говоря, правомерно только в том случае, когда распределение статистик стремится к нормальному распределению [92, с. 325]. Для распределений других типов формулы вычисления ошибок будут иными, а примеры некоторых из таких формул даны в [24, с. 40]. Практически это означает, что тест на нормальность распределения, или, в общем случае, контроль типа распределения, — это первое, что нужно сделать с экспериментальными данными, анализируемыми статистическими методами. Расчет ошибок статистических показателей, выполненный без контроля типа распределения, не является правомерным, но это повсеместно распространенная ошибка, снижающая качество выводов. Стандартизации медицинских показателей посвящен раздел [89, с. 57]. Полезно сравнить стандартизацию с часто
Описательная статистика
27
применяемой в технических науках (теория упругости, аэродинамика) процедурой обезразмеривания.
Для введения в рассматриваемые вопросы можно ознакомиться с одним из многочисленных источников, например [44], [54], [143], [173]. Описательная статистика в стандартных компьютерных программах рассмотрена в [17], [34], [131], [187]. Решение на языке программирования Бейсик дано в [184, с. 96].
Среднее значение, математическое ожидание
Из рассмотренных статистических показателей среднее значение, медиана и мода характеризуют центр статистического распределения, являясь мерами положения. Выборочное среднее значение, оно же математическое ожидание (expected value, expectation) [63, с. 31], арифметическое среднее (mean), средняя арифметическая простая [89, с. 78], — наиболее часто применяемая характеристика центра распределения случайной величины. Математическое ожидание можно рассматривать как центр тяжести распределения. Распространено обозначение среднего значения как а, если имеется в виду известное (истинное, а не вычисленное по эмпирической выборке) среднее совокупности. Эмпирическое (выборочное, вычисленное по эмпирической выборке) среднее (sample mean) чаще всего обозначают как х или Ц. В теоретических выкладках математическое ожидание обозначают через Е (в иностранных источниках) или через М (в источниках отечественных). При этом символы Е и Л/ можно рассматривать и практически применять как нелинейные операторы [135, с. 431], причем в формулах эти операторы могут действовать не только на скалярные случайные величины, но и на другие производные от них величины, например разности случайных величин, квадраты случайных величин и т. д. Поэтому математическое ожидание является более широким понятием, чем среднее значение. Среднее значение случайной величины, измеренной в количественной шкале, определяется выражениями [158, с. 85]:
для дискретной случайной величины так же, как
i=0
где х — значения, принимаемые случайной величиной с вероятностями р., для непрерывной случайной величины, распределенной в диапазоне ]-оо;+оо[,
28
Глава 1. Статистики эмпирического ряда
Д = J xf(x)(\x,
где f(x) — плотность распределения вероятностей случайной величины х.
Выборочное среднее значение и его ошибка вычисляются, соответственно, как [84, с. 39]
х-
где х, г = 1,2,..., п, — значения результатов наблюдений (значения вариант выборки),
п — численность выборки, сг— выборочное среднее квадратичное отклонение (см. ниже).
В случае, если исходные данные представлены в виде частот распределения случайной величины по интервалам, формулу вычисления среднего следует заменить на следующую [187, с. 46]:
где bit i =1,2,..., k, — середины интервалов (классовых интервалов, введенных в разделе «Вариационная статистика»),
vi, i =1,2,..., kt — эмпирические частоты, k — число классовых интервалов.
Свойства математического ожидания подробно рассмотрены [37, с. 50]. См. также [100, с. ИЗ], [155, с. 20]. Представлен пример вычисления и возможные ошибки проанализированы в [231, с. 387]. Решение на языке программирования JavaScript (без вычисления ошибки) приводится в [36, с. 158], упражнение на Fortran 77 см. в [162, с. 98], на языке Бейсик см. в [184, с. 42].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
^include <math.h>
#include "megastat.h"
void main (void)
Описательная статистика
29
int n = 14;
double a[] = {65.67.69.70,71,72.72,73,73,78.81,85.86.87}. sm. // Среднее mm; // Ошибка среднего
SampleMean (a.n.&sm.&mm);
cout « "Sample mean = " « sm « endl
« "Error = " « mm « endl:
void SampleMean (double *a,int n,double *sm.double *mm)
// Функция вычисляет параметры среднего значения эмпирического // ряда.
// Обозначения:
// а - исходная выборка.
// п - численность выборки.
// *sm - среднее,
// *mm - ошибка среднего.
// Возвращаемое значение:
// нет.
И {
*sm = VectorSum (a.n) I n;
*mm = sqrt (Cov (a.a.n) / n): }
Другие виды средних также находят применение в анализе данных [80, с. 76], [84, с. 17]. Средняя гармоническая величина (гармоническое среднее) определяется по формуле
Геометрическое среднее (среднее пропорциональное) определяется по формуле [135, с. 143]

Иногда применяется степенное среднее [там же, с. 558] /1А „
s«=\'rEx.“ - в>0>
30
Глава 1. Статистики эмпирического ряда
частными случаями которого являются другие виды средних, введенные выше и имеющие общее название — степенные средние. Степенные средние являются, в свою очередь, частными случаями взвешенных степенных средних, общая формула которых по аналогии с предыдущей формулой имеет вид [там же]
где i =1,2,..., п, — весовые коэффициенты.
Для рассмотренных средних величин имеет место неравенство [135, с.411]
h<g<х<s•
Общепринятая в медицинских и биологических работах запись М ±т означает среднее значение и ошибку среднего [24, с. 38], [117, с. 57]. Такая запись вполне информативна, характеризует как центр распределения, так и разброс данных, но она не позволяет судить, в каких интервалах следует ожидать появление случайной величины в опыте на заданном доверительном уровне — именно эти цифры часто интересуют исследователя, а также к каким ошибкам может привести замена параметра (например, истинного среднего) его оценкой, вычисленной по выборке [155, с. 32].
Поэтому будет лучше дополнительно вычислить границы доверительного интервала для среднего [1], [206, с. 94], включающие нижний и верхний пределы и означающие нахождение истинного среднего Д в интервале с вычисленными границами на выбранном стандартном доверительном уровне р (его следует задать из стандартной линейки, например: 0,90; 0,95; 0,99; 0,999). Доверительный интервал для истинного среднего Д в случае двусторонней гипотезы вычисляется по формуле [140, с. 127]
де х-Г
и-1,р	/	>
у/п
те tn_t р — значение обратной функции ^-распределения, р — стандартное значение доверительного уровня (доверительная вероятность, надежность оценки).
31
Описательная статистика
Формула дает доверительный интервал для неизвестного математического ожидания при неизвестной дисперсии в предположении нормальности распределения [37, с. 122].
Для односторонней гипотезы, в зависимости от ее формулировки, вместо левой или правой границы интервала в показанной формуле будет фигурировать -оо или +оо, а значение обратной функции t-распределения будет взято для одностороннего значения:

д2е
Х ^-Цр+1)/2 ^; +
Вычисление доверительного интервала среднего значения иллюстрирует показанный ниже пример. По поводу фактических параметров вызываемого из функции Confidencelnterval метода InverseTDistri-bution см. подробные пояснения в начале главы 4.
См. также [24, с. 39], [111, с. 108], [206, с. 94].
Исходные коды и пример применения
#include <fstream.h>
#include <math.h>
#include "megastat.h"
void main (void) {
int n = 9;
double m = s = P = d:
10.
2.
0.95.
// Среднее
// Среднее квадратичное отклонение
// Доверительный уровень
// Параметр доверительного интервала
d = Confidencelnterval (n.s.p.l);
cout « "One side:\n"
<< "Confidence interval 1 is [-infinity:" « (m + d)
<< "]\n"
« "Confidence interval 2 is [" « (m - d)
« ":+infinity]\n":
d = Confidencelnterval (n.s.p.2);
cout « "Two side:\n"
« "Confidence interval is [" « (m - d) « ":" « (m + d) « "]\n":
}
32
Глава 1. Статистики эмпирического ряда
double Confidencelnterval (int n.double s.double p.int Side) 11
II Функция вычисления доверительного интервала для среднего.
// Обозначения:
//	п - численность выборки,
// s - выборочное среднее квадратичное отклонение.
//	р - стандартный доверительный уровень,
// Side = 1 для односторонней гипотезы.
//	=2 для двусторонней гипотезы.
// Возвращаемое значение:
// параметр доверительного интервала.
И
{
if (Side == 1)
return InverseTDistribution (n - l.p) * s / sqrt (n): el se
return InverseTDistribution (n - l,(p + 1) / 2)*s / sqrt (n); }
Выше мы рассмотрели вычисления для случайной величины, измеренной в количественной шкале. Теперь пусть М членов совокупности размером N обладают некоторым качественным признаком (значение 1), а остальные (Лг - М) этим признаком не обладают (значение 0). Показано [52, с. 124], что среднее значение такой совокупности совпадает с долей членов совокупности, обладающих признаком, то есть
д = М/N = р.
Медиана
Выборочная медиана (median) — числовая характеристика непрерывно распределенной случайной величины, определяемая условием, что случайная величина с вероятностью 0,5 принимает значения как большие, так и меньшие медианы. Медиана разделяет выборку на две равные по числу вариант части [84, с. 38]. В случае непрерывного распределения [158, с. 87] медианой называется значение т такое, что
J/(x)dr = J/(r)dr = |.
т
Для дискретного распределения медианой условились считать такое целое число т, что [там же]
Описательная статистика
33
m-l	I tn	4
i=0	z i=0	z
Таким образом, выборочная медиана является решением уравнения
W= 1/2,
где Fn(x) — эмпирическая функция эмпирического распределения случайной величины1.
Для интервального вариационного ряда2 выборочная медиана определяется как варианта, имеющая порядковый номер (и + 1)/2 для нечетного п при нумерации с 1. Для четного п порядковый номер медианной варианты не определяется, а медиана равна среднему арифметическому двух средних вариант [135, с. 559], [187, с. 42]:
X(m),n = 2m + 1,
2L	(w)J’	’
где Х(т) — элементы вариационного ряда, п — численность вариационного ряда.
В [100, с. 180] имеется другое определение медианы для четного п. Там считается, что для четного п медиан две, и собственно медианой называется меньшая из двух. В [там же, с. 188] вводится понятие взвешенной медианы.
Ошибка медианы вычисляется как [50, с. 31]
Обсуждение см. [28, вып.2, с. 136], [84, с. 39], [89, с. 90], [229, с. 63]. Доверительные границы для медианы вычислены в [120, с. 46].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
^include <math.h>
#include "megastat.h"
1 Об эмпирических распределениях см. ниже.
2 Определение вариационного ряда см. ниже.
2-2002
34
Глава 1. Статистики эмпирического ряда
void main (void)
{
int n = 14:	// Численность выборки
double a[] = // Исходная выборка
{65,67,69,70,71.72,72.73,73.78.81.85.86.87}.
m,	// Медиана
rm:	// Ошибка медианы
Median (а.n,&m.&rm):
cout « "Median = " « m « endl « "Error = " « rm « endl:
}
int Median (double *a.int n,double *m,double *rm)
//
// Функция вычисляет параметры медианы.
// Обозначения:
//	а	-	исходная выборка.
//	п	-	численность выборки.
//	*т	-	медиана.
//	*гт	-	ошибка медианы.
// Возвращаемое значение:
//	0 при нормальном окончании расчета,
// -1 при недостатке памяти.
//
{
int *inf; // Фиктивный параметр
double *data: // Ранжированный ряд
if ((data = new doublefn]) == 0) return -1;
ArrayloArray (a.data.n);
SortArrayllp (data,n,inf,0):
if (’.Parity (n))
*	m = data[n / 2];
el se
*	m = (data[n / 2 - 1] + data[n / 2]) / 2;
*	rm = sqrt (Cov (a,a.n) * M PI / 2 / n):
delete [] data;
return 0;
}
Иначе медиана определяется как 50%-процентиль, так как она делит распределение пополам. Напомним, что 25%-процентиль
Описательная статистика
35
и 75%-процентиль отсекают от распределения по четверти соответственно слева и справа [52, с. 35].
Мода
Мода — числовая характеристика распределения случайной величины — точка максимума эмпирической функции распределения [84, с. 41]. Число классовых интервалов можно определить, например, по правилу Стержесса (правила и рекомендации по выбору числа классовых интервалов даны ниже). Разнесение частот по классам можно выполнить вручную или автоматически, используя предлагаемую нами функцию Allocate, после чего производятся вычисления, как показано в примере.
Обсуждение см. также в [89, с. 91].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include "megastat.h"
void main (void) {
int k = 7;
double b[] = {50.55.65,70.75.80.85}.
f[] = {67.71.78.85,90,86.83};
cout « "Mode = “ « Mode (b,f,k) « endl }
double Mode (double *b.double *f,int k)
//
// Функция вычисляет ноду.
// Обозначения:
// b - массив середин классовых интервалов.
// f - массив частот распределения,
// к - число классовых интервалов.
// Возвращаемое значение:
// значение моды.
//
{
int number; // Номер интервала максимальной частоты
MaximumOf (f,k.&number):
return b[numberj;
}
36
Глава 1. Статистики эмпирического ряда
Дисперсия, среднее квадратичное отклонение
Дисперсия (вариация, варианса, variance) характеризует степень отклонения вариант данной совокупности от среднего в абсолютных числах, иначе меру разброса (рассеяния) распределения относительно среднего значения [63, с. 31]. Дисперсия в разных источниках может обозначаться как ст2, Var(x), V. В теоретических исследованиях больше распространено обозначение D. При этом символ D можно рассматривать как нелинейный оператор, который может применяться как к случайным величинам, так и к их комбинациям и функциям случайных величин, в противоположность тому, что в данном разделе имеется в виду дисперсия среднего арифметического. Обобщение же понятия дисперсии на другие статистические показатели, например медиану, рассмотрены в [229, с. 50].
Для признака, измеренного в количественной шкале, дисперсия определяется формулами [158, с. 85]:
для дискретного случая
° =2JxiPi- Д > i=0
для непрерывного случая
<т2 = J x2f(x)dx-ii2.
Если среднее значение совокупности известно, оценка дисперсии совокупности вычисляется по формуле [32, с. 43]
п i=l
где а — известное среднее значение совокупности.
Хотя для больших выборок это несущественно, будет неверным пользоваться данной формулой, если оценка среднего значения совокупности производится также по выборке. Следуя [187, с. 149], обозначим:
£ — случайная величина,
хр х2,..., хп — ее реализации,
Описательная статистика
37
— дисперсия совокупности, х — среднее значение, вычисленное по выборке. Согласно определению и с учетом
9	1
М(х-а) =Dx = -D^ п
можно записать
=£(* -°)2=£[(*> -*)-(“ ~*)Т = i=l	1=1
= £(^-Л)2-2(а-х)£(х|-х)+и(а-х)2 1=1	1=1
В последнем выражении сумма во втором члене, очевидно, дает нуль, поэтому, перенеся первый член этого выражения в левую часть и сменив знак, получаем
£(х, - х)2 = nD£ -D£=(n-\)D%, 1=1
откуда непосредственно следует, что в случае оценки среднего значения по выборке в качестве оценки дисперсии совокупности берется величина, определяемая по формуле [187, с. 41]
rl~L 1=1
Подтверждение представленных выкладок см. также в [180, т.1, с. 106], [229, с. 52].
Ошибка дисперсии вычисляется как [111, с. 46] m F
Квадратичное отклонение (среднее квадратичное отклонение, стандартное отклонение, эмпирический стандарт или просто стандарт [155, с. 21], [204, с. 288], обозначается s или сг, корень квадратный из дисперсии) используют как меру качества статистических оценок и
38
Глава 1. Статистики эмпирического ряда
называют в этом случае квадратичной погрешностью (ошибкой, средней квадратичной ошибкой или просто квадратичной ошибкой) [24, с. 38], [135, с. 262]. Обычно обозначение ст используется там, где говорится о среднем квадратичном отклонении, вычисляемом по выборке (в этом случае некоторые авторы традиционно говорят о вычислении «сигмы»). Если по контексту под о2 понимается известная дисперсия генеральной совокупности, для того чтобы различить дисперсию генеральной совокупности и выборочную дисперсию, последнюю иногда обозначают как s2. Соответственно, выборочное среднее квадратичное отклонение будет обозначено как 5. Так сделано, например, при описании Г-критерия и Г-критерия.
Выборочное среднее квадратичное отклонение (standard deviation) и его ошибка вычисляются по формулам:
При этом выборочное среднее квадратичное отклонение иногда обозначают как <7n_j, чтобы отличить его от среднего квадратичного отклонения совокупности (standard deviation of the population), при известном среднем значении вычисляемого по формуле
CT=J|X(x.-fl)2 V п i=i
и обозначаемого как <ти. Далее под символом о всегда будем понимать сти_р так как мы работаем только с выборочными исходными данными и параметрами, вычисленными по выборке.
Применяются и другие формулы вычисления среднего квадратичного отклонения и дисперсии, полагаемые некоторыми авторами более удобными. Они базируются на том, что в показанных формулах сумма может быть после элементарных преобразований вычислена как [72, с. 29], [100, с. 115]
^}(х, -х)2 = Х(Х<2 -^х,х + х2) = х2 - 2х^х, + их2 = £х2 -ях2 i=i	i=i	i=i	i=i	i=i
Если исходные данные заданы в виде частот распределения, формула вычисления оценки дисперсии совокупности, основанная на использовании последнего преобразования, будет иметь вид [84, с. 30]
Описательная статистика
39
<r2 = ——-72-1
2"
k
n tr
где bp i = 1,2.k, — середины классовых интервалов,
v„ i=l,2,..., k, — частоты,
k — число классовых интервалов.
Формула находит практическое применение, в частности, при вычислении бисериальной корреляции для порядковых признаков, рассмотренной в разделе «Бисериальная корреляция в случае порядковых признаков» главы 5. Следует учесть, что расчет по данной формуле дает завышенное значение оценки дисперсии, для коррекции которого вводится поправка Шеппарда к величине дисперсии [24, с. 31]
s'2 = s 2-d2/12,
где d — так называемый интервал между группами (очевидно, при равных расстояниях между группами — то же самое, что величина классового интервала, рассчитываемая нами в разделе «Вариационная статистика» настоящей главы).
Иначе дисперсию можно вычислить через ковариацию, как показано в примере, рассмотренном в разделе «Ковариация» главы 5.
Обсуждение с практическими примерами дано в [37, с. 55], [50, с. 30], [111, с. 46]. Упражнение на Fortran 77 приводится в [162, с. 98], на языке Бейсик см. [184, с. 45]. О поправках Шеппарда см. примечания в разделе «Моменты распределения» данной главы. Пример построения дисперсионно-ковариационной матрицы многомерной выборки (матрицы дисперсий-ковариаций) представлен в разделе «Критерии положительной определенности и полуопределенности» главы 13.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
int n = 14; // Численность выборки
double a[] = {65,67.69.70,71,72.72.73,73.78.81.85,86.87}, v2, // Дисперсия
40
Глава 1. Статистики эмпирического ряда
vm: // Ошибка дисперсии
Variance (a,n.&v2.&vm);
cout « "Variance = " « v2 « endl
« "Error	= " « vm « endl:
}
void Variance (double *a.int n.double *v2,double *vm) //
// Функция вычисляет параметры дисперсии.
// Обозначения:
// а - исходная выборка.
// п - численность выборки.
// *v2 - дисперсия,
// *vm - ошибка дисперсии.
// Возвращаемое значение:
// нет.
//
{
*v2 = Cov (а.а.п);
*vm = *v2 * sqrt (2 / n);
}
Теперь настало время вычислить доверительный интервал для дисперсии, подобно тому, как мы это сделали для среднего значения. Доверительный интервал означает нахождение истинной дисперсии о2 в интервале с вычисленными границами на выбранном стандартном доверительном уровне р (его следует задать из стандартной линейки, например: 0,90; 0,95; 0,99; 0,999). Доверительный интервал для дисперсии о2 в случае двусторонней гипотезы вычисляется по формуле [111, с. 109], [140, с. 117]
а2е
(и-1)сг2 (п-1)а2
2	’	2
_Хи-1.(1+р)/2 Zn-l,l-(l+p)/2 _
где Хи-1,— значение обратной функции (^-распределения, р — стандартное значение доверительного уровня.
Для односторонней гипотезы, в зависимости от ее формулировки, вместо левой или правой границы интервала в показанной формуле будет фигурировать соответственно 0 или +«>, а значение обратной функции (^-распределения будет взято для одностороннего значения:
(У2е 0;
t.(K-l)a2 /л-1,1-р
(J2 G
(я-Do-2.
Описательная статистика
41
Вычисление доверительного интервала дисперсии иллюстрируется показанным ниже примером. По поводу фактических параметров вызываемого из функции Confidencelnterval метода InverseChiSqu-areDistribution см. пояснения в начале главы 4.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void) {
int n = 20:
double d = 28,	// Дисперсия
p = 0.95, // Доверительный уровень для двустронней // гипотезы
Low,High: // Параметр доверительного интервала
Confidencelnterval (n.d,p,l,&Low.&High);
cout « "One side:\n"
« "Confidence interval 1 is [0:" « Low « "]" « endl « "Confidence interval 2 is [" « High « ":+Infinity]" « endl:
Confidencelnterval (n,d,p,2.&Low,&High):
cout « "Two side:\n"
« "Confidence interval is [" « Low «	« High «
« endl:
}
void Confidenceinterval (int n,double d.double p.int
Side.double *Low.double *High) //
// Функция вычисления доверительного интервала для дисперсии.
// Обозначения:
//	п	-	численность выборки,
//	d	-	выборочная дисперсия.
//	р	-	стандартный доверительный	уровень,
//	Side	=	1 для односторонней гипотезы,
//	=2 для двусторонней гипотезы,
// *Low, *High - границы доверительного интервала.
// Возвращаемое значение:
// нет.
И
{
42
Глава 1. Статистики эмпирического ряда
if (Side == 1)
{
*Low= (n - 1) * d / InverseChiSquareDistribution (n - 1,1 - p):
*High = (n - 1) * d / InverseChiSquareDistribution (n - l,p):
}
el se
{
*Low = (n - 1) * d / InverseChiSquareDistribution (n - 1, (1 + p) / 2):
*High = (n - 1) * d / InverseChiSquareDistribution (n - 1,1 -(1 <- p) / 2);
}
}
Доверительная оценка для среднего квадратичного отклонения рассмотрена в [155, с. 33].
Мы рассмотрели вычисления для случайной величины, измеренной в количественной шкале. Для качественных признаков дисперсию или стандартное отклонение нельзя вычислить по формулам, предназначенным для количественных признаков. Показано [52, с. 125], что в этом случае стандартное отклонение зависит от доли и вычисляется как
а = А/р(1-р).
где вычисление доли р для качественного признака рассмотрено в конце раздела «Среднее значение, математическое ожидание» данной главы.
Среднее отклонение
Среднее отклонение является характеристикой рассеяния, обладающей тем преимуществом перед средним квадратичным отклонением, или размахом, что оно менее чувствительно к изменению формы распределения. Вычисление выборочного среднего отклонения производится по формуле [70, с. 39]
rf=-Zk-xl>
и “7
где все обозначения те же, что и ранее.
Рассматриваемая характеристика применяется довольно редко, поэтому функция, реализующая ее вычисление, нами не приводится. Эта функция может быть легко составлена в силу своей элементар-
Описательная статистика
43
нести, например, на основе функции Gini путем незначительной модификации ее кода.
Решение на языке программирования Бейсик дано в [184, с. 42].
Средняя разность Джини
Средняя разность, введенная Джини [92, с. 74] и применяемая весьма редко, характеризует разброс значений вариант друг относительно друга и не зависит от какого-либо центрального значения, например от среднего значения или медианы. Вычисление выборочной средней разности Джини производится по формуле [там же, с. 334]

где все обозначения те же, что и ранее.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void) {
int n = 14: // Численность выборки
double a[] = {65,67.69.70.71.72.72,73.73.78.81.85.86,87}, g:	// Средняя разность Джини
Gini (a.n.&g);
cout « "Gini = " « g « endl:
}
void Gini (double *a,int n,double *g) //
// Функция вычисляет параметры средней разности Джини
// Обозначения:
// а - исходная выборка,
// п - численность выборки.
// *д - средняя разность.
// Возвращаемое значение:
// нет.
//
44
Глава 1. Статистики эмпирического ряда
{
register int i.j; // Счетчики цикла
*g = 0;
for (i = 0; i < n: i++)
for (j = 0: j < n: j++)
*g += fabs (a[1] - a[j]);
*	g /= n * (n - 1); }
Асимметрия
Асимметрией (выборочным коэффициентом скошенности, skewness) называют меру отклонения эмпирического распределения частот от симметричного распределения относительно максимальной ординаты [140, с. 11]. Отрицательный показатель асимметрии означает скошенность кривой распределения влево, положительный — вправо от теоретической симметричной кривой распределения. Для симметричного распределения асимметрия равна нулю. Асимметрия обычно вычисляется как основной момент (см. ниже) третьего порядка г3; приведем также и формулу вычисления ошибки [84, с. 55]:
А = г3, тА^ =
f 6
и + 3
Асимметрия находит применение в различных способах оценки отклонения распределения от нормальности.
Подробные рассуждения и вывод даны в [92, с. 124]. Обсуждение см. также [26, с. 27], [50, с. 30], [72], [89, с. 93].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
int n = 28; // Численность выборки
double a[] = {45.30.23,56.78,65.67.47,23,69,70.71.72,72,
73.73,78,81,85.86,87,90.93,96,70.73.60,56}. as, // Асимметрия
Описательная статистика
45
ma: // Ошибка асимметрии
Skewness (a.n.&as.&ma);
cout « "Skewness = " « as « endl « "Error	= " « ma « endl;
}
void Skewness (double *a,int n,double *as.double *ma) //
// Функция вычисляет параметры асимметрии.
// Обозначения:
// а - исходная выборка,
// п - численность выборки,
// *as - асимметрия,
// *та - ошибка асимметрии.
// Возвращаемое значение:
// нет.
//
{
double xm: // Рабочая переменная
///////////////////////
// Среднее квадратичное
*	as = sqrt (Cov (a.a.n)):
///////////////////////
// Параметры асимметрии
*	as = Moment (3,a,0,&xm,n) / *as / *as / *as;
*	ma = sqrt (6.0 / (n + 3));
}
Эксцесс
Степень отклонения эмпирической кривой распределения от теоретической кривой нормального распределения количественно выражается показателем эксцесса (выборочным коэффициентом островершинности, kurtosis) [140, с. 11]. Положительный эксцесс соответствует островершинной кривой эмпирического распределения (заостренной), отрицательный — туповершинной (пологой) по сравнению с нормальной кривой. Эксцесс и его ошибка вычисляются по формулам [84, с. 57]:
Е = г4 - 3, тЕ-2т -2./—^— , Е А Ъ+з
где г4 — основной момент четвертого порядка.
46
Глава 1. Статистики эмпирического ряда
Более точные, несмещенные оценки показателя эксцесса и его ошибки вычисляются, соответственно, как
г_ л2-1 (г	6 1
Е (п-2)(п-3)[(Г4 > я+1]’
24у?(п—I)2
Шг — ।-------------------- .
у (п - 3)(и - 2)(и+3)(и+5)
Эксцесс находит применение в различных способах оценки отклонения распределения от нормальности.
Обсуждение см. также в [26, с. 28], [50, с. 31], [72].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
int n - 28; // Численность выборки
double a[] - {45.30.23.56.78.65.67,47,23,69.70.71.72,72.
73.73,78.81.85.86.87.90.93.96.70,73.60.56}.
es. // Эксцесс
me; // Ошибка эксцесса
Kurtosis (a.n.&es.&me);
cout « "Kurtosis  " « es « endl « "Error	- " « me « endl;
}
void Kurtosis (double *a.int n,double *es.double *me)
//
// Функция вычисляет параметры эксцесса.
// Обозначения:
// а - исходная выборка,
// п - численность выборки,
// *es - эксцесс,
// *те - ошибка эксцесса.
// Возвращаемое значение:
// нет.
Описательная статистика
47
{
double xm; // Фиктивная переменная
/////////////////////
// Параметры эксцесса
*es = Moment (4,а,0,&xm,n) / Cov (a,a,n) - 3;
*me = 2.0 * sqrt (6.0 / (n + 3));
}
Коэффициент вариации
Коэффициент вариации представляет собой характеристику рассеяния распределения вероятностей случайной величины [135, с. 101]. В зависимости от применяемой формулы вычисления [там же] он показывает, какую долю или какой процент составляет среднее квадратичное отклонение от среднего значения. Коэффициент вариации имеет важное значение для установления степени выровпенности совокупности по тому или иному признаку. Он также применяется при проверке репрезентативности (достаточности объема) выборки. Коэффициент вариации и его ошибка вычисляются по формулам [111, с. 50]:
й = • 100%. тд = &J-0-jt.9:0001 1?Z X	\ п
Коэффициент вариации может быть вычислен в абсолютных величинах [63, с. 31]. В этом случае используется обозначение Cv.
Обсуждение см. также в [26, с. 25], [84, с. 39], [70, с. 233, 245]. [89, с. 89], [155, с. 22].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h”
void main (void)
{
int n = 14; // Численность выборки
double a[] = {65.67.69,70,71.72.72.73.73.78.81.85.86,87}. cv, // Коэффициент вариации cm; // Ошибка коэффициента вариации
CoeffOfVariance (а.n.&cv.&cm);
48
Глава 1. Статистики эмпирического ряда
cout « "Coefficient of variance = " « cv « endl « "Error	= " << cm « endl;
}
void CoeffOfVariance (double *a,int n,double *cv.double *cm) //
// Функция вычисляет параметры коэффициента вариации.
// Обозначения:
// а - исходная выборка.
// п - численность выборки.
// *cv - коэффициент вариации,
// *ст - ошибка коэффициента вариации.
// Возвращаемое значение:
// нет.
//
{
*cv = sqrt (Cov (a.a.n)) / VectorSum (a.n) * n * 100:
*cm = *cv * sqrt ((0.5 + 0.0001 * *cv * *cv) / n);
}
Доверительный интервал для коэффициента вариации можно вычислить по формуле [111, с. 109], используя принятые обозначения:
1 + к71+2См 1 - к/ +2С„
Показатель точности опыта
Показатель точности опыта [84, с. 37], иначе — показатель точности определения среднего значения [111, с. 105], выражает величину ошибки среднего значения в процентах от самого среднего. Точность считается удовлетворительной, если величина показателя не превышает 5%, а при значениях, больших 5%, рекомендуется увеличить число наблюдений или повторений. Иногда величину показателя точности можно уменьшить, если повысить точность измерений параметров объектов опыта. Показатель точности опыта и его ошибка вычисляются по формулам [там же]:
Р = ^-100%, X
тр=р.ц~ + р \2п
р Y юо
Описательная статистика
49
Очевидно, показатель точности определения среднего — это именно то, что имеют в виду исследователи, указывая в публикациях после М±т через запятую, к примеру, выражениеР< 0,05, называя его достоверностью, хотя это определение в данном случае не совсем верно.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void) {
int n = 14; // Численность выборки
double a[] = {65.67.69.70.71,72.72.73.73,78.81,85.86,87}. cs. // Показатель точности ms: // Ошибка показателя точности
Sharp (a.n.&cs.&ms):
cout « "Sharp = " « cs « endl « "Error = " << ms « endl:
}
void Sharp (double *a,int n,double *cs.double *ms) //
// Функция вычисляет параметры показателя точности.
// Обозначения:
// а - исходная выборка, // п - численность выборки, // *cs - показатель точности.
// *ms - ошибка показателя точности.
// Возвращаемое значение:
// нет. //
{
double sm, // Среднее mm: // Ошибка среднего
И НН НИ Н Среднее SampleMean (a,n,&sm.&mm):
IIIIIIHIIHIIIIIIIH
Н Параметры точности
*cs = mm / sm * 100:
*ms = *cs * sqrt (0.5 / n + *cs * *cs / 10000): }
50 Глава 1. Статистики эмпирического ряда
Минимум, максимум и размах выборки
Минимальная xmin (minimum) и максимальная xmax (maximum) варианты выборки могут быть получены [100, с. 180] соответственно с помощью функций MinimumOf и MaximumOf.
Размах выборки (размах вариации, амплитуда ряда) — разность между максимумом и минимумом вариант выборки [92, с. 67] — дается формулой
— -Tnax ~ “^min*
Для вариационного ряда Xv..., X размах выборки W запишется как [135, с. 513]
Wn = Хп -X., Хп = тахХ,, X. = minX.. ” п 1 п l<k<n k 1	1<*<Л к
Функция распределения выборочного размаха рассмотрена в главе 4. Обсуждение см. также в [89, с. 29], [111, с. 45], [120, с. 27].
Для дискретных случайных величин, возникающих, например, при цифровом анализе графических изображений, размах определяется как [232, с. 103]
R =	1.
где — максимальное значение уровня, /zmin — минимальное значение уровня.
Так, например, для полутонового изображения, имеющего 256 уровней, от 0 до 255, максимальный размах может составить 256.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include "megastat.h"
void main (void)
{
int n = 7; // Число вариант
double x[] = {23,35,27.29,28,25,30}:
cout « "Range = " « Range (x.n) « endl
}
double Range (double *x,int n)
//
Описательная статистика
51
// Функция вычисляет размах непрерывной случайной величины.
// Обозначения:
// х - исходная выборка,
// к - численность выборки.
// Возвращаемое значение:
// значение размаха.
И
{
return MaximumOf (x.n) - MinimumOf (x.n):
}
Для вычисления размаха дискретной случайной величины показанная функция может быть легко доработана. Функция распределения размаха выборки из нормальной совокупности рассмотрена в главе 4. Там же указана вся необходимая библиография.
Моменты распределения
Моментами распределения [84, с. 42] называют средние значения степеней отклонений вариант выборки:
•	от среднего значения х, тогда моменты называются центральными и обозначаются Hk ,k = 1,2, 3, 4;
•	произвольного числа С (например, медианы), тогда моменты называются условными и обозначаются mk, k = 1,2,3,4;
•	нуля, тогда моменты называются начальными и обозначаются bk,k = 1,2, 3,4.
Условные и начальные моменты иначе называются нецентральными. Общие формулы определения моментов распределения даны в [ 155, с. 21 ], [ 158, с. 88]. Порядок момента равен степени k, в которую возводятся отклонения. На практике моменты порядка выше 4 используются редко.
Формулы вычисления оценок моментов по выборкам можно записать как [84, с. 43]
£(*,-*)*	Yxi
1	1	1	«• 1
Если моменты вычисляются не по исходным данным, а по частотам распределения, под знаками суммы в показанных выше формулах необходимо добавить величины V,, а суммирование производить по числу классовых интервалов. Все остальные параметры — без изменений [там же, с. 43].
52
Глава 1. Статистики эмпирического ряда
Отметим, что а2 = <?2 — смещенная оценка дисперсии, Ьх = х — среднее арифметическое, а величины типа
г
s'
называются основными моментами порядка k. Основной момент порядка 3 является коэффициентом асимметрии, а основной момент порядка 4 нужен для вычисления эксцесса. Эксцесс и асимметрия рассмотрены в одноименных разделах настоящей главы.
При численности совокупности более 500 необходимо ввести поправки на длину интервала (поправки Шеппарда) [84, с. 45], [92, с. 72], [111] к начальным и центральным моментам. При этом должно соблюдаться условие близости распределения к симметричному [49, с. 83]. Обсуждение см. также в [33, с. 23]. Многомерные моменты распределения рассмотрены в [231, с. 97].
Исходные коды
double Moment (int index.double x[],int sw.double *xm,int n) //
// Функция вычисления момента распределения.
// Обозначения:
// index - порядок момента распределения.
//	х - исходная выборка.
//	sw - тип момента распределения:
// sw = 0 - вычисляется центральный момент.
//задавать *хт не нужно,
// sw = 1 - вычисляется условный момент, задать *хт = С,
//	вычисляется начальный момент, задать *хт = 0.
//	*хт - вычисляемое значение среднего (при sw = 0),
// п - численность выборки.
// Возвращаемое значение:
// значение момента распределения.
//
{
register int i,j; // Счетчики
double s = 0,	// Начальное значение суммы
temp:	// Вспомогательная величина
//////////////////////
// Вычисление среднего
if (sw == 0)
*xm = VectorSum (x.n) / n;
/////////////////////
// Вычисление момента
Вариационная статистика
53
for (i = 0; i < n; i++)
{
temp = x[t] - *xm:
for (j = 1; j < index; j++) temp *= x[i] - *xm;
s += temp;
}
return s / n; }
Вариационная статистика
Исчисление числовых и функциональных характеристик эмпирических распределений называется вариационной статистикой [ 135, с. 101 ]. Есть и другое определение данного термина. Так, часто используемый диссертантами по медико-биологической тематике термин «вариационная статистика» означает просто «статистика» [111, с. 7]. Слово «вариационный» в этом случае не имеет отношения к вариационным рядам, а является прилагательным от «варианта». По причине многочисленных трактовок и из-за того, что термин «вариационная статистика» стал штампом1, мы настоятельно не рекомендуем им пользоваться во втором смысле.
Варианты выборки могут быть отсортированы в порядке неубывания. По определению [135, с. 106], упорядоченный таким образом ряд называется вариационным и служит основой для построения методов вариационной статистики и эмпирических функций статистических распределений. Вариационный ряд может быть получен из исходной эмпирической выборки путем применения функции Sort Array Up.
Некоторые авторы [80, с. 83] выделяют три формы вариационных рядов:
• Ранжированный ряд — это собственно вариационный ряд, то есть ряд вариант, упорядоченный по неубыванию. Полученный таким образом ряд называют также порядковой статистикой [28, вып.2, с. 136], но этот термин крайне неудачен (имеется термин «порядковая шкала», означающий нечто совершенно иное) и в таком качестве нами применяться не будет. В смысле применяемой шкалы измерения вариационный (ранжированнный) ряд может быть получен как из порядковых, так и из количественных выборок.
Мифический «метод вариационной статистики».
54
Глава 1 Статистики эмпирического ряда
•	Дискретный ряд.
•	Интервальный ряд.
Два последних вариационных ряда представляют собой таблицы распределения количеств вариант по классам и различаются тем, что в первом случае количества относятся к определенным, возможно нечисловым, значениям признаков, а во втором случае — к интервалам изменения признака (классовым интервалам). Некоторые авторы в этом случае предпочитают говорить о группировке исходных данных [89, с. 19], и это очень хорошее определение, верно отражающее суть процесса. В упомянутом источнике дается подробное введение в проблему относительно медицинских данных, но выводы могут быть применены и к исходным данным любого другого происхождения.
Интервальные вариационные ряды могут дополнительно подразделяться на прерывные (в случае, когда величина варьирующего признака может принимать только целые значения) и непрерывные (в случае, когда варьирующий признак может принимать любые целые и дробные значения) [там же, с. 30].
Дискретный вариационный ряд, очевидно, возникает там, где анализируются некоторые качественные, но логически упорядоченные, а также порядковые признаки. Дискретный и интервальный вариационные ряды, иначе — просто ряды распределения [111, с. 26], используются нами там, где методы расчета оперируют эмпирическими частотами распределения признаков. Эти вариационные ряды служат основой для одного из методов построения функций эмпирических распределений.
Там, где говорится о вариационных рядах, если не оговорено иное, мы будем иметь в виду дискретный или интервальный вариационный ряд, в зависимости от контекста. Из смысла излагаемой методики всегда понятно, о каком ряде идет речь.
Параметры классовых интервалов
Для практического построения интервального вариационного ряда прежде всего необходимо определить число классов (групп, интервалов) k. Субъективным критерием правильности выбора числа классов является верная передача типа распределения эмпирических частот данной совокупности. Если выбрано слишком мало классов, можно потерять характерную картину эмпирического распределения. При слишком подробном делении на классы можно затуше
Вариационная статистика
55
вать реальную картину распределения частот случайными отклонениями. Авторы обычно выделяют несколько способов вычисления числа классов для выборок умеренных размеров. Так, способ экспертной оценки (эмпирическое правило) предлагает брать
k = 12 ±3
либо от 10 до 20 [135, с. 345]. Эмпирические правила даны в [72, с. 19], [106, с. 211], [111, с. 28], [206, с. 346]. Нами обычно применяется правило Стержесса (Стургеса) [84, с. 318]:
k = 3,321g?? + 1 = l,441n?2 + 1,
где п — численность совокупности.
Сводка основных рекомендаций по выбору числа интервалов группировки дана в [156, с. 31]. О правиле Стержесса см. также в [80, с. 85], [111, с. 28], [155, с. 35]. В некоторых источниках (например, [187, с. 295], [206, с. 346]) дается практическое правило, что если число наблюдений в классе окажется меньше четырех или пяти, следует объединять его с соседним классом. Следствием будут различные величины классовых интервалов. Это неудобно, но для некоторых методов, таких как критерий X , такой прием является необходимым. Проблемы объединения классовых интервалов подробно рассмотрены в [70, с. 23], [167, с. 604].
Исходные коды
1 nt Sturgess (int n) //
// Функция определения числа классовых интервалов
// по правилу Стержесса.
// Обозначения:
// п - численность выборки вариант.
// Возвращаемое значение:
// число классовых интервалов.
//
{
double s = п: // Возвращаемое значение
s = 1.44 * log (s) + 1: /////////////////////// // Эмпирическое правило if (s > 15)
s = 15:
return (int) floor (s); }
56
Глава 1. Статистики эмпирического ряда
Исходя из найденного числа классов определяются величины интервалов группировки, которые обычно берутся равными и рассчитываются по формуле [ 111, с. 28]
d = R / k,
где d — величина интервала группировки,
R — размах выборки,
k — число классов — определено выше.
Величину d называют также шириной классового интервала, просто классовым интервалом или длиной интервала группировки [205, с. 48]. Другая формула определения длины интервалов группировки, отличающаяся от показанной множителем 1,02, приводится в [156, с. 31], причем рассмотрение параметров классовых интервалов плавно перетекает в обсуждение группировки (разбиения выборки по интервалам, гистограммирования).
Если классовые интервалы выбираются различными, z-й классовый интервал
= xf - xf_p i = 1,2,..., k,
гдех, i = 0,1, 2,..., k, — границы классовых интервалов.
Напомним, что все изложенное здесь относилось к количественным признакам. Однако классификация объектов может быть проведена и по качественному признаку [135, с. 344] либо порядковому признаку. При этом, естественно, не имеют смысла понятия величины классового интервала, границ классового интервала и т. п.
Группировка
Под группировкой (классификацией, разнесением вариант по классам) понимается некоторое разбиение интервала, содержащего все п наблюдавшихся вариант хр..., х, на k интервалов, число которых определено нами в предыдущем разделе, с последующим разнесением вариант совокупности по интервалам [205, с. 45]. Для случая количественной шкалы измерения число наблюдений v., i = 1,..., k, попавших в г-й класс, означает количество наблюдений, удовлетворяющих неравенству
ti-di/2<x < ti + di/2,i = 1,2,...,^,
где t, i = 1,2,..., k, — середины классовых интервалов.
Вариационная статистика
57
Группировка для применяемых алгоритмов может производиться вручную с помощью показанной выше формулы. Автоматически группировка может быть выполнена с помощью функции Allocate. Особенностью функции является то, что она вычисляет классовые интервалы равной ширины. Кроме того, для компенсации ошибок округления функция применяет несколько иную формулу, чем показанная выше. Впрочем, эти особенности только помогают функции показывать стабильные результаты. Помимо численностей вариант, разнесенных по классам, функция выдает середины классовых интервалов. Для анализа иногда удобнее иметь границы классовых интервалов. Их несложно получить, если с помощью двух соседних значений середин классовых интервалов вычислить ширину классового интервала и отнять ее половину от значения середины первого интервала. Каждая последующая граница будет получена прибавлением ширины классового интервала.
Обсуждение см. в [111, с. 28]. Из широко распространенных в данное время программных продуктов с задачей группировки справляются электронные таблицы Microsoft Excel. Для этого надо выбрать в меню Сервис ► Пакет анализа ► Гистограмма (компонент Пакет анализа должен быть установлен) и следовать указаниям мастера, причем разбиение на классы может быть выполнено как вручную (явно задается так называемый интервал карманов, представляющих собой границы классов), так и автоматически. Отметим, что представленная нами функция Allocate автоматически вычисляет интервалы (выводятся середины интервалов), но также может быть легко трансформирована как на ручное задание границ классов, так и на задание начала первого класса и ширины классового интервала, в зависимости от пожеланий исследователей.
Как отмечено в предыдущем разделе, группировка может быть выполнена и по порядковым признакам. В этом случае понятия величины и границ классового интервала не имеют смысла, а упорядоченность признаков дает очевидное правило классификации.
Исходные коды
#include <fstream.h>
#include <iomanip.h>
#include "megastat.h"
void main (void) {
int k = 5,	// Число классов
n:	// Число вариант
58
Глава 1. Статистики эмпирического ряда
double х[]	=	//	Массив вариант
{1,2,3,4,5,6,7,8,9.1,1.7,3,4,5,6,7,2,3,4,5,6,2},
*f,	//	То же по классам
*Ь,	//	середины классов
sum	= 0: //	Контрольное число
n = sizeof (х) / sizeof (х[0]);
f = new double [kJ;
b = new double [k];
Allocate (x,n,f,b,k);
cout « "Attempt to allocate sample of " « n « " members into " « k « " classes\n";
for (register int i = 0; i < k; sum += f[i++J)
cout « setw (10) « b[i] « setw (10) « f[i] « endl: cout « "Total allocated “ « sum « " membersXn";
delete [] f; delete [] b:
}
void Allocate (double datafj.int n.double f[],double b[],int k) //
// Функция разнесения вариант по классам.
// Обозначения:
// data	-	исходная выборка,
//	п	-	численность выборки,
// f - вычисляемый массив вариант, разнесенных по классам.
//	b	-	массив середин классов,
//	к	-	число классов.
// Возвращаемое значение:
// нет.
//
{
register int i.j; // Счетчик цикла
double t,c; // Вспомогательная переменная
//////////////////
// Минимум выборки
t = MinimumOf (data.n):
t-t >0 ’ t * 0.99 : t * 1.01;
///////////////////
// Максимум выборки
с = MaximumOf (data.n);
C=C>O?C* 1.01 : c * 0.99;
////////////////////////////////
// Половина классового интервала
Вариационная статистика
59
с = (с — t) / к / 2;
////////////////////////////////////// // Массив середин классовых интервалов b[0] = t + с;
f[0] = 0;
for (1=1; 1 < k; 1++)
{
b[i] = b[i - 1] + с + с:
f[i] = 0;
}
////////////// // Группировка for (1=0; 1 < n; 1++) for (j = 0; j < k; j++) if (datafi] > b[j] - c && data[i] <= b[j] + c) {
f[j]++; break;
}
}
Функция Allocate предназначена для применения в методиках, которые предусматривают анализ одной выборки. При совместном разнесении по классам вариант двух эмпирических рядов с целью, например, сравнения эмпирических распределений двух совокупностей, было бы не совсем верным строить интервальный вариационный ряд отдельно для каждого эмпирического ряда. Если принято, что для сравниваемых вариационных рядов должны быть одинаковыми классовые интервалы1, для разнесения вариант по классам необходимо применять показанную ниже функцию AllocateCommon, в качестве формальных параметров которой нужно кроме самих эмпирических рядов задать также и число классов, которое должно быть вычислено или выбрано заранее с помощью одной из рассмотренных методик. Применение функции AllocateCommon гарантирует, что построенные интервальные вариационные ряды будут иметь одинаковые интервалы. Эмпирические выборки могут иметь разные численности, поэтому число классов можно выбрать по одному, например меньшему, из эмпирических рядов.
Исходные коды
void AllocateCommon (double х[],double у[],double fx[],double fy[],double b[],1nt nx.int ny.int k)
‘ Если принята иная точка зрения, можно применить функцию Allocate для каждой из сравниваемых совокупностей в отдельности.
60
Глава 1. Статистики эмпирического ряда
//
// Функция совместного разнесения вариант двух выборок по
// классам.
// Обозначения:
//	х	-	первая выборка,
//	у	-	вторая выборка,
//	fx	-	разнесенные варианты	первой	выборки,
//	fy	-	разнесенные варианты	второй	выборки,
// b - вычисленные середины классовых интервалов.
// пх - численность первой выборки,
// пу - численность второй выборки,
// к - заданное число классов.
// Возвращаемое значение:
// нет.
//
{
register int i.j;	// Счетчик цикла
double с.	// Величина классового
// интервала и рабочая переменная max = MaximumOf (x,nx), // Начальные значения минимума min = MinimumOf (x,nx); // и максимума
////////////////////////////////// // Вычисление минимума и максимума if ((с = MaximumOf (y.ny)) > max) max = с;
if ((с = MinimumOf (y.ny)) < min) min = c:
///////////////////////////////////////////////////////////// II Раздвигаем границы на It для компенсации ошибок округления max = max > 0 ? max * 0.99 : max * 1.01:
min = min > 0 ? min * 1.01 : min * 0.99;
//////////////////////////////// // Величина классового интервала с = (max - min) / k;
////////////////////////////////////// // Массив середин классовых интервалов b[0] = min + с / 2;
for (i = 1: i < k: i++)
b[i] = b[i - 1] + c:
//////////////
// Группировка
FillUp (fx.k.O):
FillUp (fy.k.O):
for (i = 0: i < nx; i++)
for (j = 0: j < k; j++)
if (b[j] - c / 2 <= x[i] && b[j] + c / 2 >= x[i])
Вариационная статистика
61
{
fx[j] += 1: break;
}
for (i = 0; i < ny; 1++) for (j = 0; j < k; j++) if (b[j] - c / 2 <= y[i] && b[j] + c / 2 >= y[i]) { fy[j] += 1: break;
} }
Функции эмпирического распределения
Теоретической функцией распределения случайной величиных называется функция действительного вещественного аргумента, задаваемая как [63, с. 24]
F(x) = P(t < х).
Эмпирической функцией распределения (функцией распределения выборки, выборочной функцией распределения) называют функцию F (х), определяющую для каждого значения х частотное распределение эмпирической выборки, то есть долю событий X < х [54, с. 191,120, с. 48]:
Г„(*) = «,/«.
где пх — число вариант, меньших, чем х, п — общее число вариант эмпирической выборки.
Величины пх называются накопленными (кумулятивными) абсолютными частотами [205, с. 46], а величины пх/п называются накопленными (кумулятивными) относительными частотами. Накопленная относительная частота иногда называется также интенсивностью и может выражаться в процентах [89, с. 51]. Соответственно, график F (х) называется полигоном накопленных частот [155, с. 35], [70, с. 29] и изображается в виде ступенек. В стандартных электронных таблицах нам не встречались графики подобного типа, поэтому наиболее близким по типу графиком можно считать гистограмму с нулевыми промежутками между колонками. Изображение данного графика в виде ломаной (а тем более кривой) линии не является верным, так как ломаная линия предполагает как наличие значений между точками излома, так и непрерывность функ
62
Глава 1. Статистики эмпирического ряда
ции в этих точках излома, что математически соответствует разрывам в производной функции. Ведь даже для больших значений п, во-первых, отсчет абсциссы практически будет производиться дискретно, а во-вторых, значение пх является целым. Поэтому на самом деле график Fn(x) представляет собой линию с разрывами на границах ступенек и параллельными оси абсцисс сегментами между ступеньками, пусть даже степенек будет много, что математически соответствует разрыву в самой функции на границах сегментов.
Свойства
Обсуждение свойств теоретической функции распределения дано в [70, с. 55], [135, с. 519, 654], [140, с. 9] (свойства относятся и к эмпирической функции распределения):
1. Р(хх) < F(x2) при Xj < х2
2. lim F(x) = 0,limF(x) = l.
Кроме того, теоретическая функция распределения непрерывна слева при каждом х.
Корень Xq уравнения
P(t X,) = F(X,) = q
называется выборочной квантилью (долевой точкой) порядка q функции распределения F(x) [101, с. 538], [140, с. И], [205, с. 63]. Поэтому, как было показано выше, квантиль X называется выборочной медианой. Квантили порядка У\, У2 и \ называются выборочными квартилями [там же, с. 64], 10%-, 20%-,..., 90%-квантили называются децилями, а 1%-, 2%-,..., 99%-квантили — процентилями [там же]. О долевых точках см. также [ 167, с. 404], о процентилях см. [52, с. 35], о квантилях и процентных точках см. [155, с. 15].
На практике различают дискретные и непрерывные распределения случайных величин [158, с. 83]. Говорят, что случайная величина X имеет дискретное распределение, если она может принимать лишь счетное (возможно, конечное) число различных значений х [63, с. 24]. Функцией распределения вероятностей при этом называют функцию
/(х) = Р(Х = х).
Для дискретной случайной величины имеют место свойства:
Вариационная статистика
63
1.	P(X<r) = £Pj. i=0
2.	P(r<X<s)=	.
i=r+l
з.	ip.=i.
»=0
Для непрерывной случайной величины существует неотрицательная функция /(х) — плотность вероятности (плотность распределения вероятностей [63, с. 25] пли просто плотность распределения), а рассмотренные выше свойства запишутся, соответственно, как:
1.	P(X<x)=F(x)=
b
2.	Р(а< X<b) =J f(t)dt=F(b)-F(d). a
3.	=
Свойства дискретных случайных величин и распределений обсуждаются в [70, с. 67], [205, с. 86]. Свойства непрерывных случайных величин и распределений обсуждаются в [70, с. 70], [205, с. 83]. Нужно учитывать, что в практических вычислениях все функции распределения независимо от типа распределения являются рядами скалярных величин [101, с. 538].
Теоретическая плотность эмпирического распределения, соответствующая эмпирической плотности эмпирического распределения f(t), вычисленной по выборке, обозначается как F(t). Пример вычисления теоретической плотности эмпирического распределения дан в конце раздела «Теоретические и эмпирические распределения» главы 4.
Ниже показана сводная таблица, содержащая формулы для вычисления характеристик эмпирического распределения случайных величин (табл. 1.2). Формулы строки 2 прямо вытекают из введенных выше свойств 3 дискретной и непрерывной случайных величин, а именно: для дискретной случайной величины единице равна сумма вероятностей, для непрерывной же случайной величины
64
Глава 1. Статистики эмпирического ряда
единице равна площадь под кривой плотности распределения, поэтому для непрерывного распределения необходимо умножение знаменателя на размеры классовых интервалов, которые могут быть одинаковыми или различными (как показано в таблице) для разных классов. Обсуждение проблемы см. [205, с. 47] и, особенно, выделенное курсивом замечание [там же, с. 48]. О подборе типа теоретического распределения к представленным эмпирическим данным см. [98, с. 29].
Разнесенные по классам варианты эмпирического ряда называются абсолютными частотами распределения (групповыми частотами или просто частотами) [70, с. 54], [101, с. 537] либо численностями отдельных классов [135, с. 344]. Компоненты эмпирического ряда эмпирического распределения называются относительными частотами эмпирического распределения (частостями) [135, с. 344], [155, с. 7], [33, с. 44] и представляют собой в пределе вероятности наступления события [70, с. 54], так как близость частости случайного события к вероятности этого события позволяет по результатам наблюдения принимать частость в качестве статистической оценки (приближенного значения) вероятности [135, с. 628], [155, с. 7]. Поэтому выборочные эмпирические частоты распределения обозначаются некоторыми авторами через р(х). Предельные свойства подробно обсуждаются в [70, с. 55]. [205, с. 8] указывает, что слово «частота», если не оговорено иное, обычно означает относительную частоту, однако удобнее частотой называть абсолютную частоту распределения, а относительную частоту именовать частостью, что мы и намерены делать в дальнейшем. Не следует также путать введенные в начале текущего абзаца характеристики с рассмотренными выше накопленными (кумулятивными) абсолютными и относительными частотами.
График частот v, i = 1,2,..., k, изображается в виде гистограммы или многоугольника (полигона частот) с вершинами в точках, соответствующих срединным значениям интервалов и частотам [70, с. 28], [205, с. 47], а график/(х) изображается в виде гистограммы, на которую может накладываться график функции f'(x) в виде непрерывной кривой или отдельных точек, в зависимости от типа теоретического распределения. Мы не разделяем мнения источников, что график частот может быть построен в виде полигона, ибо соединение двух соседних точек графика отрезком прямой линии должно предполагать, что между этими точками существуют какие-то значения аргумента и функции, однако на самом деле это не так. Правильнее гистограмму непрерывного распределения изображать
Вариационная статистика
65
в виде столбиковой диаграммы (частота вычисляется как площадь), а гистограмму дискретного распределения — в виде точечного или линейчатого графика (частота есть точка на графике).
Подробное обсуждение дано в [44, с. 136]. Программные реализации методики построения диаграмм не слишком сложны. Методика построения гистограммы на примере гистограммы изображения, включая исходные тексты на языке С, представлена в [121, с. 321]. Основные понятия, включая нормализацию данных, рассмотрены в [230, с. 299], [185, с. 19]. См. также [106, с. 211].
Таблица 1.2. Эмпирические и теоретические характеристики распределений случайных величин
Ns	! Характеристика	Распределение Дискретное	Непрерывное
1	Частоты v i = 1,2,..., k	Варианты эмпирического ряда разнесены по к классам. В каждый класс, таким образом, попало 1/, i =1,2,.... k вариант. Общее количество вариант совокупности i=l
2	Частости /(х)	ft = nJ п,	= nj(nd),i = 1,2	k i = 1,2, ...,Л
3	Функция плотности теоретического распределения f\x)	Вычисляется по формуле частот теоретического распределения, выбранного на основании теоретических предположений
4	Эмпирическая функция эмпирического распределения F (х)	,*ч II 1М' III N5
5	Теоретическая функция эмпирического распределения F(x)	F VP	Вычисляется по формуле, Л ~ L Ji	аналогичной предыдущей строке, где за величины г = 1,2,..., k	V,, i = 1,2	k, берутся соответствующие величины теоретического ряда
Для некоторых методов анализа может потребоваться выполнение обратных вычислений. Так, чтобы получить теоретическую функцию дискретного распределения F' (х), необходимо по теоретиче-
3-2002
66
Глава 1. Статистики эмпирического ряда
ской плотности распределения путем использования обращенных формул строки 2 табл. 1.2 получить теоретический ряд частот распределения как
v, = nfv i =1,2,k.
Обсуждение см. в [180, т.1, с. 89].
Способы построения
Практически эмпирические функции эмпирического распределения (далее — функции распределения) могут быть построены двумя способами:
1 Способ построения функции распределения, исходя из частот распределения, основан на применении формулы строки 4 табл. 1.2. Задавшись некоторыми классовыми интервалами (чаще всего — равными), производят разнесение вариант исходной выборки по классам. Поделив попавшее в каждый класс число вариант на численность выборки, строится массив частостей, последовательное суммирование элементов которого дает искомый массив функции распределения. Таким образом, численность массива функции распределения равна числу классовых интервалов, а графически данный массив представлен в виде ступенчатого неубывающего графика, по оси абсцисс которого отложены середины классовых интервалов, причем в случае равных классовых интервалов отложены равномерно, а по оси ординат — значения элементов массива, находящиеся в интервале от 0 до 1. В стандартных электронных таблицах близким к данному типом графика является «Гистограмма». Способ применяется, если объем данных достаточно велик, чтобы построенная функция верно отражала характер распределения. Наиболее просто функция распределения данным способом вычисляется с помощью электронных таблиц Microsoft Excel путем выбора из меню программы: Сервис 4 Пакет анализа 4 Гистограмма 4 Интегральный процент, затем последнее отобразить в обычном числовом формате. Некоторые авторы дают минимально допустимую численность выборки для обоснованного применения данного способа, составляющую 100 и более вариант.
2. Способ построения функции распределения, исходя из исходной выборки, основан на непосредственном примении формулы определения функции распределения, данной в начале параграфа. Упорядочив исходную выборку по возрастанию, сразу присту-
Ранжирование
67
пают к построению массива функции распределения и графика. Выборку упорядочивают по возрастанию. Затем по оси абсцисс откладывают значения вариант, по оси ординат — числа, представляющие собой отношения номеров вариант упорядоченной выборки к численности выборки. Таким образом, численность построенного массива функции распределения равна численности исходной выборки, а графически данный массив также представлен в виде неубывающего ступенчатого графика, в отличие от предыдущего случая ординаты которого (при наличии совпадений ступеньки будут более высокими) расположены равномерно, а абсциссы соответствуют упорядоченной исходной выборке. В стандартных электронных таблицах близкого типа графика нам не встречалось. Способ может применяться для выборок практически любой численности, а для малых выборок является единственным способом получить функцию распределения для дальнейших расчетов, например для вычисления статистик типа Колмогорова—Смирнова.
Часто нужно получить две сопоставимые между собой функции распределения с целью их совместного анализа. Относительно второго способа трудности могут быть только в организации вычислительной процедуры — других проблем мы не видим. В первом же способе массивы функций распределения могут быть получены после совместного разнесения по классам вариант сравниваемых совокупностей1, например, с помощью функции AllocateCommon. Если функции распределения вычисляются с помощью электронных таблиц Microsoft Excel и функции распределения будут применяться для вычисления критерия Колмогорова—Смирнова, границы классов (Интервал карманов) нужно задать одинаковыми для сравниваемых выборок.
Ранжирование
С рассмотренными в предыдущем разделе процедурами построения вариационных рядов не следует путать процедуры присвоения рангов наблюдениям (ранжирования). Функции ранжирования находят широкое применение при реализации статистических методов проверки гипотез. Рангом наблюдения [187, с. 43] называют номер, который получит это наблюдение в совокупности всех данных после их упорядочивания по определенному правилу, например от меньшего к большему.
1 См. сноску в описании функции AllocateCommon.
з*
68
Глава 1. Статистики эмпирического ряда
При равенстве стоящих рядом вариант упорядоченной (отсортированной) выборки в зависимости от требований алгоритма вариантам выборки, как правило, присваиваются средние ранги, хотя эта операция вряд ли корректна — просто так условились. Дело в том, что ранги представляют собой величины, измеренные в порядковой шкале. Для количественных величин процедура ранжирования понижает исходную шкалу до порядковой (если исходные данные были измерены в порядковой шкале, понижения шкалы при ранжировании не происходит), а в порядковой шкале операции сложения и деления, применяемые при подсчете средней величины, не определены [187, с. 302].
Вычисление поправки на объединение рангов производится по формуле [37, с. 243]
g r=w-l). i=l
где£ — число групп совпадений, так называемых связок, — число совпадений в i-й связке.
Это очень важный параметр, применяемый в уточненном расчете статистических тестов. См. также [180, 124], [187, с. 123].
Исходные коды
double Rank (double х[].double xx[].int n) //
// Функция ранжирования.
// Обозначения:
// х - исходная выборка.
// хх - массив рангов.
// п - численность выборки.
// Замечание:
// Для получения верного результата выборка должна быть
// отсортирована по возрастанию, например функцией
// SortArrayUp.
// Возвращаемое значение:
// поправка на объединение рангов.
//
{
register int j: // Счетчик
int	is.	//	Количество равных элементов
ii.	//	Рабочая переменная
i	=	1;	//	Текущий ранг
doublе xi.
// Средний ранг равных элементов
Ранжирование
69
xj, // Сумма рангов равных элементов г = 0:	// Поправка на объединение рангов
//////////////////////////////////////////////////// // Подсчет количества равных стоящих рядом элементов is = 1;
for (j = i - 1 ; j < n - 1: j++)
{
if (x[j + 1] == x[j]) i s++;
el se break:
}
/////////////////////////////////////////////
II	Рядом стоит не менее двух равных элементов if (is > 1)
{ г += (is * is * is - is): ii = i - 1:
for (j = l.xj = 0: j <= is: j++) xj += (++ii):
xi = xj / is;
for (j = 1; j <= is : j++) xx[i++ - 1] = xi:
}
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIHI
II	Равных стоящих рядом элементов на текущем шаге нет el se
xx[i - 1] = i++:
} while (i <= n):
return r;
}
Для вычисления коэффициента Кендалла процедура ранжирования имеет особенность, заключающуюся в том, что вычисление поправки на объединение рангов производится по формуле [151, с. 396]
1 *
r=|w-i).
где все обозначения те же, что и ранее.
70
Глава 1. Статистики эмпирического ряда
Исходные коды
double RankKendall (double х[],double xx[],int n) //
// Функция ранжирования для вычисления коэффициента Кендалла.
// Обозначения:
// х - исходная выборка.
// хх - массив рангов.
// п - численность выборки.
// Замечание:
// Для получения верного результата выборка должна быть
// отсортирована по возрастанию, например функцией
// SortArrayllp.
// Возвращаемое значение:
// поправка на объединение рангов.
//
{
register int j:	//	Счетчик
int is.	//	Количество равных элементов
ii.	//	Рабочая переменная
i = 1:	//	Текущий ранг
double xi.	//	Средний ранг равных элементов
xj.	//	Сумма рангов равных элементов
r = 0.	//	Поправка на объединение рангов
rs:	//	Рабочая переменная
do
{
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / // Подсчет количества равных стоящих рядом элементов is = 1;
for (j=i-l:j<n-l; j++)
{
if (x[j + 1] == x[j])
is++;
el se
break:
}
/////////////////////////////////////////////
// Рядом стоит не менее двух равных элементов
if (is > 1)
{
rs = is * (is - 1):
r += rs:
ii » i - 1:
xj «= 0;
for (j = 1: j <= is: j++)
xj = xj + ++ii:
xi = xj / is:
for ( j = 1: j <= is : j++)
xx[i++ - 1] = xi:
}
Ранжирование
71
///////////////////////////////////////////////////// // Равных стоящих рядом элементов на текущем шаге нет el se
xx[i - 1] = 1++;
}
while (i <= n ):
return r / 2;
}
Для применения некоторых статистических процедур используется операция совместного ранжирования двух выборок. Функция, реализующая эту операцию, показана ниже. Вместо этой функции может быть применена связка функций: «слияние» (если выборки до выполнения вычислений уже не находятся в одном массиве) —> Sort Array Up -> Rank —» UnSort Array -> «разделение», — хотя такое решение менее эффективно. Недостатком функции RankCommon является то, что она не вычисляет поправку на объединение рангов.
Исходные коды
void RankCommon (double *х,double *у,double *хх,double *yy,int nx.int ny) //
// Функция совместного ранжирования двух выборок.
// Обозначения:
//	х	-	первая	выборка,
//	у	-	вторая	выборка.
//	хх	-	массив	рангов первой	выборки,
//	уу	-	массив	рангов второй	выборки.
// пх - численность первой выборки.
// пу - численность второй выборки.
// Замечание:
// Для получения верного результата выборки должны быть
// отсортированы
// по возрастанию и не содержать равных элементов, например
// обработаны
// функциями SortArrayUp и Compare.
// Возвращаемое значение:
// нет.
//
{
register int i.l, // Счетчики цикла
к = 0.	// Счетчик элементов массива X
j = 0,	// Счетчик элементов массива Y
is; // Вспомогательная переменная
/////////////////////////////// // Совместный перебор элементов for (i =1; i <= nx + ny; i++)
{
72
Глава 1. Статистики эмпирического ряда
//////////////////
// Ранг X < ранга Y
if (x[k] < y[j])
{
xx[k] = 1;
/////////////////////// // Последний элемент X? if (k < пх - 1)
k++ :
el se
{
//////////////////////// 11 Заполнение остатка YY is = i;
for (1 = j; 1 < ny; 1++) yy[l] = ++is;
return;
}
}
///////////////////
// Ранг Y < ранга X
el se
{
yy[j] = i:
/////////////////////// // Последний элемент Y?
if (j < ny - 1)
el se {
//////////////////////// // Заполнение остатка XX is = i ;
for (1 = k; 1 < пх; 1++) xx[l] = ++is;
return;
}
}
}
}
Проверка случайности выборки из нормальной совокупности
Для проверки, извлечена ли выборка случайно из нормальной генеральной совокупности либо, с другой точки зрения, независимы ли одинаково нормально распределенные случайные величины, мож
Репрезентативность выборки
73
но воспользоваться критерием Аббе. Статистика критерия подсчитывается по формуле [32, с. 62]
Дополнительную информацию о критерии Аббе см. в [37, с. 208], [156, с. 89], [161, с. 405]. Таблицы даны в [32,267], а доверительный уровень вычисляется функцией AbbeDistribution.
Исходные коды
double Abbe (double x[].int n)
//
// Функция вычисления критерия Аббе.
// Обозначения:
// х - исходная выборка.
// п - численность выборки.
// Возвращаемое значение:
// значение статистики критерия Аббе.
//
{
register int i: // Счетчик
double m.	//	Выборочное среднее
q = 0.	//	Вспомогательные величины
s = 0:
m = VectorSum (х. n) / n;
for (i = 0: i < n - 1; i++)
q += (x[i + 1] - x[i]) * (x[i + 1] - x[i]);
for (i = 0; i < n; i++)
s += (x[i] - m) * (x[i] - m):
return q / s / 2;
}
Репрезентативность выборки
Сделав определенные предположения о соотношении параметров выборки из генеральной совокупности и параметрах самой генеральной совокупности, можно на основании первых судить о вторых. Выбранная для исследования случайным образом из некоторой гене
74
Глава 1 Статистики эмпирического ряда
ральной совокупности группа величин называется репрезентативной, если она наилучшим образом представляет всю генеральную совокупность в смысле соответствия выборочных параметров параметрам генеральной совокупности.
Элементарные формулы определения численности репрезентативной выборки для различных случаев даны в [84, с. 67], [89, с. 125], [111, с. 309], а в [156, с. 13] приведен наиболее подробный анализ. См. также [157].
Так, если неизвестна численность генеральной совокупности, достаточный объем выборки оценивается по формуле
I ' J
где С — значение ^-распределения для оо степеней свободы,
<	у — выборочное среднее квадратичное отклонение,
Д — заданная допустимая абсолютная погрешность определения среднего арифметического значения.
Отметим, что единицы измерения выборочного среднего квадратичного отклонения и допустимой абсолютной погрешности совпадают. При этом говорят, что данные параметры вводятся в именованных числах.
Дальнейшие исследования и программные ресурсы
•	Восстановление пропущенных данных, базирующееся на итеративном подборе пропущенных значений [124, с. 35,147]. Данную проблему решает, например, пакет SOLAS разработки Statistical Solutions (www.statsol.ie).
•	Исключение резко выделяющихся наблюдений по алгоритмам [32, с. 58], [70, с. 265], [111, с. 153], [120, с. 35], [140, с. 191], [155, с. 23].
•	Сглаживание данных [146], [155, с. 62], [158, с. 35].
Многие из представленных в главе расчетов можно проделать с помощью стандартных электронных таблиц, таких как Microsoft Excel, входящих в комплект Microsoft Office, либо StarCalc из пакета Star Office производства Sun Microsystems. Это полезно для проверки в электронных таблицах правильности своих расчетов. Кроме того,
Дальнейшие исследования и программные ресурсы
75
можно воспользоваться одной из десятков коммерческих или бесплатных программ анализа данных, причем для расчета основных показателей достаточно самых простых программ, таких как NCSS Junior (NCSS Statistical Software, www.ncss.com) или NumLock Calculator (nlcalc.narod.ru, CD-приложение к «КомпьютерПресс», № 12 за 2000 г.).
В Интернете есть ряд подробных руководств по математической статистике, например интерактивное «Руководство InStat по выбору и интерпретации статистических тестов» (GraphPad Software, www.graphpad.com), руководство по математической статистике Electronic Statistics Textbook (StatSoft, www.statsoft.ru/home/textbook/ default.htm, CD-приложение к журналу «КомпьютерПресс», № 3 за 2000 г.), мультимедийный курс прикладной статистики ActiveStats (Longman Software Publishing, www.longman.net).
Глава 2. Проверка гипотез
Закономерности в экспериментальных данных можно обнаружить путем статистической проверки результатов многих опытов, принимая или отклоняя определенные гипотезы. Процедура статистической проверки начинается с формулировки нулевой гипотезы Но (например, «нет статистически значимого различия») и альтернативной (конкурирующей) гипотезы («имеет место статистически значимое различие»). Затем на основании выборок экспериментальных данных производится проверка нулевой гипотезы относительно альтернативной с помощью соответствующего теста (критерия). Результатом статистической проверки является вывод о том, в скольких случаях, например, на каждые 100 проведенных испытаний в предположении определенной модели отклонения от модели можно считать случайными. Таким образом, на заданном стандартном уровне значимости исследователь может остановиться на одной из гипотез. Выводы можно и не приводить к стандартному уровню значимости. При этом говорят, что вычисляется Р-значение.
Изложенные в данной главе методы проверки гипотез применяются для пары выборок. Для числа выборок, большего двух, применяется дисперсионный анализ, рассмотренный в главе 3.
Основы теории проверки гипотез наиболее полно изложены в [167, с. 480]. Основные положения кратко даны в [135, с. 561].
Общая методика
Мы рассматривали понятие доверительного интервала при вычислении среднего значения. Вообще, утверждение о том, что некоторая статистическая величина 0 лежит в доверительном интервале от tQ до означает, что равенство
Р(Го<0<^) = 1-а,
где (1 - а) — коэффициент доверия (confidence level), иногда обозначаемый также как р,
а — уровень значимости (significance level), справедливо в (1 - а) случаях [91, с. 141].
Общая методика
77
Для проверки гипотезы выборочное пространство W разделяется на две области: w и ( W - ю), называемые критической областью и областью принятия. При попадании выборочной точки в область w гипотеза отвергается, при попадании в (IV - w) принимается. Если известно распределение вероятностей наблюдений, соответствующее Но, можно определить w так, чтобы при выполнении Но вероятность отвергнуть эту гипотезу была равна заранее заданной величине — уровню значимости [91, с. 221]:
Р{хе щ|Я0} = о
Если выбор пространств w и, следовательно, ( W- w) достаточно широк, то решение о принятии или непринятии гипотезы Яо существенно зависит от того, против каких альтернативных гипотез Нх она проверяется.
Вместо уровня значимости в программных реализациях мы часто используем значение коэффициента доверия (доверительного уровня), который связан с уровнем значимости простой формулой [135, с.211]:
р - 1 -а,
где уровень значимости равен вероятности ошибочного отклонения верной нулевой гипотезы [167, с. 483] и соответствует ошибке I рода, или ошибке а-типа. Другое определение дано в [26, с. 59]. Вероятность ошибочного принятия ложной нулевой гипотезы соответствует ошибке II рода, или ошибке Д-типа [91, с. 223]. Естественно стремление исследователя минимизировать ошибку I рода, снижая уровень значимости, но тогда возрастает вероятность ошибки II рода. В связи с этим вводят понятие мощности критерия, определяемой как вероятность того, что критерий отклонит ложную нулевую гипотезу:
P{.re(W-w)|H,}= 1-/3, или Р{хе<а|Н,} = 1-^
Значение (1 - Д) называется мощностью критерия. На практике мощность критерия можно повысить, увеличив объем выборки, а из двух критериев следует пользоваться более мощным критерием, если для его применения имеется достаточно оснований.
Вместо прямого использования статистических таблиц или применения некоторых пороговых значений вероятности там, где это возможно, мы реализовали все применяемые нами статистические рас
78
Глава 2. Проверка гипотез
пределения программно, вычислив функции распределения точно (рекуррентные алгоритмы, прямое интегрирование с гарантированной точностью) или с помощью аппроксимации.
Общая методика выводов при проверке гипотез заключается в выборе уровня значимости, обычно 0,05, с последующим сравнением данного уровня значимости с уровнем значимости, полученным в результате вычисления критерия значимости. Отметим, что произвести точное вычисление уровня значимости позволяют лишь некоторые из методик. Обычно же уровень значимости находится по таблицам в зависимости от вычисленного значения статистики критерия либо нормальной или иной аппроксимации данной статистики. В последнем случае, естественно, пользуются таблицами нормального распределения либо, соответственно, распределения, использованного для аппроксимации (чаще всего t- или F-распределения). Существует несколько стандартных формулировок, принятых в любых, в том числе и в биомедицинских, исследованиях, поэтому приведем их для справки (здесь р — уровень значимости, это обозначение стандартно для рассматриваемой области науки) [ 106, с. 212], [180, т.1, с. 221]:
1.	р > 0,05 — различия недостоверны, в случае недостоверных различий обычно ограничиваются уровнем значимости > 0,05, нулевая гипотеза об отсутствии различий может быть принята;
2.	р < 0,05 — различия достоверны на уровне значимости 0,05;
3.	р < 0,01 — различия достоверны на уровне значимости 0,01;
4.	р < 0,005 — различия достоверны на уровне значимости 0,005;
5.	р < 0,001 — различия достоверны на уровне значимости 0,001, причем данную формулировку можно применять и при р = 0.
В случаях 2,3,4 и 5 может быть принята альтернативная гипотеза о наличии различий на указанном уровне значимости. Для уровней значимости тестов нами обычно дается не табличное, а вычисленное «точное» значение. Такой подход применяется во многих коммерческих программных продуктах и называется вычислением Р-зна-чения [28, вып.1, с. 186], [37, с. 113], которое является решением так называемой обратной задачи: P-значение является величиной, получающейся в результате подстановки значения статистики критерия в ее функцию распределения. Фактически величина Р-значе-ния представляет собой вычисленный по опытным данным точный уровень значимости и иногда называется обратной вероятностью [231, с. 185]. Например, статистический вывод при этом может быть таким: средние двух выборок статистически различаются на уровне
Общая методика
79
значимости 0,012. В публикациях, однако, принято приводить ближайшее к вычисленному стандартное значение уровня значимости (или доверительного уровня): в данном примере стандартный уровень значимости (слово «стандартный» в публикациях обычно опускают) а = 0,05 как наименьшее стандартное значение, превышающее вычисленный уровень значимости. Очевидно, именно этот факт имеется в виду диссертантами по медико-биологической тематике, когда в своих работах они пишут: «различия достоверны при р < 0,05». Такая запись принята в литературе и вполне понятна, но запись «Р = 0,012» информативней.
Данная методика применима и при вычислениях так называемых критериев согласия, предназначенных для установления факта соответствия эмпирического распределения некоторому теоретическому, чаще всего нормальному, распределению. Разница в том, что если при вычислении критериев значимости желательным, если так можно выразиться, является установление различия между выборками (по меньшей мере р < 0,05), то при вычислении критерия согласия желательным для исследователя является доказательство отсутствия различий (то есть р > 0,05) между распределением эмпирической выборки и каким-либо теоретическим, чаще всего нормальным, распределением.
Для пересчета коэффициента доверия в соответствующий уровень значимости нужно применить формулу
а = 1 - р,
где р — коэффициент доверия.
Табл. 2.1 демонстрирует связь некоторых статистических характеристик, встречающихся в источниках.
Таблица 2.1. Разнообразие обозначений в статистических таблицах
Показатель	Обозначение	Единицы измерения	Формула связи с коэффициентом доверия
Уровень значимости	а	Доли	1 -Р
Р-значение	рили Р	Доли	1 -Р
Коэффициент доверия	рили Р	Доли	Р
Коэффициент доверия	Р	Проценты	ЮОр
Q-процентная точка	Q	Проценты	100(1 -р)
80
Глава 2, Проверка гипотез
Уровень значимости иногда обозначают как р, Q или Fи иногда дают его в процентах. Всевозможные комбинации встречаются зачастую в пределах одного издания, например см. [195], [32], [92]. Интерпретация выводов дана при обсуждении примеров данной и следующей глав. Обсуждение см. также в [70, с. 239].
Сравнение методик
Нет необходимости помещать в публикуемую работу результаты, полученные при анализе одних и тех же данных разными, но предназначенными для одного и того же типа анализа методами (кроме работ, целью которых является сравнительный анализ методов), особенно если результаты совпадают. Однако попробовать сделать расчеты по разным методикам настоятельно рекомендуется. С целью экономии места в публикации и внимания читателя достаточно привести результаты расчета только одним методом.
Тем более неверно приводить результаты расчетов разными методами, если они значительно различаются. В последнем случае нужно еще раз проверить условия адекватности применяемых тестов природе данных, а для публикации выбрать единственный метод, который наиболее подходит для целей исследования и, кроме того, был успешно опробован ранее для аналогичных целей. Мы не предлагаем отбросить результаты, не удовлетворяющие исследователя. Напротив, мы предлагаем исследователю разобраться в причинах, по которым расчеты разными методами различаются настолько, что вынуждают исследователя отбрасывать плохие, с его точки зрения, результаты. Причины расхождения результатов применения однотипных методик анализа данных могут быть следующие:
•	Допущены ошибки ввода данных.
•	Все или некоторые из примененных методик не подходят для рассматриваемого типа данных. Тип исходных данных для расчета определяет методику для их обработки.
•	При конструировании программ были допущены алгоритмические ошибки.
Исследователь, конечно же, может не учитывать эти рассуждения, однако это тот случай, когда почти невозможно проверить, были или нет выброшены «плохие» результаты — так или иначе придется положиться на честность исследователя.
О сравнении критериев см. [156, с. 137]. Замечания о выборе подходящего критерия даны в [231, с. 300].
Односторонняя и двусторонняя гипотезы
81
Односторонняя и двусторонняя гипотезы
Рассмотрим понятия односторонней (one sided) и двусторонней (two sided) гипотез [172, с. 15], [158, с. 142], которым соответствуют односторонний и двусторонний критерии значимости. Когда исследователь имеет достаточное количество данных, позволяющих предсказать в альтернативной гипотезе направление различий (например, доля желательных эффектов в опытной группе не просто отличается от контрольной, а превышает ее), используется односторонний критерий, в противном случае (опытная группа просто отличается от контрольной) используется двусторонний критерий.
Уровень значимости для двустороннего критерия в два раза превышает уровень значимости для одностороннего критерия. В табл. 2.2 представлены стандартные значения уровней значимости и коэффициентов доверия. То есть в определенном смысле его выводы «хуже». Слово «хуже» взято в кавычки, так как в зависимости от формулировки нулевой гипотезы и желательности выводов для исследователя (например, желательно не установить статистические различия, а, наоборот, показать отсутствие таких различий), «хуже» может означать «лучше».
Таблица 2.2. Стандартные значения уровней значимости и коэффициентов доверия
Уровень значимости (односторонний критерий)	0,001	0,005	0,01	0,05	0,1
Уровень значимости (двусторонний критерий)	0,002	0,010	0,02	0,10	0,2
Коэффициент доверия (односторонний критерий)	0,999	0,995	0,99	0,95	0,9
Коэффициент доверия (двусторонний критерий)	0,998	0,990	0,98	0,90	0,8
Для пересчета одностороннего значения уровня значимости в двустороннее значение можно воспользоваться простой формулой [187, с. 184]:
Двустороннее значение = 2  Одностороннее значение.
Для пересчета одностороннего значения коэффициента доверия в двустороннее значение нужно воспользоваться формулой:
82
Глава 2. Проверка гипотез
Двустороннее значение - 2 • Одностороннее значение - 1.
Обратный пересчет не вызовет затруднения:
Одностороннее значение = (Двустороннее значение + 1) / 2.
Обсуждению применения односторонних и двусторонних критери-2 ев посвящен раздел в [201, с. 39], где утверждается, что, даже если интересующее различие должно быть в одностороннем направлении, исследователь должен подстраховаться от неожиданных результатов, выполнив двусторонний тест. В том же источнике приводится ряд важных соображений о применении односторонних и двусторонних критериев в медицине. Мы не будем их здесь пересказывать. Отметим только, что в подавляющем большинстве исследований действительно применяется двусторонний критерий [там же, с. 41]. Подробное обсуждение проблемы в применении к медицинским данным дано также в [26, с. 74], [57, с. 88].
Независимые и сопряженные выборки
Данные, полученные в реальных экспериментах, могут быть представлены независимыми либо сопряженными выборками. Соответственно к этим выборкам применимы критерии значимости для независимых либо для сопряженных выборок.
Критерии для независимых выборок применяются, чтобы выявить статистическую значимость различий двух разных групп индивидуумов. Примерами независимых выборок могут служить:
•	параметры двух групп пациентов, к которым применялись различные методики лечения с целью изучения значимости различий между методиками;
•	параметры двух групп пациентов, к одной из которых (опытная группа) применялось воздействие методики, а к другой (контрольной) не применялось, с целью изучения значимости влияния данной методики на результат лечения.
Критерии, применяемые к выборкам с попарно сопряженными вариантами, называются парными критериями либо критериями для связанных или сопряженных выборок. Примеры сопряженных выборок:
•	параметры одной и той же испытуемой группы до и после воздействия какого-либо фактора, например методики лечения;
Параметрические тесты
83
•	параметры одного и того же объекта экспериментального исследования, но относящиеся к различным его частям, например состояния двух конечностей в процессе лечения, одна из которых подвергается лечебному воздействию, а другая нет.
Параметрические тесты
Критерии (тесты), при помощи которых могут быть сравнены статистические совокупности, разделяются на две группы: параметрические и непараметрические. Особенностью параметрических критериев является предположение о том, что распределение признака в генеральной совокупности подчиняется некоторому известному, в данном случае нормальному, закону. Нормальность эмпирического распределения выборки должна быть статистически доказана до применения любого параметрического теста с помощью одного из методов, рассмотренных в разделе «Критерии согласия» настоящей главы.
Параметрические критерии в большинстве случаев являются более мощными, чем их непараметрические аналоги. Если существуют предпосылки использования параметрических критериев, но используются непараметрические, увеличивается вероятность ошибки II рода, то есть вероятность принятия ложной нулевой гипотезы.
(-критерий Стьюдента
Пусть обе выборки извлечены из генеральных совокупностей, имеющих нормальные распределения с равными или неравными между собой известными или равными неизвестными дисперсиями. Нулевая гипотеза состоит в том, что средние совокупностей равны. Все наблюдения независимы (выборки не связаны попарно). Это означает, что сравниваться могут, например, две группы индивидуумов, одна из которых является опытной (к ней применялось воздействие какого-либо фактора), другая — контрольной (к ней воздействие фактора не применялось), но не одна и та же группа до и после воздействия фактора.
Критерий Стьюдента (t-критерий, two-group unpaired t-test) имеет множество применений. Внешне он прост в реализации, но, как это обычно бывает, за внешней простотой скрывается довольно много нюансов, учет которых представляет собой непростую задачу [52, с. 101].
84
Глава 2 Проверка гипотез
Отметим, что имеются данные о варианте f-критерия, связанном с рандомизацией, не требующем предположения нормальности [115, с. 236]. Интересный пример применения t-критерия при исследовании авторства литературных произведений рассмотрен в [204, с. 402].
Случай известных дисперсий
2	В случае равных известных дисперсий критерий вычисляется по фор-
муле [187, с. 176]
k.-^l
П Г
 — + —
«2
где все обозначения соответствуют данным в главе 1. Статистика имеет стандартное нормальное распределение.
В случае неравных между собой известных дисперсий статистика вычисляется по формуле [там же, с. 177]
°2
«2
Статистика также имеет стандартное нормальное распределение.
Легко заметить, что вторая из приведенных формул при равных известных дисперсиях превращается в первую формулу. А так как критические значения вычисляются одинаково в обоих случаях, вычисления технически могут быть выполнены одной и той же функцией.
В [152, с. 5] дана иная форма критерия Стьюдента для случая известного отношения дисперсий, для вычисления критических значений использующая распределение Стьюдента. Решение на языке про-граммироваия Бейсик дано в [184, с. 166].
Как легко заметить, формулой критерия Стьюдента можно воспользоваться, не имея первичных данных для анализа в виде таблиц. Подобная проблема иногда возникает при попытке проверить правильность выводов публикации, автор которой не захотел или забыл привести исходные данные для расчета, однако показал в тексте публикации, в таблице или на графике среднюю, ошибку средней, а также указал численности выборок. Используя формулы вычисле
Параметрические тесты
85
ния параметров средней, данные в главе 1, можно легко получить все необходимые числа для расчета статистики критерия Стьюдента, связав, таким образом, статистическую значимость с ошибками средних [7].
Случай равных неизвестных дисперсий
В случае равных неизвестных дисперсий [24, с. 72]
Н Г’
s — + —
V1 «2
где оценка выборочной дисперсии s2 считается как [187, с. 177]
52_512(И1-1) + 522(я2-1) п\ + п2 ~~ 2
а оценки дисперсий $2 и считаются по соответствующим выборкам, или [135, с. 568]
s2_s2n1+s2n2 +/?2 -2
если при вычислении дисперсий деление производилось не на (й1 - 1) и (п2 - 1), а соответственно на и, и п2.
Статистика имеет распределение Стьюдента с числом степеней свободы (и, + п2 - 2). Доверительный уровень вычисляется функцией TDistribution.
Критерий Стьюдента для связанных выборок
Назначение критерия Стьюдента для связанных выборок (парного критерия Стьюдента, two-group paired t-test) аналогично f-критерию Стьюдента для независимых выборок, рассмотренному выше, однако все наблюдения связаны попарно, например относятся к одному и тому же индивидууму (группе индивидуумов) до воздействия определенного фактора и после воздействия этого фактора, с целью выявить наличие эффекта от воздействия этого фактора. Требова
86
Глава 2. Проверка гипотез
ние равенства дисперсий двух выборок при этом не ставится. В источниках критерий может называться одновыборочным критерием Стьюдента. Это название вызвано тем обстоятельством, что на самом деле, исходя из представленной ниже схемы расчета, анализируется действительно одна выборка, составленная из попарных разностей вариант исходных связанных выборок. В данном случае проверяется нулевая гипотеза о равенстве среднего значения полученной выборки известному значению, а именно — нулю.
Вычисления производятся по формуле [84, с.253]
я
t= Ы
я ( п \2
УJr ;
где п — численность каждой выборки,
8i - xi -yt, i = 1,2,..., п, — попарные разности вариант совокупностей, х, i = 1, 2,..., п, — варианты первой совокупности, yit i = 1, 2,..., п, — варианты второй совокупности.
Статистика имеет распределение Стьюдента с числом степеней свободы (п - 1). Доверительный уровень вычисляется функцией TDistribution.
Описание и примеры даны также в [158, с. 184], [52, с. 286]. Решение на языке программироваия Бейсик дано в [184, с. 170].
Исходные коды
double StudentPairedTest (double х[].double y[].int n) 11
II Функция возвращает значение парного критерия Стьюдента // Обозначения:
// х - первая сравниваемая выборка.
// у - вторая сравниваемая выборка.
// п - численность каждой выборки.
// Возвращаемое значение:
// значение парного критерия Стьюдента.
// -2 при ошибке в вычислениях.
И
{
double s2 = O.d.s = 0:
for (register int i
0; i < n; i++)
Параметрические тесты
87
d = y[i] - x[i]: s += d:
s2 += d * d:
If ((d = n * s2 - s * s) == 0) return -2:
el se
return fabs (s) / sqrt (d / (n - 1));
Проблема Беренса—Фишера
При анализе выборок из генеральных совокупностей с неизвестными дисперсиями, равенство которых не предполагается [63, с. 228], либо если отношение дисперсий неизвестно [152, с. 3], возникает так называемая проблема Беренса—Фишера (Behrens—Fisher problem). Рассмотрим два подхода, применяемых для решения проблемы [115, с. 257].
Критерий Уэлча
Вычисления производятся по формуле Уэлча (Велча) [37, с. 275]
1*1-*г|
Г~2 F
р_ + ^2_
УП1 П2
где оценки дисперсий $2 и $2 считаются по сравниваемым выборкам. Распределение статистики d критерия Уэлча близко к t-распреде-лению Стьюдента при числе степеней свободы, [там же, с. 277], [187, с. 177], [158, с. 169]
(s^+s2/^)2 (s2/n,)2 , (s2/?z2)2 пх -1	-1
Доверительный уровень вычисляется функцией TDistribution с указанным выше числом степеней свободы.
В [24, с. 76] дана та же самая формула для определения числа степеней свободы, но в иной записи, и приведены формулы для вычисле
88
Глава 2. Проверка гипотез
ния доверительных границ для разности средних. Проблеме уделено большое внимание в [32, с. 49], [115, с. 258], [156, с. 91]. Гипотеза о равенстве средних нескольких (больше 2) выборок из нормальных генеральных совокупностей рассмотрена в [156, с. 93]. Многомерная проблема Беренса—Фишера рассмотрена в [15, с. 165].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
int nl = 53,
n2 = 20,
buf2:
double datal[] =
{165,164.158,168,162.166,167,154.165,164,172,167,164,157, 164,164.166,173.164.160,164.157,152,175.165,174.163.155. 163.162.178.166,165.163.168.161.164.173.161.161.160.164, 166.170.167.159,158,164.161,163.163,165,170}.
data2[] =
{182,183.168,174.165.174.163.168,179,185.171.174.180.175, 179.181,169,184.172,174},
buf.bufl:
if (!Welch (datal,data2,nl.n2.&buf,&buf2))
{
bufl = TDistribution (buf2,buf): cout « buf
« ", p = " « bufl
« ", n = " « buf2 « endl:
}
el se
cout « "Ошибка в вычисленияхХп":
}
int Welch (double *datal,double *data2,int nl.int n2,double *criterion.int *n)
11
II Функция сравнивает две выборки по критерию Стьюдента
// при неизвестных неравных дисперсиях (критерий Уэлча).
// Обозначения:
//	datal	-	первая выборка.
//	data2	-	вторая выборка,
//	nl	-	численность первой	выборки.
//	п2	-	численность второй	выборки.
// *criterion - критериальная статистика.
Параметрические тесты
89
//	*п - число степеней свободы.
// Возвращаемое значение:
//	0 при нормальном окончании расчета,
// -2 при ошибке в вычислениях.
И
{
double dl,d2. // Дисперсии ml,m2, // Средние sl.s2; // Рабочие величины
dl = Moment (2,datal,0,&ml,nl); d2 = Moment (2,data2,0,&m2.n2):
if (! dl && !d2) return -2;
///////////////////////////// // Вспомогательные вычисления si = dl / nl;
s2 = d2 / n2;
////////////////////////////////////// // Вычисление критериальной статистики ♦criterion = fabs (ml - m2) * sqrt (si + s2);
////////////////////////////////////
// Вычисление числа степеней свободы
*n = (int) floor ((si + s2) * (si + s2) /
(si * si / (nl - 1) + s2 * s2 / (n2 - 1)));
return 0; }
Критерий Пагуровой
Приближенное решение проблемы Беренса—Фишера дано Пагуровой [152, с. 3], которая предположила, что распределение статистики критерия существенно зависит от отношения неизвестных дисперсий. Критерий редко применяется исследователями, очевидно, по причине недостатка информации о нем. Надеемся, данная публикация еще раз обратит внимание исследователей на данный метод анализа.
Вычисление критерия Пагуровой производится по формуле, аналогичной формуле Уэлча:
"2
однако критические значения статистики берутся иные.
90
Глава 2. Проверка гипотез
Числа степеней свободы при поиске критического значения следует положить равными (пг - 1) и (п2 - 1). Критические значения статистики критерия вычисляются функцией InversePagurovaDistri-bution, вызов которой показан в разделе «Распределение критерия Пагуровой» главы 4. При этом параметр, зависящий от отношения дисперсий, считается как
г-______*---
Пример применения аналогичен предыдущему случаю и здесь не приводится. Предлагаемый подход к решению проблемы разобран также в [115, с. 257].
Исходные коды
int Pagurova (double *datal,double *data2,int nl.int n2,double ♦criterion,double *c) //
// Функция сравнивает две выборки по критерию Стьюдента
// при неизвестных неравных дисперсиях (критерий Пагуровой).
// Обозначения:
//	datal	-	первая выборка,
//	data2	-	вторая выборка,
//	nl	-	численность первой	выборки,
//	п2	-	численность второй	выборки.
// *criterion - критериальная статистика.
//	*с - параметр отношения дисперсий.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -2 при ошибке в вычислениях. //
{
double dl,d2, // Дисперсии ml.m2,	// Средние
sl,s2: // Рабочие величины
dl = Moment (2,datal.0,&ml.nl); d2 = Moment (2,data2.0.&m2.n2);
if (!dl && !d2)
return -2;
///////////////////////////// // Вспомогательные вычисления si = dl / nl;
s2 = d2 / n2;
Параметрические тесты
91
//////////////////////////////////////
// Вычисление критериальной статистики
♦criterion = tabs (ml - m2) * sqrt (si + s2):
///////////////////////////////////
// Вычисление параметра, зависящего
// от отношения дисперсий
*с = si / (si + s2):
return 0;
}
F-критерий Фишера
F-критерий Фишера применяют для сравнения дисперсий двух выборочных совокупностей. Критерий часто называют дисперсионным отношением [37, с. 259] или просто статистикой Фишера [187, с. 178]. Вычисление ведется по формуле [24, с. 75], предложенной Снедекором [111, с. 124]:
F = s2/s2>
где $2 — значение оценки большей дисперсии,
— значение оценки меньшей дисперсии.
Числа степеней свободы для поиска критического значения по таблице F-распределения следует взять равными - 1) и (п2 - 1). Доверительный уровень для односторонней гипотезы вычисляется функцией FDistribution. При вызове функции числа степеней свободы нужно взять равными численностям выборок. Вычитание единиц уже произведено в теле функции. Критическое значение статистики критерия для случая односторонней гипотезы может быть вычислено функцией InverseFDistribution. В случае двусторонней гипотезы при вызове функции следует доверительный уровень положить равным 1 - (1 - р) / 2.
Гипотеза о равенстве дисперсий сравниваемых совокупностей отвергается, если вычисленное значение статистики критерия превышает табличное на заданном доверительном уровне.
Описание критерия и примеры его применения см. в [158, с. 201], [140, с. 134], [101, с. 564], [180, т.1, с. 262]. Теоретическое обоснование дано в [115, с. 189]. Применение F-критерия при исследовании авторства литературных произведений упоминается в [204, с. 402].
92
Глава 2. Проверка гипотез
Исходные коды
int FTest (double *datal.doubl е *data2,double *criterion) //
// Функция сравнивает дисперсии двух выборок по F-критерию
// Фишера.
// Обозначения:
//	datal	-	первая выборка.
//	data2	-	вторая выборка.
//	п!	-	численность первой	выборки.
//	п2	-	численность второй	выборки,
// *criterion - критериальная статистика.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -2 при ошибке в вычислениях.
И
{
double dl,d2, // Дисперсии
m; // Фиктивный параметр
dl= Moment (2.datal.0,&m.nl);
d2= Moment (2,data2.0.&m,n2):
if (!dl && !d2)
return -2;
♦criterion = d2 >= dl ? d2 / dl : dl / d2;
return 0;
}
G-критерий различий средних
G-критерий предназначен для сравнения средних двух нормально распределенных совокупностей равного объема. Вычисление статистики критерия производится как [151, с. 143]
2 ”(rx+rJ
п	п
.»=1	1=1
где п — численность каждой выборки,
тх — размах первой выборки,
гу — размах второй выборки,
xit i - 1,2,..., п, — варианты первой выборки,
г/„ i = 1,2,..., п, — варианты второй выборки.
Доверительный уровень вычисляется функцией GTestDistribution.
Параметрические тесты
93
Исходные коды
double GTest (double х[].double у[],int n) //
// Функция возвращает значение G-критерия для проверки
// значимости различия между средними двух выборок равного // объема.
// Обозначения:
// х - первая сравниваемая выборка.
// у - вторая сравниваемая выборка.
// п - численность каждой выборки.
// Возвращаемое значение:
// значение G-критерия.
//
{
double w = MaximumOf (x.n) - MinimumOf (x.n) + MaximumOf (y.n) - MinimumOf (y.n);
if (!w) return 0;
el se
return fabs (VectorSum (x.n) - VectorSum (y.n)) / w * 2 / n; }
Параметрические множественные сравнения
Параметрические критерии могут быть использованы для множественного сравнения — иначе говоря, для сравнения двух групп выборок между собой. Каждая группа задается подобно тому, как задаются параметры массивов данных для рассмотренных ниже методов двухфакторного дисперсионного анализа.
Показано [52, с. 101], что при множественных сравнениях рассмотренные выше параметрические тесты применять нельзя. Для анализа используются их многомерные обобщения. Далее рассмотрены многомерные обобщения критерия Стьюдента. Реализации трех первых из рассмотренных критериев не показаны, так как они могут быть легко получены незначительной модернизацией одной из рассмотренных функций, например Welch или Pagurova.
Параметрические множественные сравнения подробно рассмотрены [16]. [Там же, с. 165] рассмотрена многомерная проблема Беренса-Фишера.
Критерий Стьюдента с поправками Бонферрони
Вычисление статистики критерия Стьюдента с поправками Бонферрони (Bonferroni) производится по формуле [52, с. 106]
94
Глава 2. Проверка гипотез
*л~*в| 2	2
°* А । ° В пв
где оА и <ув — равные ст известные внутригрупповые дисперсии, 2 пА и пв — численности групп.
В цитируемом источнике рассматривается случай т групп равной численности, для которого статистика имеет t-распределение с числом степеней свободы т(п - 1).
Критерий Ньюмена—Кейлса
Вычисление статистики критерия Ньюмена—Кейлса (Стьюдента— Ньюмена—Кейлса, Student—Newman—Keuls test) производится по формуле [52, с. 108]

~*в|
1 +J_
2 I пл пв
Критические значения для стандартных уровней значимости даны [там же, с. 110] в зависимости от числа степеней свободы, равного (N- т), где N — сумма численностей всех групп, а т — число групп.
Критерий Даннета
Имеется вариант рассмотренного выше критерия, предназначенный для сравнения нескольких групп выборок с контрольной. Предназначенный для этого критерий Даннета (Dunnett's test) вычисляется по формуле [там же, с. 116]
Критические значения для стандартных уровней значимости даны [там же, с. 114] в зависимости от числа степеней свободы, вычисляемого точно так же, как в предыдущем критерии.
Параметрические тесты
95
Критерий Т2
Критерий Т2 (критерий следа, критерий Хотеллинга, критерий Лоу-ли и Хотеллинга), для случая двух многомерных выборок предложенный Хоттелингом, применяется в задаче статистической проверки гипотезы о равенстве векторов средних двух многомерных совокупностей, когда ковариационные матрицы совокупностей, из которых отобраны выборки, равны между собой [70, с. 357]. Если искомая дисперсионно-ковариационная матрица совокупности неизвестна, она вычисляется через выборочные дисперсионно-ковариационные матрицы совокупностей по формуле [180, т.2, с. 216]
। 71^2	~
где 5, и S2 — выборочные дисперсионно-ковариационные матрицы многомерных совокупностей.
Статистика критерия вычисляется по формуле [там же]
Т2 =	- х2)' S-' (х, - х2) ,
П{ +П2
где и х2 — векторы средних двух многомерных совокупностей, — численность каждого ряда первой многомерной выборки,
п2 — численность каждого ряда второй многомерной выборки.
Можно заметить, что численности рядов, составляющих многомерные выборки, могут различаться, но в пределах одной выборки должны быть одинаковыми. Размерности же многомерных выборок всегда должны быть равными.
Доверительный уровень для рассмотренного случая двух многомерных совокупностей вычисляется функцией FDistribution, вызываемой с параметрами, указанными в примере. Случаи исследования более двух многомерных выборок представлены в [16, с. 57].
Описание и методику вычисления критерия см. также в [108], [139, с. 186]. [205, с. 527]. Связь с расстоянием Махаланобиса выведена в [190, с. 555]. Обобщения на случай более двух групп выборок подробно рассмотрены в [15, с. 152], [16, с. 50]. Близкий рассмотренному алгоритму критерий Уилкса представлен в [156, с. 102].
96
Глава 2 Проверка гипотез
Исходные коды
#include <fstream.h>
#include <iomanip.h>
#include "megastat.h"
void main (void)
{
int nl,	//	Численность	каждого	ряда	первой	выборки
п2,	//	Численность	каждого	ряда	второй	выборки
р =	4,	//	Размерность	каждой выборки
Code:	//	Код ошибки
double yl[] = // Первая многомерная выборка
{53,56,47,57.47,67,37,53.48.43,58,32,60.60,54,53,4В,56,47,47,60.37,58,32.4, 3,3.8.9.12.8.11,26.15.12,6,12,1.7.10.26.15,3,8,12.1.11.6,12.13.
33,37,14.21,28,23,41.66.22.38,26.50.38.31.34.66,22,37,14.28,38.41.26.50,37.
2.4.4.1,2,1.1,5,2.3.1.1.1,2,2.5,2.4.4.2.1.1.1.1.4}. у2[] = // Вторая многомерная выборка
{55.61.61.55.51.59.60,65,54.47.42.42,60.70.54.65,54.61,60.65,55,54.65.54.59.
1.2.1.4.1.1.2.2.3,4.8.4.4.0.3.2.3.1,4.2.4.3.2.3.4.
41.35,32,34.42,37.28,33,42.48.48.51,35.30.34.33.42.32.35.33.34.34.33,42.39.
1.2.2.1.3,0.0.0.0,1.1,1.1,0.1,0.0.2.1.0.1.1.0.0.0}. х; // Статистика критерия
nl = sizeof (yl) / sizeof (yl[0]) / р:
n2 = sizeof (у2) / sizeof (у2[0]) / р:
if («(Code = Hotelling (у1.у2.п1,п2,р,&х)))
cout « "Test value is " « x « "\nP-value is "
« FDistribution (p.nl + n2 - p - 1.x I (nl + n2 - 2) / p * (nl + n2 - p - 1))
« endl:
else if (Code == -1)
cout « "Not allocated memoryXn":
el se
cout « "Run-time errorXn";
}
int Hotelling (double yl[],double y2[j,int kl.int k2,int
p.double *h)
//
// Функция вычисляет Т-квадрат критерий Хотеллинга.
// Обозначения:
//	yl	-	первая многомерная выборка (ряды друг за	другом),
//	у2	-	вторая многомерная выборка (ряды друг за	другом).
//	kl	-	численность каждого ряда первой выборки,
//	к2	-	численность каждого ряда второй выборки,
//	р	-	размерность каждой выборки.
//	*h	-	вычисляемое значение статистики.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
Параметрические тесты
97
// -1 при недостатке памяти для рабочих массивов, // -2 при ошибке в вычислениях.
//
{
register int i.j;	//	Счетчик цикла
int Code,	//	Код ошибки
m,ml,m2,	//	Счетчик одномерного массива
p2 = p * p;	//	Рабочая величина
double *ysl.	//	Вектор средних первой выборки
	//	и массив разности средних
*ys2.	//	Вектор средних второй выборки
*s.	//	Ковариационная матрица
	//	и вспомогательный массив
*t.	//	Вспомогательный массив
*r;	//	Вспомогательный массив
If (!(ysl » new double[p])) return -1;
if (!(ys2 - new double[p]))
{
delete [] ysl;
return -1;
}
if (!(s = new double[p2]))
{
delete [] ysl; delete [] ys2;
return -1;
}
if (!(t = new double[p2]))
{
delete [] ysl; delete [] ys2; delete [] s:
return -1;
}
if (!(r = new double[p2]))
{
delete [] ysl: delete [] ys2; delete [] s; delete [] t; return -1;
}
///////////////////////////
// Параметры первой выборки
for (i » O.m - 0; i < p; ysl[1++] /= kl) for (j = 0,ysl[i] = 0; j < kl; j++)
ysl[i] +- yl[m++J;
MatrixTMultiplyMatrix (yl.yl,s.p.kl.p);
MatrixMultiplyMatrixT (ysl.ysl.r.p.l.p);
MatrixMultiplyNumber (r.p * p,-kl);
MatrixPlusMatrix (s.r,p2);
4-2002
98
Глава 2. Проверка гипотез
///////////////////////////
// Параметры второй выборки
for (1 = O.m = 0: 1 < р; ys2[i++] /= k2)
for (j = 0,ys2[i] = 0; j < k2; j++) ys2[i] += y2[m++]:
MatrixTMultiplyMatrix (y2,y2,t.p.k2.p):
MatrixMultiplyMatrixT (ys2.ys2,r,p,l.p);
MatrixMultiplyNumber (r.p * p,-k2);
MatrixPlusMatrix (t,r,p2);
/////////////////////////
// Ковариационная матрица
MatrixPlusMatrix (s,t,p2);
MatrixMultiplyNumber (s.p2,1.0 / (kl + k2 - 2)):
/////////////////////////////////// // Матрица, обратная ковариационной Code = InverseMatrix (s.t.p);
////////////////////////// // Массив разности средних for (i = 0; i < p: i++)
yslfi] -= ys2[i];
////////////////////////////////////// // Вычисление критериальной статистики MatrixTMultiplyMatrix (ysl,t,s,1.p,p); MatrixMultiplyMatrix (s,ysl,t,l,p,l);
*h = fabs (t[0] * kl * kl / (kl + k2)):
delete [] ysl; delete [] ys2; delete [] s; delete [] t; delete [] r:
return Code; }
Непараметрические тесты
Существует большое количество опытных данных, которые не показывают нормальности своего распределения, поэтому применение параметрических критериев не может быть обоснованным для данных рассматриваемого класса. Практически ценными явились методы, которые применимы в широком диапазоне условий. Слабая чувствительность к отклонениям от стандартных условий называется робастностью, а методы, применимые в широком диапазоне реальных условий, называют робастными [70, с. 314].
Непараметрические критерии не требуют предварительных предположений относительно вида исходного распределения и являются
Непараметрические тесты
99
более робастными, чем их параметрические аналоги, поэтому их называют также критериями значимости, независимыми от типа распределения. Естественно, непараметрические критерии применимы и для случая нормального распределения. Однако непараметрические критерии в большинстве случаев являются менее мощными, чем их параметрические аналоги. Если существуют предпосылки использования параметрических критериев, но используются непараметрические, увеличивается вероятность ошибки II рода, то есть вероятность принятия ложной нулевой гипотезы.
Изложение общих вопросов, связанных с рассматриваемой темой, дано в [14, с. 131], [57, с. 68], [58].
Критерии рандомизации
Ниже рассмотрено несколько критериев, объединенных общей идеей рандомизации компонент выборок или их рангов. При вычислении применяются комбинаторные алгоритмы (см. главу 17).
Критерий рандомизации компонент Фишера для независимых выборок
При анализе числовых результатов эксперимента исследователь часто сталкивается с проблемой невозможности расчета статистически значимых различий между выборками в силу очень малого размера выборок, вызванного условиями проведения опытов. Второй трудностью при анализе подобных данных является практическая невозможность установить вид распределения. В случае, если все же удается определить вид распределения, оно часто не является нормальным. Все это создает очевидные предпосылки для применения одного из непараметрических критериев, специально разработанных для малых выборок указанного типа. Критерий применяется для проверки нулевой гипотезы о том, отобраны ли две исследуемые выборки из генеральных совокупностей с одинаковыми средними [190, с. 468].
Методика теста базируется на идее перебора всех комбинаций наблюдаемых отметок. Пусть даны две выборки: х, i =1,2,..., пх, и у? 7=1,2,..., пу, где пх и пу — численности выборок. Сумма, меньшая из наблюдаемых, будет
4*
100
Глава 2. Проверка гипотез
Число благоприятных исходов вычисляется по формуле
Д i=l
"(Ц < S l,s, >5 '
где nt — оценка i-го исхода,
Ст — общее число исходов, Л
п = пх + пу — численность объединенной выборки,
т — численность выборки, соответствующей минимальной сумме
т
^=£zri=i,
здесь zfj = 1,..., т, — массив сочетаний из объединенной выборки. Одностороннее P-значение вычисляется по формуле
p=n/c;
и сравнивается с заданным уровнем значимости а. Например, проверяется нулевая гипотеза о равенстве средних двух выборок на уровне значимости 0,05. Предположим, вычислено р = 0,019048 < 0,05 или р = 0,988095 > 0,95, что вытекает из требования при оценке различий признавать значимыми как малые, так и большие величины статистики критерия [70, с. 337], [187, с. 110]. Нулевая гипотеза отклоняется и принимается альтернативная гипотеза о статистически значимом различии средних на уровне значимости менее 0,05.
Хотя критерий обычно применяют для анализа очень малых выборок, в [ 172, с. 110] даны минимальные значения выборок, позволяющие отклонить нулевую гипотезу (см. табл. 2.3).
Таблица 2.3. Минимально допустимые численности выборок для обоснованного применения критерия рандомизации компонент
	Односторонний критерий		Двусторонний критерий	
Уровень значимости	0,01	0,05	0,01	0,05
Минимальная численность выборки	5	6	7	8
Обсуждение см. в [180, т.2, с. 135]. Для больших выборок время решения задачи может быть продолжительным, что вызвано значи
Непараметрические тесты
101
тельным объемом вычислений, поэтому при больших численностях выборок вместо описанного здесь критерия рекомендуется применять представленные ниже 1Г-критерий Вилкоксона [180, т. 2, с. 123], [37, с. 234] и критерий Ансари—Брэдли [70, с. 337] либо модифицированный критерий Вилкоксона [там же, с. 336], которые являются критериями ранговой рандомизации. Имеются варианты рассмотренного критерия, например критерий Фишера—Питмэна [190, с. 470], при алгоритмическом построении функции вычисления которого могут быть использованы фрагменты показанной ниже функции RandomCriterionlndependent. Представленная функция очень компактна вследствие применения рекурсии при вычислении благоприятных сочетаний.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include "megastat.h"
void main (void)
{
int Code.	// Код ошибки
nx = 6.	// Численность первой
// выборки
ny = 3;	//	Численность второй
// выборки
double х[] =	{1,0.73.2,0.51.0.39,0.67}.//	Первый массив
у[] =	{1.22,1.8.2.22},	//	Второй массив
criterion;	//	Значение критерия
Code = RandomCriterionlndependent (x.y.nx.ny.&criterion);
if (’Code)
cout « "alpha = " « criterion « endl;
el se
cout « "Not enough memoryXn";
}
int RandomCriterionlndependent (double x[],double y[],int nx.int ny.double Criterion)
//
// Функция вычисляет значение критерия рандомизации для
// несвязанных выборок.
// Обозначения:
//	х	-	первая выборка,
//	у	-	вторая выборка,
//	пх	-	численность первой	выборки,
//	пу	-	численность второй	выборки.
// *criterion - вычисленное значение критерия.
102
Глава 2. Проверка гипотез
// Возвращаемое значение:
//	0 при нормальном окончании счета.
// -1 при недостатке памяти для размещения рабочих массивов. //
{
register int j.k; // Счетчик цикла
гэдьь int n,	// Численность суммарного массива
'	m.	// Численность выборки сочетаний
Code:	// Возвращаемый код ошибки
double nSUCCESS = 1, // Число благоприятных исходов
*dat,	//	Суммарный массив
sum,	//	Сумма	вариант
sumx,	//	Сумма	вариант	массива	х
sumy;	//	Сумма	вариант	массива	у
///////////////////////////////// // Выбор массива с меньшей суммой sumx = VectorSum (x,nx);
sumy = VectorSum (y.ny);
if (sumx >= sumy)
{
m = ny; sum = sumy;
}
el se { m = nx; sum = sumx;
}
////////////////////////////////
11 Построение суммарного массива n = nx + ny;
if ((dat = new double[n]) == 0) return -1;
k = 0;
for (j = 0; j < nx; j++) dat[k++] = x[j];
for (j = 0; j < ny; j++) dat[k++] = y[j];
///////////////////////////////
// Вычисление значения критерия
if (’(Code = Combination (dat,n,m,sum,&nSUCCESS)))
♦criterion = nSUCCESS / (Factorial (n) / Factorial (nx) / Factorial (ny));
delete [] dat;
return Code;
}
Непараметрические тесты
103
Критерий рандомизации компонент для связанных выборок
Критерий рандомизации компонент для связанных выборок применяется для проверки нулевой гипотезы о равенстве средних двух связанных совокупностей, в качестве которых взяты параметры некоторой группы испытуемых объектов до и после воздействия какого-либо фактора, например параметры группы больных до применения некоторой методики лечения и после лечения с целью выявления статистически значимого эффекта от методики лечения.
Основным моментом в реализации критерия является перебор возможных исходов, построенных из разностных отметок. Пусть даны две выборки: xt и yit i = 1,2,..., и, где п — число пар экспериментальных значений. Тогда сумма массива разностных отметок будет
i=l
Определим значения разностных отметок:
>1
где aijt i = 1,..., 2n,j =1,2,..., и, — элементы матрицы возможных исходов.
Систематизацию перебора всех возможных исходов мы проведем в соответствии с ортогональным планом эксперимента первого порядка, методика построения которого изложена в разделе «Полный ортогональный план» главы 12. Размер полного ортогонального плана составляет 2п строк на п столбцов, причем j-й столбец размером 2п представляет собой чередующиеся с шагом 2 t величины +1 и -1, j = 1,2,..., и.
Число благоприятных исходов вычисляется по формуле
2я
ЛГ= Л./Г ~
»=1
0,^<5 l,s. >5
Одностороннее P-значение, вычисляемое по формуле
р = ЛГ/2и,
104
Глава 2. Проверка гипотез
сравнивается с заданным уровнем значимости а. Например, проверяется нулевая гипотеза о равенстве средних двух выборок на уровне значимости 0,05. Пусть вычислено р = 0,932022 < 0,95. Нулевая гипотеза об отсутствии статистически значимого различия средних принимается на уровне значимости более 0,05.
В нашей реализации ортогональный план не хранится в памяти компьютера во время вычислений — каждая очередная строка насчитывается при необходимости. При больших численностях сравниваемых выборок время расчета может стать неприемлемо большим для диалоговой системы, поэтому в этих случаях рекомендуется применять Г-критерий Вилкоксона, являющийся критерием ранговой рандомизации [172, с. 116].
Хотя критерий рандомизации применяют для анализа малых выборок, минимальные численности выборок не должны быть меньшими, чем указано в табл. 2.3. Обсуждение с примерами см. в [там же, с. 109,120], [190, с. 468].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
int n = 16;	// Численность
// каждого массива
double x[] = {0.64.0.73.0.67.0.82.0.81.0.82.0.86.0.85,
// Первый массив
0.73.1.00.0.81.0.87.0.90.0.80.0.71.0.74}.
y[] = {0.77.0.77.0.77.0.83.0.83.0.77.0.84.0.90.
// Второй массив
0.91.0.93.0.90.0.78.0.88.0.89.0.72.0.73}, criterion;	// Значение статистики
// критерия
if (IRandomCriterion (х.у,n.&criterion)) cout « "alpha = " « criterion « endl:
el se
cout « "Not enough memory\n";
}
int Randomcriterion (double x[],double y[].int n.double ♦criterion)
//
Непараметрические тесты
105
// Функция вычисляет значение критерия рандомизации для // связанных выборок.
// Обозначения:
//	х - первая сравниваемая выборка,
//	у - вторая сравниваемая выборка,
//	п - численность каждой выборки.
// *criterion - вычисленное значение критерия.
// Возвращаемое значение:
//	0 при нормальном окончании счета.
// -1 при недостатке памяти //
{
register int i;
int *step.
*a;
long int j.
n2 = 2 « (n - 1):
double nl = 0,
*dat.
sum = 0.
suml;
для размещения рабочих массивов.
// Счетчик цикла
// Вектор шагов чередования
// Строка матрицы планирования
// Счетчик цикла
// Число возможных исходов
// Число благоприятных исходов
// Массив модулей разностей
// Пороговое значение
// Текущая сумма
if (!(dat = new double[n])) return -1:
if (!(step = new int[n]))
{
delete [] dat;
return -1;
}
if (!(a = new int[n]))
(
delete [] dat; delete [] step; return -1;
}
for (i = 0; i < n; i++)
{ dat[i] = x[i] - y[i];
sum += dat[i];
dat[i] = fabs (dat[i]): step[i] » TwoDegree (i); a[i] - -1;
}
///////////////////////////////// // Перечисление возможных исходов for (j = 0; j < n2; j++)
{
for (i = 0. suml = 0; i < n; i++)
106
Глава 2. Проверка гипотез
{
if (j / step[i] * step[i] == j) a[i] *= -1:
suml += dat[i] * a[i];
}
////////////////////// // Благоприятный исход if (suml >= sum) 2	nl++:
}
/////////////////////////////// // Вычисление значения критерия Criterion = nl / n2;
delete [] dat: delete [] step; delete [] a;
return 0;
}
l/U-критерий Вилкоксона
W-критерий Вилкоксона (критерий ранговых сумм Вилкоксона, двухвыборочный критерий Вилкоксона, статистика ранговой суммы Уилкоксона, Wilcoxon signed-rank test) применяется для сравнения двух независимых совокупностей одинаковой или разной численности по их центральной тенденции. Иначе говоря, по критерию Вилкоксона сравнивают центры двух эмпирических распределений, или эмпирические функции распределений [37, с. 233]. Этот критерий называется ранговым, так как он оперирует не численными значениями вариант, а их рангами, то есть местами в рядах, упорядоченных по возрастанию или убыванию вариант. Рассматриваемый критерий — один из самых популярных тестов среди исследователей-биологов и медиков и, исторически, один из первых критериев, основанных на рангах [187, с. 117]. Он является критерием ранговой рандомизации [190, с. 472] — процедура точного вычисления критерия Вилкоксона практически не отличается от вычисления критерия рандомизации компонент [37, с. 234], [180, т.2, с. 129] за исключением того, что манипуляции в алгоритме вычисления критерия Вилкоксона производятся не с самими вариантами выборок, а с их рангами.
Ранжирование сравниваемых выборок производят совместно. Данная процедура может быть организована различными способами, однако предпочтительным в смысле простоты реализации является объединение двух выборок, их сортировка, ранжирование и последующее разнесение рангов на места соответствующих им вариант
Непараметрические тесты
107
в обеих выборках. Если имеются совпадающие значения, совпавшим наблюдениям условились назначать средний ранг [37, с. 237]. Затем вычисление 1У-статистики критерия производится по формуле
ir = min|
I-1 1=1 J
где К., i = 1,..., nv— ранги выборки, имеющей наименьшую сумму рангов,
5., 2=1,..., п2 — ранги выборки, имеющей наибольшую сумму рангов. Если меньшая из сумм рангов меньше верхнего критического значения, различие между рядами достоверно на заданном стандартном доверительном уровне. Асимптотическая формула распределения статистики критерия дана в [32, с. 93]. Простая формула связи рассматриваемого критерия с СЛкритерием Манна—Уитни приведена в [151, с. 331], [120, с. 54], поэтому данный и следующий из описанных критериев в некоторых источниках носят наименование критериев Вилкоксона—Манна—Уитни. Как показано в главе 4, функция вычисления распределения {/-статистики Манна—Уитни может быть с успехом использована при вычислении точных значений распределения УУ-статистики критерия Вилкоксона.
Для практического вычисления критерия нами применяется другой подход [37, с. 236], [187, с. 120], основанный на том факте, что статистика
1У-Е[1У]
где£[1У] =	+ 1)/2 — математическое ожидание,
D[W] = 22^2^+ 1)/12 — дисперсия, которая при наличии совпадающих вариант корректируется, как показано в разделе «Непараметрические множественные сравнения» данной главы,
N= п{ + п2, распределена по стандартному нормальному закону. Если полученное значение статистики превышает 0,02, то в формулу вводится поправка на непрерывность: считается, что новое значение наименьшей суммы рангов равно W + 0,5 [37, с. 236]. Приведем простой пример. Пусть вычислено одностороннее Р-зна-чение, равное 0,033097. На уровне значимости < 0,05 принимается конкурирующая гипотеза о различии выборок.
108
Глава 2. Проверка гипотез
Методику вычисления критерия подробно приводят многие авторы. Мы рекомендуем [70, с. 326], [84, с. 264], [158]. Рассуждения с примером применения см. в [28, вып.2, с. 108], [156, с. 119]. Авторы [26, с. 132], [50, с. 141], [1111, с. ИЗ] описывают критерий Уайта, по технике вычислений совпадающий с представленным здесь критерием. Критерий Сэвиджа представлен [14, с. 132], критерий Кокса [14, с. 134]. Рассматривается обобщение критерия Вилкоксона на случай, когда анализируется более двух выборок [37, с. 239]. В этом случае критерий носит наименование Н-критерия Крускала (Крас-кела) и Уоллиса. Описана модификация критерия Вилкоксона, известная как критерий нормальных меток Фишера—Иэйтса—Терри—Гефдинга, отличающаяся от критерия Вилкоксона способом ранжирования [123, с. 193], а также критерий Фишера—Иэйтса [115, с. 265]. Все упомянутые варианты ранговых критериев могут быть получены из составленной нами функции путем незначительной модификации ее кода. В [70, с. 336] описан модифицированный критерий Вилкоксона, отличающийся по методике вычислений от W-критерия Вилкоксона только особым способом ранжирования. В сети Интернет по данной теме см. материалы, представленные на сайте «Высокие статистические технологии» (antorlov.nm.ru).
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
double x[] =	// Первая выборка
{12.0072.12.0064.12.0054.12.0016.12.0077}, y[] =	// Вторая выборка
{11.9853.11.9949.11.9985.12.0061}. criterion,	// Значение статистики
// критерия t;	// Параметр
// аппроксимации
int nx = sizeof (х) / sizeof (double). // Численность первой // выборки
ny = sizeof (у) / sizeof (double); // Численность второй // выборки
if (’WilcoxonTest (x.y.nx.ny.&criterion.&t))
Издание 1980 года.
Непараметрические тесты
109
cout « "Статистика критерия " « criterion
« "ХпАппроксимация " « t
« "\пР-значение " « (1.0 - NormalDistributionl (t)) « endl:
el se
cout « "Мало памятиХп":
}
int WilcoxonTest (double x[],double y[].int nx.int ny.double ♦criterion.double *t) // // Функция вычисляет значение W-критерия Вилкоксона // для односторонней гипотезы. // Обозначения: //	х	-	первая сравниваемая выборка. //	у	-	вторая сравниваемая выборка. //	пх	-	численность первой выборки. //	пу	-	численность второй выборки, // *criterion - вычисленное значение критерия, //	*t - параметр нормальной аппроксимации. // Возвращаемое значение: //	0 при нормальном окончании счета. // -1 при недостатке памяти. // { register int i;	// Счетчик		
int *ix = 0, n = nx + ny. save;		// Информация о перестановках // Общая численность // Буфер
double *xx.*yy, *xy. xn = 0,yn tt;	= 0	// Массивы рангов // Рабочий массив . // Суммы рангов // Поправка на объединение рангов
if (1(ix = new int[n])) return -1:
if (!(xy = new double[n]))
{ delete [] ix: return -1:
}
if (!(xx = new double[n]))
{ delete [] ix: delete [] xy; return -1:
}
if (!(yy = new double[ny]))
{
delete [] ix: delete [] xy: delete [] xx: return -1:
}
110 Глава 2. Проверка гипотез
////////////////////////////
// Слияние исходных массивов
for (1=0; 1 < nx; 1++) ху[1] = х[1];
for (1 = 0; 1 < пу; 1++) ху[1 + пх] = у[1];
М//////////////////////////// +2	// Сортировка по возрастанию
SortArrayUp (ху,п,1х,1);
lllllllllllllll
// Ранжирование tt = Rank (xy,xx,n);
////////////////////////////////
// Восстановление порядка рангов UnSortArray (xx.xy,n,ix);
lllllllllllllll НШП III
II Вычисление суми рангов for (1=0: 1 < nx; 1++) xn += xy[i];
for (1=0; 1 < пу; 1++) yn += xy[1 + nx];
11IllllllIII III III III III Illlllllllllllll!Ill III
II Параметры выборки с наименьшей суммой рангов
if (хп <= уп)
*criterion = хп;
el se { ♦criterion = уп; save = пу;
пу = пх; nx = save;
}
////////////////////////////////////
// Параметр нормальной аппроксимации
*t = fabs ((*criterion) - 0.5 * nx * (n + 1)) /
sqrt (0.0833333333 * nx * ny * (n + 1 - tt / n / (n -1)));
//////////////////////////////////////
// Расчет с поправкой на непрерывность
if ((1.0 - NormalDistributionl (*t)) > 0.02)
*t = fabs ((*criterion + 0.5) - 0.5 * nx * (n + 1)) /
sqrt (0.0833333333 * nx * ny * (n + 1 - tt / n / (n - 1)));
delete [] ix; delete [] xy: delete [] xx; delete [] yy;
return 0;
}
Непараметрические тесты
111
(/-критерий Манна—Уитни
[/-критерий Манна—Уитни (Вилкоксона—Манна—Уитни) предназначен для проверки нулевой гипотезы о том, что совокупности распределены одинаково, или для проверки равенства других характеристик, например средних. Наблюдения должны быть независимыми (непарными). Вычисления производятся по формулам [158, с. 171]:
Ц =	+	+ 1)/2-Яр
(/2 =	+ П2(П2 + 1)/2 - R2,
U = max (Ц,[/2),
где Rt и R2 — суммы рангов выборок,
и п2 — численности соответствующих выборок.
В другой записи статистика Манна—Уитни определяется эквивалентным выражением [120, с. 53]
м >1
где/гу =
и 7-1 2 п °»Х,(О^Х2О)
В [229, с. 35] по данной формуле вычисляется статистика Вилкоксона, причем заслуживают внимания также рассуждения о применении бутстреп-метода для вычисления статистики.
Имеются [151, с. 331] рекуррентные формулы точного вычисления критического значения (/-статистики, пригодные для составления подробных статистических таблиц, реализованные в главе 4. Практически значимость может вычисляться посредством нормальной аппроксимации критического значения критерия. Как показал опыт расчетов, это не ведет к большой погрешности даже при малых выборках (размером 6 и выше). При этом модифицированная статистика
U-E[U]
где £[[/] = nln2 /2 — математическое ожидание,
112
Глава 2. Проверка гипотез
Z>[L/] = пгп2 + 1 )/12 — дисперсия, которая в случае совпадений корректируется, как показано в последнем разделе параграфа,
N = пх + п2,
распределена по стандартному нормальному закону [57, с. 76], [158, с. 173], [174, с. 130].
Результаты вычислений с помощью описываемого критерия совпадают с результатами применения lV-критерия Вилкоксона. Методику вычисления критерия и примеры см. в [26, с. 134], [52, с. 327], [57, с. 72,76], [140, с. 228], [172, с. 79], [180, т. 2, с. 129], [190, с. 465]. Простая формула связи рассматриваемого критерия с W-критери-ем Вилкоксона приводится также в [28, вып. 2, с. 111], поэтому можно было бы вообще не рассматривать критерий Манна—Уитни отдельно, однако, во-первых, он традиционно применяется многими исследователями (в частности, физиологами), а во-вторых, на статистике 17-критерия Манна—Уитни основан многомерный тест Джонкхиера—Терпстра.
Исходные коды
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{ double x[] =	// Первая выборка
{12.0072,12.0064,12.0054,12.0016.12.0077}.
y[] =	// Вторая выборка
{11.9853,11.9949.11.9985.12.0061}. criterion,	// Значение статистики
// критерия
t;	// Параметр аппроксимации
int nx = sizeof (х) / sizeof (double),// Численность первой
// выборки
ny = sizeof (у) / sizeof (double);// Численность второй
// выборки
if (IMannWhitneyTest (x.y.nx.ny.&criterion.&t)) cout « “Статистика критерия " « criterion
« "ХпАппроксимация " « t « "\пР-эначение “ « (1.0 - NormalDistributionl (t)) « endl;
else cout « "Мало памяти\п“;
}
Непараметрические тесты 113
\
int MannWhitneyTest (double х[],double y[].int nx.int ny.double ♦criterion.double *t)
// 1
// Функция вычисляет значение U-критерия Манна-Уитни.
// Обозначения:
//	х	-	первая сравниваемая выборка,
//	у	-	вторая сравниваемая выборка.
//	пх	-	численность первой выборки.
//	пу	-	численность второй выборки.
// *criterion - вычисленное значение критерия,
//	*t - параметр нормальной аппроксимации.
// Возвращаемое значение:
//	0 при нормальном окончании счета.
// -1 при недостатке памяти.
//
{
int *ix,	// Информация об отсортированном массиве
п - пх + пу; // Общая численность
register int i.j; // Счетчик
double buf.	//	Значение критерия U1
*s,	//	Объединенный массив
*хх.	//	Массив рангов
tt;	//	Поправка на объединение рангов
if (!(s = new double[n])) return -1;
if (!(ix = new int[n]))
{ delete [] s; return -1;
}
if (!(xx = new double[n])) Г
delete [] s; delete [] lx;
return -1;
}
///////////////////////////////////
// Построение объединенного массива
J = 0;
for (i = 0; i < nx; i++) s[j++] = x[i];
for (i = 0; i < ny; i++) s[j++] - y[i];
// Сортировка по возрастанию SortArrayUp (s,nx + ny.ix.l);
llllllllllllllllllll
11 Вычисление рангов
114
Глава 2. Проверка гипотез
tt = Rank (s.xx,n);
lllllllllllllllllllllllllllllllllllllllllllllllllll II Восстановление порядка рангов массива со знаками UnSortArray (xx,s,nx + ny.ix);
///////////////////////////////
// Вычисление значения критерия
but = nx * ny + пх * (пх + 1) / 2 - VectorSum (s,nx); ♦criterion - MaximumOf (buf.nx * ny - buf);
//////////////////////////////////// // Параметр нормальной аппроксимации *t = (*criterion - 0.5 * nx * ny) / sqrt (0.0833333333 * nx * ny * (n + 1 - tt / n / (n -1))):
delete [] xx; delete [] ix; delete [] s;
return 0;
}
T-критерий Вилкоксона для связанных выборок
Г-критерий Вилкоксона (одновыборочный критерий Вилкоксона, знаковый ранговый критерий Уилкоксона, критерий знаковых рангов Уилкоксона), в отличие от W-критерия Вилкоксона, применяется для сравнения выборок с попарно сопряженными вариантами. Критерием проверяется статистическая значимость нулевой гипотезы о том, что распределение случайных величин (эти случайные величины в рассматриваемом нами случае представляют собой разности случайных величин, соответствующих двум другим выборкам) симметрично относительно нуля [37, с. 241]. Например, критерием сравниваются выборки, представляющие собой параметры одной и той же совокупности до и после воздействия некоторого фактора с целью выявления эффекта от воздействия данного фактора. Другое название критерия — критерий Вилкоксона для сопряженных пар, Г-дельта-критерий, W-критерий Вилкоксона [1111, с. 115], [28, вып. 2, с. 123], [52, с. 338] либо просто критерий Вилкоксона.
Как и в предыдущем случае, методика точного вычисления критерия полностью совпадает с критерием рандомизации компонент для связанных выборок с тем исключением, что манипуляции производятся не с вариантами выборок, а с их рангами. Методика приближенных
Издание 1980 года.
Непараметрические тесты
115
вычислений похожа на процедуру вычисления W-критерия Вилкоксона, однако здесь мы оперируем абсолютными величинами разностей вариант. Массив разностей ранжируется. Затем рангам добавляются знаки разностей, и вычисляется наименьшая из сумм положительных W+ рангов, которая сравнивается с критическим значением. Функция WilcoxonTDistribution, вычисляющая уровень значимости нулевой гипотезы об отсутствии статистически значимых различий между выборками, может применяться для построения таблиц распределения критических значений критерия, в том числе в областях варьирования параметра, не затабулированных в литературных источниках.
Для практического вычисления критерия мы применяем подход [37, с. 243], [187, с. 127], учитывающий факт, что статистика
W+-E[W+]
где £[W+] = N(N+ 1)/4 — математическое ожидание,
£)[№+] = N (N + 1)(2N + 1)/24 — дисперсия, которая в случае совпадений рангов корректируется, как показано в разделе «Проблема совпадений в критериях Вилкоксона» данной главы,
N— численность каждого ряда,
распределена по стандартному нормальному закону.
Пример. Предположим, вычислено P-значение, равное 0,086476. Следовательно, различия можно признать значимыми на уровне значимости <0,1.
Методику вычисления дают [50, с. 139,151], [57, с. 71], [120, с. 55], [156, с. 115], [158, с. 188], [187, с. 126]. В [180, т.2, с. 124] дается более точная аппроксимация Имана и указаны полезные ссылки. Обсуждение см. в [115, с. 271], где также описан одновыборбчный аналог критерия Фишера—Иэйтса (ссылки в описании W-критерия Вилкоксона).
Исходные коды
#include <fstream.h>
#include <iomanip.h> include <math.h>
#include "megastat.h"
void main (void)
116
Глава 2 Проверка гипотез
double х[] = {1490,1300.1400.1410,1350,1000},// Первая // выборка
у[] = {1600.1850,1300.1500,1400.1010}, // Вторая выборка
criterion,	// Статистика теста
t;	// Значение
// аппроксимации
int n = sizeof (х) / sizeof (double);	// Численность
// каждой выборки
if (!Wi1coxonSignedTest (x.y.n.&criterion.&t))
cout « "Статистика " « criterion « "ХпАппроксимация " « t
<< "\пР-значение " <<(1.0 - NormalDistributionI (t)) << endl; el se
cout « "Мало памяти для вычислений\п";
}
int WilcoxonSignedTest (double x[],double y[].int n,double ♦criterion,double *t) //
// Функция вычисляет значение парного Т-критерия Вилкоксона.
// Обозначения:
//	х - первая сравниваемая выборка,
//	у - вторая сравниваемая выборка,
//	п - численность каждой выборки,
// *criterion - вычисленное значение критерия.
//	*t - параметр нормальной аппроксимации.
// Возвращаемое значение:
//	0 при нормальном окончании счета.
// -1 при недостатке памяти,
// -2 при ошибке в вычислениях.
//
{
register int i.j; // Счетчик
int *ix;	//	Информация о сортировке
double *spx,*spy,// Копии исходных массивов
*хх. // Массив рангов
save; // Буфер, затем поправка на объединение рангов
if (!(spx » new double[n]))
return -1;
if (!(spy » new double[n]))
{
delete [] spx;
return -1;
}
///////////////////////////////////////
// Работаем с копиями исходных массивов
Непараметрические тесты
117
ArrayToArray (x.spx.n);
ArrayToArray (y.spy.n);
/ / / / / / / / / / / / / / / / / И /
// Массивы разностей
for (i = 0; i < n; i++)
{
save = spx [i];
spx[i] = fabs (spxfi] - spyfi]); // Разности без знаков spy[i] = save - spy[i];	// Разности co знаками
}
if (!(ix = new int[n]))
{
delete [] spx; delete [] spy;
return -1;
}
////////////////////////////
// Сортировка по возрастанию
SortArrayUp (spx.n.ix.l):
if (!(xx = new double[n]))
{
delete [] spx; delete [] spy: delete [] ix;
return -1;
}
lllllllllllllll
II Ранжирование
save = Rank (spx.xx.n);
///////////////////////////////////////////////////
// Восстановление порядка рангов массива со знаками UnSortArray (xx,spx.n,ix);
delete [] ix; delete [] xx;
///////////////////////////////////////
// Сумма рангов положительных разностей
for (i = 0, Criterion = 0; i < n; i++)
if (spy[i] >= 0)
(♦criterion) += spxfi]:
delete [] spx: delete [] spy;
*t = fabs ((*criterion) - 0.25 * n * (n + 1)) /
sqrt (0.0416666667 * n * (n + 1) * (2 * n + 1) -
0.0208333333 * save);
return 0;
}
118
Глава 2. Проверка гипотез
Критерий Ансари—Брэдли
Критерий Ансари—Брэдли относится, как и описанные выше критерии Вилкоксона и Манна—Уитни, к группе критериев ранговой рандомизации и предназначен для статистической проверки нулевой гипотезы о равенстве дисперсий двух совокупностей. Вычисления статистики критерия производятся по формулам [70, с. 337]:
4 ‘ 4
' 48и,(и-1) п2(п-2)(и +2)
если п — четное,
W =

f 48n,(n-l)
п2(п +1)(и +3)
, если п — нечетное,
где Rt, i -1,..., nv — ранги первой выборки,
— численность первой выборки,
п2 — численность второй выборки, п — общая численность двух выборок, причем процедура присвоения рангов отличается от аналогичной процедуры для рассмотренного ранее критерия Вилкоксона. Данная процедура подробно описана в [там же, с. 338] и может быть проиллюстрирована показанным исходным текстом программы. Распределение величин W при больших численностях выборок примерно совпадает со стандартным нормальным распределением. При этом выводы могут быть такими: предположим, вычислен доверительный уровень 0,968. Следовательно, наблюдается статистически значимое различие между выборками на доверительном уровне более 0,95 (ближайшее стандартное значение, не превышающее вычисленное) или уровне значимости менее 0,05.
Описанный критерий, в отличие от критериев Вилкоксона и Манна-Уитни, мало применяется отечественными исследователями, но популярен за рубежом. Метод включен во многие программные продукты анализа данных и пакеты прикладных программ. См. также [156, с. 125].
Исходные коды
#include <fstream.h>
#include <iomanip.h>
^include <math.h>
Непараметрические тесты
119
#include "megastat.h"
void main (void)
{
int nx = 10. // Численность первой выборки
ny = 12: // Численность второй выборки
double х[] = // Первая выборка
{3.6,3.91.3.75.4.03.3.96.3.4,3.67.3.72.4.01.3.64}. у{] = // Вторая выборка
{3.65,3.84.3.77,3.82.3.76.3.54.3.8,3.73,3.76.3.69.3.73,3.63}. w; // Статистика критерия
if (!(AnsariBradleyTest (х.у,nx,ny,&w)))
cout	<<	"W = " « w « ".	p = " << NormalDistribution (w)
	<<	endl:	
el se			
cout	«	"Мало памяти\п";	
}
int AnsariBradleyTest (double xL],double y[].int nx.int ny,double *criterion)
//
// Функция вычисляет значение критерия Ансари-Брэдли.
// Обозначения:
//	х	-	первая сравниваемая выборка.
//	у	-	вторая сравниваемая выборка,
//	пх	-	численность первой выборки.
//	пу	-	численность второй выборки.
// *criterion - вычисленное значение критерия.
// Возвращаемое значение:
//	0 при нормальном окончании счета,
// -1 при недостатке памяти.
//
{ register int i.j; // Счетчик
int n = nx + ny, // Общая численность массивов
*ix,	//	Вспомогательный информационный	массив
nn;	//	Рабочая переменная
double *г.	//	Общий массив, затем	массив	рангов
*s;	//	Рабочий массив
if ((г = new doubleLn]) == 0) return -1;
if ((s = new doubleLn]) == 0)
{ delete L] r; return -1:
}
if ((ix = new intLn]) =» 0)
120
Глава 2, Проверка гипотез
{ delete [] г: delete [] s: return -1:
}
///////////////////
II Слияние массивов
for (i = 0; i < nx; i++) r[i] = x[i]:
for (1 = nx. j = 0: i < n; i++, j++) rfi] = y[jl;
//////////////////////////// // Сортировка общего массива SortArrayUp (r.n.ix.l):
//////////////////////////////
// Ранжирование общего массива
if (Parity (n))
{ nn = n / 2; for (i = 0. j = nn; i < nn; i++) r[i] = j—;
} el se
{ nn = (n - 1) / 2; for (i = 0. j = nn; i <= nn; i++) r[i] = j—;
}
for (i = nn. j = 1; i < n; i++) r[i] = j++;
/////////////////////////////////////// II Восстановление оригинального порядка UnSortArray (r.s.n.ix);
///////////////////////////////
// Значение статистики критерия
if (Parity (n))
♦criterion = (VectorSum (s.nx)	/	nx	- (n	+ 2)	/ 4)	*
sqrt (48.0 * nx * (n	-	1)	/	ny /	(n -	2) /	(n	+	2));
el se
♦criterion = (VectorSum (s.nx)	I	nx	-	(n +	1) * (n + 1)	/	4	/n)*
sqrt (48.0 * nx * (n	-	1)	/	ny /	(n +	1) /	(n	+	3));
delete □ r; delete [] s; delete [] ix;
return 0;
}
Непараметрические тесты
121
Проблема совпадений в критериях Вилкоксона
Рассмотрим две проблемы, возникающие при использовании критериев типа критерия Вилкоксона.
Первая проблема — равных рангов — не имеет места при точном вычислении статистик критериев, а возникает только при вычислении нормальной или иной аппроксимации критериев. При наличии совпадений в паре анализируемых выборок совпадающим наблюдениям приписывается средний ранг [37, с. 237], что удобнее всего сделать с помощью функции ранжирования Rank. При этом формулы для вычислений нормальных аппроксимаций статистик критериев остаются совершенно теми же, однако формулы для дисперсий, применяемых для их вычисления, корректируются.
Для W-критерия Вилкоксона соотношения для дисперсии запишутся как [37, с. 238]
у+1------£— ,
12 L N(N-i)
где Т— поправка на объединение рангов, определенная в разделе «Ранжирование» главы 1,
N = n{ + п2,
остальные обозначения те же, что и ранее.
Для 17-критерия Манна—Уитни модифицированные соотношения для дисперсии запишутся точно так же, как для W-критерия, [174, с. 130] с той лишь разницей, что вместо £)[ W] следует записать D[U]. Для Т-критерия Вилкоксона новая дисперсия будет считаться по формуле [187, с. 128]
N(N+1)(2N + 1) Т
1 J 24	48 ’
где N — численность каждого ряда, остальные обозначения те же, что и ранее.
В составленных программах совпадения учитываются. Легко заметить, что модифицированные соотношения при числе связок, равном нулю, обращаются в обычные соотношения. Следовательно, достаточно использовать только формулы для модифицированных соотношений, а в обычном случае поправка на объединение рангов просто полагается равной нулю.
122
Глава 2, Проверка гипотез
Другая проблема, возникающая только в алгоритме вычисления Г-критерия Вилкоксона,— наличие совпадений одновременно в двух анализируемых выборках, что приводит к нулевым разностям. В [37, с. 244], [84, с. 269] применяется прием вычеркивания равных сопряженных вариант из сравниваемых выборок. При этом соотве-ственно уменьшаются объемы выборок на количество выброшенных значений [187, с. 127]. Если будет принято решение воспользоваться этим алгоритмом, его удобнее и проще будет реализовать непосредственно перед вызовом функции вычисления статистики Г-критерия, не утяжеляя саму функцию данной процедурой. Функция может быть запрограммирована подобно методу Compare из главы 14, однако нужно учесть, что выбрасывать нужно только сопряженные пары, тогда как в методе Compare решается более общая задача.
Из сказанного уже понятно, что в настоящее время проблема совпадений не может считаться до конца решенной [37, с. 244], [187, с. 123].
Критерии^2
2
Критерий X имеет множество применений при проверке гипотез, в дисперсионном анализе и при использовании других методов анализа данных. Критерий предназначен для проверки нулевой гипотезы о том, что исследуемые случайные величины имеют одинаковое распределение. Рассмотрим применение критерия для признаков, измеренных (оба признака сразу) в количественной, порядковой или номинальной шкалах. Случаи, когда шкалы измерений сравниваемых выборок различны, будут рассмотрены позднее.
Критерий X* количественных и порядковых признаков
Вычисление статистики критерия X2 при сравнении эмпирических распределений равного объема производится по формуле [84, с. 270-283]
r2_^(Z~g.)2 Х Ь f^g,
где/, gt, i =1,2,..., п,— частоты распределений сравниваемых выборок, — численность каждого массива частот распределения.
Непараметрические тесты
123
При сравнении эмпирических распределений разного объема (численности массивов частот распределений должны совпадать) формула должна быть видоизменена:
У г _ 1 у (fin2 ~8jni) ( fi+gi ’
2
где nv п2 — численности сравниваемых выборок.
При = п2, вторая формула, как можно заметить, в точности соответствует первой, поэтому в программу заложена именно она. При этом размеры рядов в функцию не передаются — они вычисляются как суммы соответствующих вариационных рядов.
Для применения критерия ряды частот распределения должны иметь одинаковый объем и одинаковые классовые интервалы, что гарантируется при разнесении вариант по классам функцией А11о-cateCommon.
Необходимо обратить внимание, что критерий /2 оперирует не первичными данными, а распределениями вариант сравниваемых совокупностей по классам, поэтому должны соблюдаться минимальные требования о величинах анализируемых выборок. В случае, если число классов меньше 7, корректность вычислений будет под вопросом, хотя минимальная величина выборки равна 4. Данным критерием рекомендуется проводить сравнение рядов длиной не менее 40, по другим данным — не менее 20 [195, с. 128].
Доверительный уровень вычисляется функцией ChiSquareDistri-bution при числе степеней свободы (п - 1).
Многочисленные примеры применения критерия и обсуждение даны в [84, с. 273], [28, с. 35], [140, с. 119]. В [180, т.1, с. 365] анализируются сложности применения критерия по поводу объединения соседних классов с малой численностью.
Исходные коды
double ChiSquare (double fl[],double f2[],int n) //
// Функция вычисления значения критерия хи-квадрат Пирсона // для проверки нулевой гипотезы о том. что две независимые // случайные величины имеют одинаковое распределение.
// Обозначения:
//	fl	-	массив частот распределения	1-го ряда.
//	f2	-	массив частот распределения	2-го ряда,
//	п	-	численность каждого массива	частот распределения.
// Возвращаемое значение:
124
Глава 2 Проверка гипотез
// значение критерия хи-квадрат. //
{
register int i; // Счетчик цикла
double chi = 0. //	Возвращаемое значение
s,	//	Вспомогательная переменная
nl,	//	Число вариант 1-го ряда
п2;	//	Число вариант 2-го ряда.
nl = VectorSum (fl.n);
n2 = VectorSum (f2,n);
for (i = 0; i < n; i++)
if (fl[i] + f2[i] != 0)
{
s = fl[i] * n2 - f2[i] * nl;
chi += s * s / (flfi] + f2[i]): }
return chi / nl / n2: }
Критерий Z2 для номинальных признаков
2
Рассмотрим применение критерия X для анализа таблиц сопряженности признаков (критерий однородности X ) [24, с. 77]. Анализируются номинальные (при числе градаций, равном двум,— бинарные, или дихотомические) или приведенные к номинальной шкале данные, представленные в виде таблицы сопряженности признаков. По столбцам данной таблицы расположены градации анализируемых признаков, по строкам — анализируемые выборки. Каждый элемент таблицы представляет собой число, выражающее количество индивидуумов, которые имеют признак, соответствующий данной градации. Таким образом, схема вычислений позволяет количественно выразить степень зависимости между анализируемыми номинальными выборками. Вычисления статистики критерия производятся по формуле


где а , i = 1,2,..., r,j =1,2,..., с, — таблица сопряженности признаков, г — число столбцов таблицы (число выборок), с — число строк таблицы (число градаций признака),
Непараметрические тесты
125
eijt i = 1,2,r,j = 1, 2,..., с, — соответствующие а~ ожидаемые величины, вычисляемые как произведение i-ro столбца и J-й строки, деленное на сумму элементов всей таблицы сопряженности.
Число степеней свободы для вычисления P-значения статистики критерия X берется [89, с. 73] равным (г- 1)(с - 1).
Наименование функции, производящей вычисления статистики критерия, взято по имени ученых, изучивших вычисление критерия для случая с = 2 [24, с. 82]. Необходимое пояснение: исходные данные (таблица сопряженности) в показанную функцию вводятся по строкам. В качестве возможного варианта программного решения можно предложить определять суммы столбцов и строк заново при каждом вычислении ожидаемых частот. Это несколько увеличит время вычислений, но позволит отказаться от динамического выделения памяти для рабочих массивов.
Обсуждение дано в [70, с. 294], [101, с. 569], [140, с. 121], [172, с. 51], а в [26, с. 103] приводится подробный пример анализа четырехпольных (четырехклеточных) таблиц медицинских данных. В [26, с. 215] приводится обсуждение связи статистики X , вычисленной для четырехпольных таблиц, с коэффициентом сопряженности Бравайса (см. главу 5). Критерий X в описанной здесь форме применяется в схеме расчета критерия медианы для случая анализа более 2 выборок [ 172, с. 86]. Формула Брандта и Снедекора представлена в [24, с. 85].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
int r = 3, // Число столбцов
с » 3. // Число строк
Code; // Код ошибки
double а[] = {65,32,5.26.41.16.8.24,10}. // Таблица
//сопряженности х;
Code = BrandtSnedecor (a.r.c.&x);
cout « "Return code is “ « Code « endl;
if (!Code)
126
Глава 2. Проверка гипотез
cout « “Chi square value is " « x « endl;
cout « "p = " « ChiSquareDistribution C(r - 1) * (c - D.x) « endl;
}
el se
cout « "Not enough memory\n";
}
int BrandtSnedecor (double a[], int r. int c,double *x)
11
// Функция вычисляет хи - квадрат - критерий для таблицы
// сопряженности признаков.
// Обозначения:
//а - таблица сопряженности признаков, представлена по столбцам,
//	г - число столбцов таблицы,
//	с - число строк таблицы.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -1 при недостатке памяти для вычислений.
//
register int i.j;	// Счетчики цикла
int m = 0;	//	Индекс массива
double s = VectorSum (a,г * с), // Сумма элементов таблицы
е,	//	Рабочая переменная
*sr.	//	Суммы столбцов
*sc;	//	Суммы строк
*х = 0;
if ((sr = new doublefrj) == 0) return -1;
if ((sc = new doublefc]) == 0)
{ delete [] sr; return -1;
}
/////////////////////////////
// Вспомогательные вычисления
for (i = 0; i < r; i++)
for (j » 0. sr[i] e 0; j < c; j++) sr[i] += a[m++];
for (i = 0; i < c; i++)
for (j - 0, sc[i] « 0, m •• i: j < r; j++, m += c) sc[i] += a[m];
/////////////////////////////// // Вычисление значения критерия
Непараметрические тесты
127
for (i = 0. m = 0: i < г; i++)
for (j « 0: j < c; j++)
{
e = sr[i] * sc[j] / s:
*x += (a[m] - e) * (a[m++] - e) / e;
}
delete [] sr; delete [] sc;
return 0: }
Х-критерий Ван дер Вардена
Х-критерием Ван дер Вардена сравнивают ранжированные ряды вариант по их центральной тенденции. Критерий Ван дер Вардена является ранговым критерием [123, с. 194]. Критериальная статистика вычисляется по формуле
где ni — численность той выборки, в которой меньше вариант,
п2 — численность другой выборки,
х. — ранговые метки,
Т(.) — функция, обратная интегралу вероятности.
Ранжированные ряды не содержат равных вариант, то есть должны быть исключены из рассмотрения пары равных вариант, если таковые окажутся, в обоих сравниваемых рядах.
Критические значения Х-статистики критерия Ван дер Вардена вычисляются с помощью функции InverseXDistribution для заданного доверительного уровня.
Подробно методику вычисления критерия и примеры применения приводят [41, с. 346], [84, с. 266], [ 111, с. 128]. Обсуждение дано в [115, с. 268], [26, с. 135].
Исходные коды
int VanDerWaerdenTest (double х[].double y[].1nt nx.int
ny.double Criterion)
//
И Функция вычисляет значение критерия Ван дер Вардена.
И Обозначения:
И	х - первая сравниваемая выборка.
128
Глава 2. Проверка гипотез
//	у - вторая сравниваемая выборка,
//	пх - численность первой выборки,
//	пу - численность второй выборки.
// *criterion - вычисленное значение критерия.
// Возвращаемое значение:
//	0 при нормальном окончании счета,
// -1 при недостатке памяти,
// -2 при ошибке в вычислениях.
//
{
register int i;	// Счетчик
int n,nxl,nyl,*ix e 0; // Вспомогательные переменные
double *spx.*spy, *xx,*yy;
if ((spx a new double[nx]) == 0) return -1:
if ((spy = new double[ny]) == 0)
{
delete [] spx;
return -1;
}
/////////////////////////////////////// // Работаем с копиями исходных массивов ArrayToArray (x.spx.nx);
ArrayToArray (y.spy.ny);
////////////////////////////
// Сортировка no возрастанию SortArrayUp (spx.nx.ix.O); SortArrayUp (spy.ny.ix.O);
//////////////////////////////////////////// // Сравнение и вычеркивание равных элементов Compare (spx.spy.nx.ny.&nxl.&nyl);
if ((nxl <= 0) || (nyl <= 0))
return -2;
if ((xx = new doubleEnxl]) == 0)
{
delete Г] spx; delete [] spy;
return -1;
}
if ((yy B new double[nyl]) -» 0)
{
delete [] spx: delete [] spy; delete [] xx;
return -1:
Непараметрические тесты
129
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / // Совместное ранжирование массивов RankCommon (spx.spy.xx.yy.nxl.nyl);
delete [] spx; delete [] spy;
/////////////////////////////// // Вычисление значения критерия n = nx + ny + 1;
2
if (nx < ny)
for (i = O.*criterion = 0; i < nxl; i++)
♦criterion += InverseNormalDistribution (xx[i] / n): el se
for (i = 0,*criterion = 0; i < nyl; i++)
♦criterion += InverseNormalDistribution (yy[i] / n);
♦criterion = fabs (*criterion): delete [] xx; delete [] yy;
return 0; }
Критерий QРозенбаума
Критерий Q Розенбаума предназначен для проверки нулевой гипотезы о том, что совокупности распределены одинаково, или для проверки равенства других характеристик, например средних [151]. Вычисление статистики критерия производится по формуле [57, с. 75]
Q = + S2,
где 5, — количество результатов наблюдений первого ряда, больших максимума второго ряда,
$2 — количество результатов наблюдений второго ряда, меньших минимума первого ряда.
Решение о достоверности различий на выбранном доверительном уровне (0,95 или 0,99) принимается в случае, если вычисленное по выборкам значение критериальной статистики превышает критическое значение. Для применения представленной функции предварительное ранжирование выборок не является обязательным. Критерий нельзя применять при численности хотя бы одной из выборок менее 11. При численности хотя бы одной из выборок более 26 критические значения берутся, как указано в пояснениях к функции (^Distribution.
5 2002
130
Глава 2. Проверка гипотез
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include "megastat.h"
void main (void) {
int nl = 11, n2 = 12. Code, q:
double x[] = {95.100.105.105.110.110.115.115.120,130.135}, y[] = {75.80.80.85.90.95.100.100.105.110.115.115};
cout « "Value of Q = " « Rosenbaum (x.nl,y,n2) « endl;
QDistribution (nl,n2.0.95,&q);
cout « "Critical value of Q is " « q « “ for p = 0.95" « endl;
QDistribution (nl,n2,0.99.&q);
cout « "Critical value of Q is " « q « " for p = 0.99" « endl;
}
int Rosenbaum (double x[].int nl.double y[].int n2) //
// Фукнкция вычисляет значение критерия Q Розенбаума.
// Обозначения:
// х. у. - сравниваемые выборки,
// nl. п2 - размерности сравниваемых выборок.
// Возвращаемое значение:
// Значение критерия.
// {
register int i; // Счетчик цикла
int Retl = 0,	// Число элементов первой выборки.
// больших максимума второй
Ret2 = 0;	// Число элементов второй выборки.
// меньших минимума первой
double Махх = MaximumOf (x.nl).
Маху = MaximumOf (y,n2). Minx = MinimumOf (x,nl), Miny = MinimumOf (y.n2);
///////////////////// // Ведущий первый ряд if ( Махх > Маху)
Непараметрические тесты
131
{
for (i = 0; i < nl; i++) if (x[i] > Маху)
Retl++;
for (i = 0; i < n2; i++) if (y[i] < Minx)
Ret2++;
}
/////////////////////
// Ведущий второй ряд
el se
{
for (i = 0; i < n2; i++) if (y[i] > Maxx)
Retl++;
for (i = 0; i < nl; i++) if (x[i] < Miny)
Ret2++;
}
2
return Retl + Ret2;
}
Критерий серий Вальда—Вольфовица
Критерий серий Вальда—Вольфовица (Wald—Wolfowitz runs test) предназначен для проверки нулевой гипотезы о равенстве целого ряда параметров двух сравниваемых выборок, включая медианы и коэффициенты асимметрии. Критерий применяется в случае, если исследователя интересует, имеют ли место любые различия между генеральными совокупностями. Описание методики вычисления критерия дано в [172, с. 82], [84, с. 267]. Суть расчета заключается в объединении выборок с численностями и п2 в одну выборку численностью п = т\ + п2, сортировке объединенного массива по возрастанию или убыванию и подсчете числа серий элементов R, относящихся к первой и второй выборкам.
Для вычисления доверительного уровня применяется функция 1п-verseSerialDistribution. Дополнительно показан вызов функции Se-rialDistribution, демонстрирующий реальные критические границы статистики критерия, внутри которых принимается гипотеза об отсутствии различий. Так, в примере хорошо видно, что для статистики критерия, равной 24, вероятность различий между выборками равна 0,96 (в терминах уровня значимости можно записать р < 0,05). Это совпадает с результатами работы функции SerialDistribution, согласно которым статистика критерия выходит из области (14...23) принятия гипотезы об отсутствиии различий на стандартном дове
5*
132
Глава 2. Проверка гипотез
2
рительном уровне 0,95. Для реальных расчетов вызов функции Serial Distribution не является обязательным и может быть полезен для иллюстрации методики построения таблиц распределения критерия серий.
Для больших выборок (я, > 20 и/или п2 > 20) некоторые авторы [172, с. 84] используют z-преобразование:
jRJ2n!n^ + Л_05 V n J 2п1п2(2п1п2 -п)
]]	п2(и-1)
Считается, что величина z распределена по стандартному нормальному закону. При необходимости читатель сам без труда составит функцию, реализующую данный алгоритм,— она достаточно проста. Мы не установили, вызвано ли это неточностью источника или какой-либо другой причиной, но данное решение не показывает стабильности в работе. В предлагаемом источником решении, по нашему мнению, совершенно нет необходимости — составленные нами функции точно работают при любых практически встречающихся значениях параметров.
Обсуждение см. в [120, с. 65], [156, с. 112].
Исходные коды и пример применения
#include <fstream.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
int nl = 22, // Численность 1-й выборки
n2 = 17, // Численность 2-й выборки
pl,	//	Нижнее критическое значение
р2;	//	Верхнее критическое значение
double xl[] = // Варианты 1-й выборки
{49.35,26,59,35,58,14.29,17.11,37,22,39,8,50,67.54.19,29,93,109,95}.
х2[] = // Варианты 2-й выборки
{16,31,10.60.13.7,20.36,18,12,55.7,41.5.28,16.9}.
t; // Статистика критерия
if (’WaldWolfowitz (xl.nl,x2.n2,&t))
Непараметрические тесты
133
{
cout « "t = " « t « ". p = " « InverseSerialDistribution (nl.n2.t);
cout « "ХпКритические значения";
Seri al Distribution (nl.n2.0.95.&pl.&p2);
cout « "\np = 0.05 - 0.95. " « pl « " - " « p2:
SerialDistribution (nl.n2.0.99,&pl,&p2);
cout « "\np = 0.01 - 0.99. " « pl « " - " « p2;
SerialDistribution (nl.n2,0.999,&pl.&p2);
cout « "\np = 0.001 - 0.999. " « pl « " - " « p2 « "\n"; }
el se
cout « "Мало памятиХп";
}
int WaldWolfowitz (double datal[].int nl.double data2[].int n2.double *criterion) //
// Функция вычисления значения критерия серий Вальда-
// Вольфовица.
// Обозначения:
//	datal	-	первая выборка.
//	nl	-	численность первой	выборки.
//	data2	-	вторая выборка.
//	п2	-	численность второй	выборки,
// *criterion - вычисленное значение критерия.
// Возвращаемое значение:
//	0 при нормальном окончании счета.
// -1 при недостатке памяти для размещения рабочих массивов. //
{
char *b;	// Массив условий
register int i.k = 0: // Счетчики
int n = nl + n2.	// Размер суммарного массива
*ix;	// Информация об оригинальных массивах
double *х;	// Суммарный массив
if (!(х = new double[n])) return -1;
if (!(ix = new int[nJ))
{
delete [] x;
return -1;
}
if (!(b = new char[n]))
{
delete [] x; delete [] ix;
return -1;
}
134
Глава 2. Проверка гипотез
/////////////////////// // Объединение массивов for (1 = 0; 1 < nl: 1++) x[k++] = datal[i]:
for (1=0; 1 < n2; 1++) x[k++] = data2[1];
//////////////////////////// // Сортировка по возрастанию SortArrayUp (x.n.ix.l):
//////////////////////////////////////////////// // Значение 1 - первый массив, 2 - второй массив for (1=0: 1 < n; 1++)
b[i] = ix[i] < nl ? 1 : 2:
////////////////////////////////////////////// // Начальное значение накапливаемого параметра ♦criterion = 1.0;
////////////////////// // Подсчет числа серий for (1=1: 1 < п; 1++)
If (b[i - 1] != b[i])
♦criterion += 1:
delete [] x; delete [] lx:
return 0:
Критерий Колмогорова—Смирнова
По критерию Колмогорова-Смирнова (критерию Смирнова) сравнивают функции распределения двух эмпирических рядов. Проверяется нулевая гипотеза о том, являются ли одинаковыми непрерывные функции распределения генеральных совокупностей, из которых взяты выборки. Иначе, проверяется принадлежность двух выборок одной и той же генеральной совокупности при условии непрерывности ее функции распределения.
Статистика критерия имеет вид [32, с. 84], [190, с. 460]
Ч,.„ = SUP
где — максимальная разность между частостями рядов х и х, тип — численности вариационных рядов.
Непараметрические тесты
135
Возможен непосредственный расчет по данной формуле [57, с. 77], однако при этом нужно учесть, что функции распределения должны быть сопоставимы по оси абсцисс, что гарантируется, если они явились продуктом построения не по исходной выборке, а по частотам распределения с сопоставимыми классовыми интервалами. Данный способ особенно удобен при анализе больших выборок и подробно проиллюстрирован в [84, с. 284].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
double nl = 50. // Численность первой выборки n2 = 60: // Численность второй выборки
double к, // Значение статистики
п = 11,	// Численность каждого массива функций
// распределения fl[] =
{0.00.0.15,0.23.0.43.0.43.0.45.0.56.0.65,0.79.0.89,1.00}. f2[] =
{0.00.0.27.0.42.0.55,0.72.0.73,0.83,0.85,1.00.1.00,1.00}:	'
k = Smirnov (fl.f2.n):
cout « "Criterion = " « k « ". p = "
« (1 - LambdaDistribution (k * sqrt (nl * n2 / (nl + n2)))) « endl:
}
double Smirnov (double fl[],double f2[],int n)
//
// Функция вычисления критерия Смирнова.
// Обозначения:
// fl - массив функции распределения 1-й выборки,
// f2 - массив функции распределения 2-й выборки,
// п - численность каждого массива.
// Возвращаемое значение:
// значение критерия Колмогорова-Смирнова.
//
{
double s.	// Рабочая переменная
criterion = 0: // Вычисленное значение статистики критерия
for (register int i = 0: i < n; i++)
136
Глава 2, Проверка гипотез
s = fabs (fl[i] - f2[i]); if (s > criterion) criterion = s;
return criterion;
}
В случае построения массивов функций распределения непосредственно по выборкам (без разнесения вариант по классовым интервалам) для двустороннего критерия вычисления производятся по формулам [32, с. 84]:
Dm ==max(lZ ,£) Y
т.п	у т.п' т.п J'
(г А (	$-О
D* =тах-------F(x) =тах G(xs)----------,
т'п i<r<m\jn r/j 1<5<и	5' п J
Для одностороннего критерия
Dm,n=D^-
При данном способе построения массивов функций распределения они, в отличие от предыдущего случая, будут равномерны по оси ординат, чем и определяется вид формул.
Функция распределения статистики критерия
1 пт
т + п
при тп / (т + п) —> ©о сходится к функции распределения Колмогорова [140, с. 238]. P-значение вычисляется функцией LambdaDistri-bution, вызванной с указанным параметром.
Интересно, что при данном способе построения функций распределений в явном получении упомянутых функций вообще нет необходимости — мы используем свойство, что они равномерны по оси ординат, благодаря чему значение функции распределения в текущей точке вычисляется через номер варианты в исходной выборке. Данный подход подробно проиллюстрирован примерами и исходными текстами на алгоритмическом языке Фортран в [174, с. 107].
Непараметрические тесты
137
Составленная нами функция программно моделирует графический способ решения, описанный в [140, с. 238]. В представленном виде критерий очень похож на ранговые критерии, однако в [213, с. 163] показано, что это не совсем так.
Авторами [32, с. 84] вводятся поправки на дискретность распределения статистик и D~n. Обсуждение см. также в [84, с. 285], [120, с. 50], [135, с. 274].
Исходные коды и пример применения
#include <fstream.h>
#include <ioman‘ip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
double x[] = {1,2.3.9.4.2.5.3.5.3.6.1.6.7.8.9.10}. // Первая
// выборка у[] = {4.5.6.7.8.9.9.1.9.2.13}:	// Вторая
// выборка
int nx = sizeof (x) / sizeof (x[0]), ny = sizeof (y) / sizeof (y[0]):
double k = SmirnovExact (x.y.nx.ny);
cout « "Criterion = " « k
« "\nnx = " << nx « "\nny = " « ny « "\np « "
« (1 - LambdaDistribution (k * sqrt ((double) nx * ny / (nx + ny))))
« endl:
}
double SmirnovExact (double x[].double y[].int nx.int ny)
//
// Функция точного вычисления критерия Колиогорова-Снирнова.
// Обозначения:
//	х - первая отсортированная выборка.
//	у - вторая отсортированная выборка.
// пх - численность первой выборки,
// пу - численность второй выборки.
// Возвращаемое значение:
// значение статистики критерия Колмогорова-Смирнова.
И
{
register int i.j = 0; // Счетчики
double s,	// Рабочая переменная
138
Глава 2. Проверка гипотез
criterion = 0; // Статистика критерия
//////////////////////////////////////////////////
// Перебрать все варианты 2-й выборки относительно
// всех вариант 1-й выборки
for (i = 0: i < ny; i++)
///////////////////////////////////////////////////////////// // Текущая варианта 2-й выборки меньше или равна 1-й варианте // 1-й выборки if (y[i] <= х[0])
{
s - (double)i / ny;
if (s > criterion) criterion = s;
}
////////////////////////////////////////////////////////// // Текущая варианта 2-й выборки больше или равна последней // варианте 1-й выборки else if (y[i] >= x[nx - 1])
{
s = 1 - (double) i I ny;
if (s > criterion) criterion = s:
////////////////////////////////////////////////// // Дальше вычисления можно не проводить - максимум // уже был достигнут в процессе вычислений break;
}
//////////////////////////////////////////////////////
// Текущая варианта 2-й выборки в пределах 1-й выборки el se
{
//////////////////////////////////////////
// Уточним, между какими вариантами именно
for (; j < пх - 1; J++)
if (y[i1 >» x[j] && y[i] < x[j + 1]) {
s = fabs ((double)i / ny - (double)j I nx):
//////////////////////////////////////////////////////////
II Прервать цикл с сохранением достигнутого номера текущей // варианты 2-й выборки - так уменьшим объем вычислений break;
}
if (s > criterion) criterion = s;
}
Непараметрические тесты
139
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
// Перебрать все варианты 1-й выборки относительно
// всех вариант 2-й выборки
for (i = 0. j = 0: i < nx: i++)
///////////////////////////////////////////////////////////// // Текущая варианта 1-й выборки меньше или равна 1-й варианте // 2-й выборки if (x[i] <= у[0])
{
s = (double)i / nx;
if (s > criterion) criterion = s:
}
//////////////////////////////////////////////////////////
// Текущая варианта 1-й выборки больше или равна последней
// варианте 2-й выборки
else if (x[i] >= y[ny - 1J)
{
s = 1 - (double) i / nx;
if (s > criterion) criterion = s;
//////////////////////////////////////////////////
// Дальше вычисления можно не проводить - максимум
// уже был достигнут в процессе вычислений break;
}
//////////////////////////////////////////////////////
// Текущая варианта 1-й выборки в пределах 2-й выборки el se
{
//////////////////////////////////////////
// Уточним, между какими вариантами именно
for (; j < ny - 1; j++)
if (x[i] >= y[j] && x[i] < y[j + 1]) {
s = fabs ((double)i / nx - (double)j I ny);
//////////////////////////////////////////////////////////
// Прервать цикл с сохранением достигнутого номера текущей
// варианты 1-й выборки - так уменьшим объем вычислений break;
}
if (s > criterion) criterion = s;
}
return criterion;
}
140
Глава 2. Проверка гипотез
Точный метод Фишера—Ирвина
Точный метод Фишера—Ирвина (критерий Фишера—Ирвина, точный метод Фишера) применяется для проверки нулевой гипотезы о том, отобраны ли две исследуемые бинарные (дихотомические) выборки из генеральных совокупностей с одинаковой частотой встречаемости изучаемого эффекта [201, с. 36]. Рассматриваемый метод предназначен для обработки так называемых четырехпольных (четырехклеточных) таблиц, или таблиц «2 х 2». В результате вычислений получается точное значение уровня значимости нулевой гипотезы. Вычисление производится по формуле [57, с. 80]
_(a + by.(c+dy(a + cy(b+dy nlalblcldl
где а — число наблюдений с эффектом А в первой выборке,
b — число наблюдений без эффекта А в первой выборке, с — число наблюдений с эффектом А во второй выборке, d — число наблюдений без эффекта А во второй выборке, n = a+ b + c + d.
Пример. Пусть вычислено значение а = 0,012 < 0,05. На уровне значимости < 0,05 (ближайшее стандартное значение) нулевая гипотеза отклоняется и принимается альтернативная гипотеза о различии средних.
Метод подробно исследован в [91, с. 736]. Там же даны примеры применения. Точный метод Фишера применяется в схеме описанного ниже критерия медианы для анализа различий медиан двух выборок.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void) {
int a = 95, b = 10. c = 75. d = 20:
cout « Fisherlrwin (a.b.c.d) « endl: }
Непараметрические тесты
141
double Fisherlrwin (int a.int b.int c,int d) //
// Функция вычисления критерия значимости различий
// точным методом Фишера-Ирвина.
// Обозначения:
// а - число наблюдений с эффектом А в первой выборке.
// b - число наблюдений без эффекта А в первой выборке,
// с - число наблюдений с эффектом А во второй выборке.
// d - число наблюдений без эффекта А во второй выборке.
// Возвращаемое значение:
// уровень значимости различий между выборками по частоте
// эффекта А.
//
{
return exp (LogFactorial (а + b) + LogFactorial (с + d) + LogFactorial (a + c) + LogFactorial (b + d) -LogFactorial (a + b + c + d) - LogFactorial (a) -LogFactorial (b) - LogFactorial (c) - LogFactorial (d));
}
Критерий знаков
Критерий знаков (Sign test) предназначен для проверки гипотезы об однородности распределения совокупности, что эквивалентно проверке гипотезы о равенстве функций распределения Fx и FY [140, с. 217]. Критерий знаков часто используется при сравнении эффективности двух различных способов воздействия на п объектов и, таким образом, может применяться и для связанных выборок.
Статистика критерия вычисляется как число положительных разностей вариант сопряженных выборок [213, с. 17]:
1=1
s(X) =
1,Х>0,
0,Х<0,
гдехр 2=1,..., и, г/р 2=1,..., п — элементы выборок.
Критическое значение статистики критерия Zna вычисляется функцией Sign Distribution. Для односторонней конкурирующей гипотезы Fx > Fy или Fx < Fy вывод о статистически значимом различии на выбранном уровне значимости «делается в случае Z* </яаили Z* > п - Zna> соответственно. Для двусторонней конкурирующей ги
142
Глава 2. Проверка гипотез
потезы Fx * Fy на уровне значимости а/2 вывод о статистически значимом различии делается в случае Z* < ZnCf/2 или Z> п - Zna/2. Обсуждение различных аспектов применения критерия знаков см. также в [26, с. 135], [37, с. 226], [57, с. 70], [120, с. 47], [156, с. 113], [180, т.2, с. 120].
2 Исходные коды
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
Snt n;	// Численность каждой выборки
double x[] =	// Первая выборка
{11.14.13.11,18.22.14.14. 7.16, 9.20.24. 9.15.25. 4.13,12.10}.
y[] =	// Вторая выборка
{18.10. 9. 1.12.20. 5. 8.14.15.
12.	8.19. 5. 6,20.14. 7. 8. 9}:
n = sizeof (x) / sizeof (x[0]);
cout	«	"n =	"	« n «	", s =	" «	SignTest (x.y.n)
«	"\np	=	0.01, k	- " «	(n -	SignDistribution	(n.O.OD)
«	"\np	=	0.05. k	= " «	(n -	SignDistribution	(n.0.05))
« endl:
}
double SignTest (double x[],double y[].1nt n)
//
// Функция критерия знаков.
// Обозначения:
//	х	-	первая выборка,
//	у	-	вторая выборка.
//	п	-	численность каждой	выборки.
// Возвращаемое значение:
//	значение критерия знаков.
//
{
double s = 0:	// Возвращаемое значение
for (register int i = 0: i < n; i++) if (x[i] > y[i])
s++:
return s:
}
Непараметрические тесты
143
Критерий медианы
Критерий медианы (медианный критерий) предназначен для проверки нулевой гипотезы о том, отобраны ли две исследуемые группы из генеральных совокупностей с одинаковыми медианами либо имеют ли совокупности одинаковое распределение. Этапы вычисления критерия для двух выборок численностями п1 и п2 [172, с. 75]: 1. Формирование таблицы сопряженности типа «2 х 2» по следующему правилу: в ячейку А заносится число отметок первой выборки, превышающих медиану выборки, полученной объедине-ниехМ двух исходных выборок; в ячейку В заносится число отметок второй выборки, превышающих медиану; в ячейки С и D заносится число отметок, не превышающих медиану, соответственно, первой и второй выборок;
2. В случае пх > 15 и/или п2 > 15 (некоторые источники указывают п{ + п2> 20, если число наблюдений в каждой клетке не менее 5) к полученной таблице применяется критерий Х\ в противном случае применяется точный метод Фишера. При использовании -.2
критерия X для вычисления доверительного уровня число степеней свободы берется равным 1.
В качестве альтернативы можно применять решение [180, т. 2, с. 126], где указано, что число наблюдений первой выборки, превосходящих медиану объединенной выборки, имеет гипергеометрическое распределение, а выводы могут быть сделаны так же, как в предыдущем разделе.
Функцией Median выдается значение доверительного уровня гипотезы о различиях медиан совокупностей. Например, программой выдано Р = 0,98. Поскольку наблюдаемое значение доверительного уровня превышает ближайшее стандартное значение 0,95, принимается гипотеза об имеющих место различиях медиан совокупностей на уровне значимости < 0,05.
Подробное обсуждение см. в [32, с. 77]. В [180, т. 2, с. 126] указаны особенности применения критерия, не рассмотренные в других источниках, но учтенные при составлении функции, реализующей описываемый метод анализа. Критерий может быть применен для исследования k > 2 выборок, как это описано в [ 158, с. 180] и [ 172, с. 86].
Исходные коды void main (void) {
int nl.nnl.	// Численность 1-й выборки
144
Глава 2. Проверка гипотез
п2,пп2.	//	Численность	2-й	выборки
ml;	//	Значение критерия
double xl[]	=	//	1-я выборка
{26,22.19.21.14.18,29,17,34}, х2[]	=	//	2-я выборка
{16,10.8,13,19.11.7.13.9.21}. р;	// Р-значение
nl = sizeof (xl) / sizeof (double);
n2 = sizeof (х2) / sizeof (double):
if (IMedian (xl.nl.x2.n2.&ml.&p,&nnl.&nn2))
{
cout « "Ml =	"	« ml « "\nP	=	" « p
« "\nml	=	"	«	abs (ml - nnl	/ 2)
« "\nnl	=	"	«	nl « ".	"	«	nnl	«	"	corrected"
« "\nn2	=	"	«	n2 « ",	"	«	nn2	«	"	corrected"
« "\np = 0.001, k = " « MedianDistribution (nnl.nn2,0.001) « “\np =0.01, k = " « MedianDistribution (nnl.nn2,0.01) « "\np = 0.05, k = " « MedianDistribution (nnl,nn2,0.05) « endl;
}
el se cout « "Мало памятиХп";
}
int Median (double datal[],int nl,double data2[].int n2,int
*a,double *p,int *nnl,int *nn2)
//
// Функция критерия медианы.
// Обозначения:
// datal - первая выборка,
// nl - численность первой выборки,
// data2 - вторая выборка.
// п2 - численность второй выборки,
// *а - статистика критерия,
// *р - значимость различий,
//	*nnl - скорректированная численность первой выборки,
//	*пп2 - скорректированная численность второй выборки.
// Возвращаемое значение:
//	0 при нормальном окончании счета,
// -1 при недостатке памяти для размещения рабочих массивов. //
{
register int i.j = 0; // Счетчики
int n = nl + n2,	// Численность суммарного массива
*ix,	// Информация об оригинальном массиве
Непараметрические тесты
145
b = О.с = 0,d = 0;	// Клетки В, С и D таблицы 2x2
double al.bl,cl.dl.	//	Ожидаемые частоты
a2,b2,c2,d2.	//	Вспомогательные величины
med,	//	Медиана суммарной	выборки
*х.	//	Суммарный массив
*У;	//	Скорректированный	суммарный массив
if (!(х = new double[n]))
return -1:
if (!(у = new double[n]))
{
delete [] x;
return -1;
}
if (!(ix = new int[n]))
{
delete [] x; delete [] y;
return -1;
}
///////////////////////
// Объединение массивов
for (i = 0; i < nl; i++) x[j++] = datal[i];
for (i = 0; i < n2; i++) x[j++] = data2[i] ;
///////////////////////////////////
// Сортировка объединенного массива
SortArrayUp (x.n.ix.l);
///////////////////////////////////////
// Расчет медианы объединенного массива
med = IParity (n) ? med = x[n / 2] : (x[n / 2 - 1] + x[n /
2]) / 2;
///////////////////////////////////////
// Восстановление оригинального порядка UnSortArray (x.y.n.ix);
delete [] x;
////////////////////////////////
// Корректировка для нечетного n
if (IParity (n))
{
//////////////////////////////////
// Вычеркивание медианной варианты
for (i = 0. j = 0; i < n; i++)
if (j != ix[n / 2]) y[j++l = y[il:
146
Глава 2. Проверка гипотез
/////III//////////////////И// // Уменьшение численности на 1
if (ix[n / 2] <= nl)
nl—:
el se
n2—;
n—:
}
*nnl = nl;
*nn2 = n2;
delete [] ix;
////////////////////////////
// Расчет клеток таблицы 2x2
for (i = 0, (*a) = 0; i < nl; i++)
if (y[iJ > med)
(*a)++;
el se
C++;
for (i = nl; i < n; i++)
if (y[il > med)
b++;
el se
d++:
delete [] y;
////////////////////////////////////////// // Критерий хи-квадрат для больших выборок if (nl > 15 || n2 > 15)
{
//////////////////////////
// Расчет ожидаемых частот
al = (*а + b) * (*а + с) / п;
Ы = (*а + b) * (b + d) / п;
cl = (с + d) * (*а + с) / п;
dl = (с + d) * (b + d) / п;
///////////////////////////// // Вспомогательные вычисления
а2	= fabs	(al	- (*a)) - 0
Ь2	= fabs	(bl	- b) - 0.5;
с2	= fabs	(cl	- c) - 0.5;
d2	= fabs	(dl	- d) - 0.5;
а2	*= a2;		
Ь2	*= b2;		
с2 *= с2;
d2 *= d2;
//////////////////////////////////////////// // Вычисление значимости критерия хи-квадрат
Непараметрические тесты
147
*р = 1 - ChiSquareDistribution (1,а2 / al + Ь2 / Ы + с2 / cl + d2 / dl):
}
/////////////////////////////////////////
// Точный метод Фишера для малых выборок el se
////////////////////////////
// Вычисление значимости ТМФ
*р = Fisherlrwin ((*а).b.c.d):
return 0: }
Непараметрические множественные сравнения
Непараметрические критерии могут быть использованы для множественного сравнения — иными словами, для сравнения двух групп выборок между собой. Каждая группа задается подобно тому, как задаются параметры массивов данных для рассмотренных ниже методов двухфакторного дисперсионного анализа.
Непараметрический критерий Ньюмена—Кейлса
Вычисления производятся по формуле [52, с. 351]
7_ |Дл-ДД| /п2/(и/ +1)
V 1Г~
где Ra и Rb — суммы рангов сравниваемых выборок, п — объем каждой выборки, I — интервал сравнения.
Критические значения для стандартных уровней значимости даны [52, с. 110] в зависимости от числа степеней свободы, равного ©о .
Непараметрический критерий Даннета
Имеется вариант рассмотренного выше критерия, предназначенный для сравнения нескольких групп выборок с контрольной,— критерий Даннета [52, с. 351], вычисляемый по формуле
148
Глава 2. Проверка гипотез
*кон ^А |
U2l(nl + i) ,
V б”
где / — число всех выборок, включая контрольную.
Критические значения для стандартных уровней значимости даны в [52, с. 114] в зависимости от числа степеней свободы, равного .
Критерий Данна
Вычисления производятся по формуле [52, с. 351]
|Уяд|
!#(#+!/1 ~
12	[п, пВ'
где /j и r — средние ранги двух сравниваемых выборок, пАипв — численности выборок,
N— общая численность сравниваемых выборок.
Критерий с успехом применяется для сравнения выборок как неравного, так и одинакового объемов, а также для сравнения с контрольной выборкой. В последнем случае составленную нами функцию потребуется незначительно модернизировать.
Различие считается статистически значимым на выбранном уровне значимости, если вычисленное значение статистики Q превышает критическое значение на этом уровне значимости. Критические значения для попарного сравнения в зависимости от числа сравниваемых выборок для стандартных уровней значимости даны в [52, с. 352] и вычисляются функцией DannDistribution95 для уровня значимости 0,05 и функцией DannDistribution99 для уровня значимости 0,01 так, как это показано в примере, а для сравнения с контрольной выборкой [52, с. 353] вычисляются функцией DannDistribution95c для уровня значимости 0,05 и функцией DannDistribution99c для уровня значимости 0,01.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
Непараметрические тесты
149
#include "megastat.h"
void main (void)
{
register int i.j, // Счетчики цикла m » 0; // Счетчик
int n[] = {13,9.9}, // Численности выборок
k = 3:	// Число выборок
double a[] = {2.04, 5.16, 6.11, 5.82, 5.41, 3.51, 3.18, 4.57. 4.83.
11.34, 3.79, 9.03, 7.21, 5.30, 7.28, 8.98, 6.59, 4.59, 5.17, 7.25, 3.47, 7.60, 10.36, 13.28, 11.81, 4.54, 11.04, 10.08, 14.47, 9.43, 13.41},
*c:	// Массив критериальной статистики
с = new double[(k * k - k) /2];
if ('Dann (a,n,k,c))
{
for (i = 0; i < k - 1: i++)
for (j = i + 1; j < k; j++,m++)
cout « (i + 1) «	« (j + 1) « " ” « c[m] «
endl:
cout « "Dann distribution 51 = " « DannDistribution95 (k) « endl
« "Dann distribution U - ’ « DannDistribution99 (k) « endl:
}
else
cout « "Мало памяти\п":
delete [] c:
}
int Dann (double data[],int n[],int k,double criterion[])
11
// Функция проводит множественные попарные сравнения по
// критерию Данна.
// Обозначения:
// data - массив к векторов данных (вектора друг за другом).
//	п - массив длин к векторов.
// criterion - массив критериальной статистики длиной
// (к * к - к) / 2, заранее выделен.
// Возвращаемое значение:
//	0 при нормальном окончании расчета,
// -1 при недостатке памяти.
//
{
register int 1,j:	// Счетчик цикла
int m,	// Счетчик одномерного массива
150
Глава 2. Проверка гипотез
nn = VectorSum (n.k), //	Общее число вариант
*inf;	//	Информация о перестановках
double *х,	//	Массив средних рангов
*у,	//	Рабочий массив
*t:	//	Массив сумм рангов
if ((t = new double[k]) == 0)
И return -1:
if ((x = new double[nn]) == 0) {
delete [] t:
return -1: }
if ((y = new doublefnn]) == 0) {
delete [] t; delete [] x;
return -1: }
if ((inf = new intfnn]) == 0) {
delete [] t; delete [] x; delete [] y;
return -1; }
////////////////////////////
// Вычисление массива рангов
SortArrayUp (data.nn,inf.1);
Rank (data.y.nn);
UnSortArray (y.x,nn,inf);
////////////////////////////
// Вычисление средних рангов
for (i =0, m = 0; i < k; i++) {
for (j = 0, t[i] = 0; j < n[i]: j++) t[i] += x[m++]:
t[i] /= n[i]; }
///////////////////////////////////////////
II Массив статистики для попарных сравнений
for (i =0, m = 0: i < k - 1; i++)
for (j = i + 1: j < k; j++)
criterion[m++] = fabs (t[i] - t[j]) / sqrt (nn * (nn + 1) / 12 * (1.0 I n[i] + 1.0 / n[j]));
delete [] t; delete [] x: delete [] y; delete [] inf;
return 0;
}
Проверка типа распределения эмпирических данных
151
Проверка типа распределения эмпирических данных
Проверка соответствия эмпирического распределения некоторому наперед заданному теоретическому может быть выполнена различными способами. Задача установления типа распределения не- •«<' избежно возникает при подготовке к применению методов проверки гипотез и дисперсионного анализа с целью выбора адекватной статистической модели.
Далее в настоящем разделе мы рассмотрим некоторые простейшие методы, затем критерии согласия, а также вычислим статистику d Гири. Нами описаны все перечисленные критерии, даны примеры их применения. Для больших выборок мы рекомендуем применять критерий согласия X , а для малых — критерий согласия IVШапиро-Уилка. Возможно, это вызвано разногласиями различных источников относительно применения критериев согласия Колмогорова и со2. В конце соответствующих разделов даны замечания для случая многомерных распределений.
Введение в исследование формы распределения см. в [28, вып. 2, с. 148]. См. также материалы и ссылки, представленные на сайте «Высокие статистические технологии» (antodov.nm.ru).
Простые и сложные гипотезы
Различаются простые гипотезы и сложные гипотезы [167, с. 482]. Согласно [92, с. 221], если распределение имеет I параметров и гипотеза утверждает, что k из них имеют заданные значения, то гипотеза будет:
•	простой, если k = I,
•	сложной, если k < /.
Разность (/ - k) называется числом степеней свободы гипотезы, a k будет числом ограничений, наложенных гипотезой.
Некоторые факты проверки сложных гипотез представлены в [ 156, с. 82].
Простейшие методы
В первом приближении соответствие эмпирического распределе-НИЯ теоретическому может быть оценено глазомерным методом. Для сравнения эмпирического распределения с некоторым теоре
152
Глава 2. Проверка гипотез
тическим распределением на график f(x) обычно накладывается кривая теоретического распределения f'(x). Данная процедура называется глазомерным методом установления типа эмпирического распределения и может быть использована для проверки нормальности. Другой простейший метод проверки нормальности — оценка по вычисленным коэффициентам асимметрии А и эксцесса Е. При этом [106, с. 213], [88, с. 59]:
•	распределение считается симметричным, если |Л| < 0,1, сильно асимметричным при |Л| > 0,5;
•	распределение считается близким к нормальному, если |£| < 0,1, значительно отклоняющимся от нормального при \Е\ > 0,5.
Описанный простейший метод проверки нормальности проиллюстрирован нами в примере, показанном в главе 4, где генерируется нормальное распределение, а затем для него рассчитываются рассматриваемые параметры.
Обратим внимание читателя на простой графический метод оценки соответствия распределения нормальному закону [57, с. 112]. В наиболее простом случае тип распределения, в том числе нормальность распределения, может быть принят в качестве допущения [70, с. 314]. Считается, что для нормального распределения это тем вернее, чем больше численность выборки. Численность выборки считается достаточно большой при п > 500, для других случаев п 100, но выборки численностью п < 30 почти всегда считаются малыми. Тем не менее вряд ли можно избежать статистической проверки нормальности распределения даже при больших выборках, постулировав нормальность ввиду большой численности. Так, для неоднородной выборки и при большой численности нормальность может отсутствовать. В то же время существуют (и рассматриваются нами) методы, позволяющие показать нормальность распределения для очень малых выборок.
Критерии согласия
В случае, если тип распределения некоторой случайной величины нам неизвестен, располагая случайной выборкой, мы можем захотеть проверить, совпадает ли функция распределения случайной величины с некоторой наперед заданной или вычисленной по выборке теоретической функцией распределения. При такой постановке говорят о проверке статистической гипотезы согласия [35, с. 171], [206, с. 336].
Проверка типа распределения эмпирических данных
153
Для проверки, совпадают ли два распределения — эмпирическое и теоретическое — с заданным уровнем значимости, применяют критерии согласия:
•	критерий Колмогорова,
•	критерий согласия а)2 Мизеса,
2
•	критерий X в качестве критерия согласия.
В арсенале статистик имеются и другие критерии согласия, такие как J-критерий Ястремского [111, с. 145], критерий Бернштейна [167, с. 606]. О подборе типа теоретического распределения к представленным эмпирическим данным см. в [98, с. 29]. Критерии согласия для цензурированных (усеченных по той или иной причине) выборок рассмотрены в [ 14, с. 119].
Критерий Колмогорова
Критерий согласия Колмогорова (статистика Колмогорова-Смирнова или просто критерий Колмогорова) предназначен для сравнения функции эмпирического распределения с заданной функцией непрерывного теоретического распределения [140, с. 235]. Статистика критерия имеет вид
D„= sup |F„(x)-F(x)|,
-оо<Х<оо
где Dn — максимальная разность между частостями,
п — объем ряда частостей,
F„(x) ~ эмпирическая функция эмпирического распределения,
F(x) — теоретическая функция эмпирического распределения, х — интервальный вариационный ряд, построенный по исходной выборке.
В литературе даны примеры подхода к вычислению статистики критерия Колмогорова [44, с. 156], [84, с. 285], основанного на непосредственном применении формулы
Dn = max |F„ (х) - F(x)|.
Если построение функции распределения производится непосред-ственно по исходной выборке (см. способ 2, представленный в разделе «Вариационная статистика» главы 1, при этом численности исходной выборки и массива функции распределения совпадают), это позволяет при вычислении статистики в случае двусторонней гипотезы воспользоваться формулами:
154
Глава 2. Проверка гипотез
°»=тах(П<1);О<2)),
1<т<л '	'
D(i} = maxf—- F(x) 1 D{2) = maxf F( x) - ——-
а для односторонней гипотезы
Вид приведенных формул обусловлен тем, что эмпирическая функция распределения является ступенчатой. В точке разрыва функция скачком переходит от значения (тп - 1)/п к значению т/п. Наибольшая разность определяется в точке разрыва. Данное свойство позволяет вообще не передавать в программу эмпирическую функцию эмпирического распределения. Показанные формулы нельзя применять, если функция распределения строится по способу 1, поэтому нужно быть особенно внимательным при выборе метода. При построении функции распределения по способу 1 следует непосредственно применять формулу статистики рассматриваемого теста.
Распределение статистики Dn оказывается одним и тем же для всех непрерывных распределений. Функция распределения статистики критерия Dn4n при и —><» сходится к функции распределения Колмогорова [140, с. 236]. P-значение вычисляется с помощью функции LambdaDistribution.
2 Неприятной особенностью критерия по сравнению с критерием л является то, что упомянутое выше требование непрерывности теоретического распределения не позволяет применять критерий к любым распределениям [187, с. 324]. Кроме того, в рассматриваемой выше форме критерий применим только для случая простой гипотезы, т. е. для случая, когда параметры теоретического распределения не оцениваются по исходной выборке. Авторы обычно приводят пример для случая проверки согласия равномерному распределению, хотя есть хорошие примеры для анализа и других типов распределения: нормального, экспоненциального, Коши и равномерного, причем подробно проиллюстрированные исходными кодами на языке Фортран в [174, с. 103].
В показанном ниже примере помимо вызова функции вычисления критерия Колмогорова показан также вызов для следующей описанной нами функции, реализующей вычисление критерия согла
Проверка типа распределения эмпирических данных
155
сия X . Еще раз обратите внимание, что метод применим только в случае построения функции распределения вторым способом (см. главу 1) и для простой гипотезы. Пример расчета в случае построения функции распределения по первому способу представлен в [84, с. 284]. Его реализация не должна вызвать затруднений.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
^include "megastat.h"
void main (void)
{
int n = 10:	// Численность исходной выборки и массива функции
// распределения
double f[] = // Теоретическая функция эмпирического распределения {0.0834.0.1174.0.1794,0.3094.0.5424,0.6288.0.6606.0.6917,0.7410.0.9401}, к,	// Значение критерия
а;	// Уровень значимости
k = KolmogorovOneSided (f.n):
а = LambdaDistribution (к * sqrt (n)):
cout « "Kolmogorov criterionXnOne sidedXn к = " « к « endl
« - p = " « (i _ a) « endl:
к = KolmogorovTwoSided (f.n);
a = LambdaDistribution (k * sqrt (n));
cout « "Two sidedXn к = " « к « endl « " p = " « (1 - a / 2) « endl:
к = OmegaSquare (f,n);
a = OmegaSquareDistribution (k * n);
cout « "Omega-square criterionXnOne sidedXn к = " « к « endl « " p = " « (1 - a) « "XnTwo sidedXn к = " « к « "\n p = " « (1 - a / 2) « endl:
}
double KolmogorovOneSided (double f[].int n)
11
II Функция вычисления критерия согласия Колмогорова
// для односторонней гипотезы.
// Обозначения:
// f - массив теоретической функции эмпирического
II распределения,
II п - численность исходной выборки и массива распределения.
// Возвращаемое значение:
II значение критерия Колмогорова.
156
Глава 2. Проверка гипотез
//
{
double s,	// Рабочая переменная
criterion = 0: // Вычисленное значение статистики критерия
for (register int i = 1: i <» n: i++) {
ah	s = fabs ((double) i / n - f[i - 1]):
if (s > criterion) criterion = s:
}
return criterion:
}
double KolmogorovTwoSided (double f[],int n)
//
7/ Функция вычисления критерия согласия Колмогорова
// для двусторонней гипотезы.
// Обозначения:
// f - массив теоретической функции эмпирического
// распределения.
// п - численность исходной выборки и массива распределения.
// Возвращаемое значение:
// значение критерия Колмогорова.
//
{
double s.	// Рабочая переменная
criterion = 0: // Вычисленное значение статистики критерия
for (register int i = 1; i <= n: i++)
{
s = fabs ((double) i / n - f[i - 1]):
if (s > criterion) criterion = s:
s = fabs (f[i - 1] - (double) (i - 1) / n):
if (s > criterion) criterion = s:
}
return criterion:
}
Если оценки всех или некоторых параметров неизвестного теоретического распределения все-таки делаются по эмпирической выборке, говорят о так называемой сложной гипотезе [187, с. 327]. При этом вводится модифицированная статистика Колмогорова
£>„= sup |f„(x)-f(x,e)|,
Проверка типа распределения эмпирических данных
157
практически вычисляемая по тем же формулам, что и показанные выше, но имеющая функцию распределения, отличную от функции распределения для простой гипотезы. Однако функция распределения уже не будет той же самой для всех непрерывных распределений. В цитируемом источнике даны пороговые значения модифицированной статистики для случаев проверки соответствия эмпирического распределения нормальному распределению и экспоненциальному распределению, указана необходимая библиография.
Дополнительно о критерии Колмогорова см. в [28, вып.2, с. 145], [70, с. 297], [120, с. 48], [135, с. 273], [156, с. 135], [158, с. 159]. Подробное обсуждение исследований Колмогорова дано в [167, с. 659]. Примеры выводов по результатам расчета даны в [187, с. 337].
Критерий со2 Мизеса
Критерий согласия со2 Мизеса (Крамера—Мизеса, Смирнова—Крамера—Мизеса) предназначен для сравнения функции эмпирического распределения с заданной непрерывной функцией теоретического распределения [167, с. 608]. Статистика критерия определяется формулой [32, с. 83], [187, с. 321]
где Fn(x) — эмпирическая функция распределения, F(x) — теоретическая функция распределения.
Свойства статистики критерия практически позволяют производить вычисления по формуле [там же]
2тл-П2 2л
1	"7
лю2 =----+ У F(x ) -
" 12л £1 т)
Функция распределения статистики критерия лщ2 при л -»«> сходится к функции flj(x) распределения ш2.
Все особенности и условия, включая понятие о сложной гипотезе, полностью аналогичны описанным в предыдущем разделе. Критические значения в случае простой гипотезы вычисляются посредством функции OmegaSquareDistribution. В [там же, с. 328] даны пороговые значения модифицированной статистики (5Я для сложной
158
Глава 2. Проверка гипотез
гипотезы при проверке нормальности и экспоненциальное™. Критические значения в случае сложной гипотезы для данных распределений могут быть вычислены по методике, аналогичной разобранной при описании функции KolmogorovDistribution.
Отметим, что подобно критерию Смирнова, основанному на статистике Колмогорова и предназначенному для оценки однородности двух выборок, имеется такой же «аналог» и для рассматриваемой статистики. Критерий однородности, основанный на статистике типа ft)2, описан в [32, с. 86]. Его предельное распределение сходится к функции а{(х) распределения со2. Теорема Смирнова изложена в [167, с. 609]. Примеры выводов по результатам расчета даны [187, с. 337]. См. также [156, с. 136].
Пример вызова показанной далее функции представлен в предыдущем разделе.
Исходные коды
double OmegaSquare (double f[].1nt n) //
// Функция вычисления критерия согласия омега-квадрат. // Обозначения:
// f - массив теоретической функции эмпирического
// распределения.
// п - длина массива распределения.
// Возвращаемое значение:
// значение критерия омега-квадрат.
//
{
double s = 0, а;
for (register int i = 1; i <= n: i++)
{
a = f[i - 1] - (double) (2 * 1 - 1) / 2 / n;
s += a * a:
return (s + (double) 1 / 12 / n) / n; }
Критерий X2
2
Критерий X в форме критерия согласия предназначен для сравнения эмпирической функции эмпирического распределения с соответствующей теоретической функцией эмпирического распределения и вычисляется по формуле [35, с. 174,173, с. 425,135, с. 622,111, с. 138]
Проверка типа распределения эмпирических данных
159
tt nPi
где vP i = 1,2,..., k, — количества (частоты) наблюдаемых случаев в k классах,
Pi ,i =1,2,..., k, — теоретические вероятности выбранного распределения, причем параметры теоретической функции эмпирического распределения рассчитываются по эмпирической выборке либо задаются, в зависимости от проверяемой гипотезы, k — число классов,
п — общее число наблюдений; для непрерывных распределений, например нормального, п нужно еще умножить на величину классового интервала d.
Число степеней свободы при вычислении критического значения или взятии табличного значения следует положить равным [ 111, с. 138] (k - г - 1), где г — число параметров теоретического закона распределения, вычисляемых по эмпирическим частотам распределения. Например, если все параметры теоретического закона вычисляются по интервальному вариационному ряду, то число степеней свободы берется равным [84, с. 274]: (k - 2) для биномиального распределения, (k - 3) для нормального распределения.
Возможно, что не все параметры теоретического закона распределения вычисляются по выборке или вообще все параметры закона распределения получены каким-то иным способом, например заданы, и в рассматриваемой форме критерий пригоден как для простой (критерий X Пирсона), так и для сложной (критерий X Фишера) гипотез [187, с. 324,329].
Необходимо особо отметить, что параметры теоретического закона распределения эмпирической выборки (например, среднее и дисперсия) должны быть получены из частот распределения построенного по выборке интервального вариационного ряда, а не из исходного эмпирического ряда вариант [там же, с. 329,331], хотя в литературе есть, очевидно, не совсем точные примеры вычисления параметров теоретического закона распределения по самой эмпирической выборке [84, с. 273].
Поясним общую схему практического применения критерия [206, с. 345]. Сначала строится эмпирическая функция распределения, а также определяются г оценок параметров, необходимых для построения теоретической функции распределения. Затем на основе вы
160
Глава 2. Проверка гипотез
численных оценок параметров вычисляется теоретическая функция эмпирического распределения, которая сравнивается с эмпирической функцией распределения посредством критерия. Тот факт, что параметры теоретической функции эмпирического распределения могут вычисляться по выборке либо задаваться, делает рассматриваемый критерий наиболее универсальным из рассмотренных нами критериев согласия.
2
Примеры применения критерия согласия X можно найти в [35, с. 174]. Проверка согласия с распределением Пуассона проиллюстрирована в [24, с. 99], [140, с. 119], с нормальным в [84, с. 273]. Общие вопросы рассмотрены в [44, с. 152], [70, с. 290], [173, с. 425], [229, с. 277]. Замечания о ненадежности применения рассматриваемого теста в качестве критерия согласия даны в [167, с. 606]. Решение на языке программироваия Бейсик дано в [ 184, с. 187].
Рассматриваемый критерий применяется нами также при построении описанного ниже критерия Саркади [32, с. 57], поэтому для изучения примера вызова функции ChiSquareEmpire можно воспользоваться примером вызова функции Sarkadi, реализующей вычисление критерия Саркади.
Исходные коды
double ChiSquareEmpire (double f[],double p[],int k,double n) //
// Функция вычисления значения критерия согласия хи-квадрат.
// Обозначения:
// f - массив наблюдаемых случаев в к классах.
// р - массив теоретических вероятностей,
// к - численность каждой выборки,
// п - величина выборки, для непрерывных распределений -
//	величина выборки, умноженная на величину классового
//	интервала.
// Возвращаемое значение:
// значение критерия хи-квадрат.
//
{
double chi = 0. // Возвращаемое значение
s:	// Вспомогательная переменная
for (register int i if (p[i] != 0)
{
s = f[i] - n * chi += s * s /
= 0: i < k; i++)
p[i];
n / p[1J;
return chi;
}
Проверка типа распределения эмпирических данных
161
Критерий X для проверки соответствия исходных данных многомерному нормальному распределению описан в [63, с. 72,223]. Решение данного вопроса имеет исключительную важность в качестве основного этапа перед применением методов многомерной статистики (факторный, кластерный, дискриминантный анализ). В [115, с. 342] описано применение критерия для многомерного случая при простой гипотезе.
Критерий WШапиро—Уилка
Все рассмотренные выше методики проверки соответствия распределения эмпирической выборки наперед заданному теоретическому распределению могли применяться только для больших выборок. Однако в ряде опытов, особенно в экспериментальных и клинических медицинских исследованиях, часто возникает ситуация, когда численность выборки мала.
Специально для проверки нормальности распределения малых, численностью от 3 до 50 вариант, выборок Шапиро и Уилк разработали критерий W, основанный на регрессии порядковых статистик [91, с. 618]. Этот критерий при наличии ограниченного объема данных является более мощным для проверки гипотезы нормальности, чем применяемые обычно критерии согласия [123, с. 37].
Вычисления производятся по формулам [206, с. 337]:
W = />2/52,
52=Х(*. -г)2.й=Ев»-»1(^-.+1 ~xi\ i=l	i=l
гдех, i = 1,2,..., п, — ранжированный ряд,
k = и/2, если п — четное,
k = (п - 1 )/2, если п — нечетное,
аи_,+Р i =1,2,..., k, п = 3,..., 50, — константы.
Схема вычисления, методика применения, примеры и интерпретация результатов расчета даны в [206, с. 337]. Например, вычисленное значение статистики критерия равно 0,943039. Это значение превышает критический уровень 0,938211, вычисленный функцией Critical W для вероятности 50% (в источнике даны таблицы для 1,2,5,10 и 50%). Следовательно, нет оснований предполагать, что представленные данные не подчиняются нормальному закону распределения.
6-2002
162
Глава 2. Проверка гипотез
В [206, с. 339] описан критерий WEQ для проверки допущения об экспоненциальном распределении. Авторы [28, вып.2, с. 153] описали статистику типа Шапиро—Уилка R2 и указали полезные ссылки.
Исходные коды и пример применения
finclude <fstream.h>
#include <iomanip.h>
#include "megastat.h"
void main (void)
{
int n = 10;
double x[] = {303,338,406,457.461,469,474,489.515.583}. alpha = 50;
cout «	"Shapiro-Wilk	=	"	«	ShapiroWilk (x.n) «	endl
«	"	n	=	”	«	n « endl
«	"	Alpha	=	"	«	alpha « "X" « endl
«	"	Critical W	=	"	«	CriticalW (n,alpha) «	endl;
}
double ShapiroWilk (double x[].int n) //
// Функция вычисления критерия W Шапиро-Уилка.
// Обозначения:
// х - отсортированная по возрастанию выборка,
// п - размер выборки.
// Возвращаемое значение:
// вычисленная величина критерия W.
// Примечание:
// функция определена только для п от 3 до 50. диагностика в
// случае
// выхода за эти пределы не выдается.
//
{
register int i.j.l = 0; // Счетчики цикла
int s = 0;	// Начало отсчета массива коэффициентов
double d.b = 0,	// Рабочие параметры
а[] = {	// Полный ряд коэффициентов
0.7071.
0.6872.0.1677,
0.6646,0.2413,
0.6431.0.2806.0.0875.
0.6233,0.3031,0.1401,
0.6052,0.3164,0.1743,0.0561.
0.5888,0.3244,0.1976,0.0947,
0.5739,0.3291,0.2141.0.1224.0.0399,
Проверка типа распределения эмпирических даниых
163
0.5601,0.3315,0.2260.0.1429,0.0695.
0.5475.0.3325,0.2347.0.1586,0.0922.0.0303.
0.5359,0.3325,0.2412.0.1707,0.1099,0.0539,
0.5251,0.3318.0.2460.0.1802,0.1240,0.0727,0.0240, 0.5150,0.3306.0.2495.0.1878.0.1353,0.0880,0.0433, 0.5056,0.3290,0.2521,0.1939,0.1447,0.1005,0.0593,0.0196. 0.4968,0.3273,0.2540,0.1988.0.1524,0.1109,0.0725.0.0359, 0.4886.0.3253.0.2553.0.2027.0.1587.0.1197,0.0837,0.0496,0.0163, 0.4808.0.3232,0.2561.0.2059.0.1641.0.1271.0.0932,0.0612,0.0303, 0.4734.0.3211.0.2565,0.2085,0.1686.0.1334,0.1013,0.0711,0.0422.0.0140, 0.4643.0.3185,0.2578,0.2119.0.1736,0.1399,0.1092,0.0804,0.0530.0.0263, 0.4590,0.3156,0.2571.0.2131.0.1764,0.1443.0.1150,0.0878.0.0618,0.0368, 0.0122, 0.4542,0.3126.0.2563.0.2139.0.1787,0.1480.0.1201,0.0941.0.0696,0.0459, 0.0228, 0.4493,0.3098.0.2554.0.2145,0.1807,0.1512,0.1245.0.0997.0.0764.0.0539. 0.0321,0.0107, 0.4450.0.3069.0.2543,0.2148.0.1822,0.1539,0.1283,0.1046,0.0823.0.0610. 0.0403.0.02, 0.4407,0.3043,0.2533,0.2151.0.1836,0.1563,0.1316,0.1089,0.0876.0.0672. 0.0476.0.0284.0.0094.
0.4366.0.3018.0.2522.0.2152.0.1848,0.1584.0.1346.0.1128.0.0923,0.0728. 0.0540.0.0358.0.0178.
0.4328.0.2992.0.2510,0.2151.0.1857.0.1601.0.1372,0.1162,0.0965,0.0778.
0.0598.0.0424,0.0253.0.0084,
0.4291.0.2968.0.2499.0.2150.0.1864,0.1616.0.1395.0.1192.0.1002,0.0822, 0.0650,0.0483,0.0320,0.0159,
0.4254,0.2944,0.2487.0.2148,0.1870.0.1630.0.1415.0.1219.0.1036,0.0862. 0.0697,0.0537,0.0381,0.0227.0.0076,
0.4220,0.2921.0.2475.0.2145,0.1874,0.1641.0.1433,0.1243,0.1066,0.0899. 0.0739.0.0585,0.0435,0.0289.0.0144.
0.4188.0.2898.0.2463.0.2141,0.1878.0.1651.0.1449.0.1265.0.1093.0.0931. 0.0777.0.0629,0.0485,0.0344.0.0206.0.0068.
0.4156.0.2876,0.2451,0.2137,0.1880.0.1660.0.1463.0.1284.0.1118.0.0961. 0.0812.0.0669.0.0530,0.0395,0.0262.0.0131,
0.4127,0.2854,0.2439.0.2132,0.1882.0.1667.0.1475,0.1301,0.1140,0.0988. 0.0844,0.0706,0.0572,0.0441,0.0314.0.0187,0.0062, 0.4096,0.2834.0.2427.0.2127,0.1883,0.1673,0.1487.0.1317,0.1160.0.1013. 0.0873,0.0739.0.0610,0.0484,0.0361.0.0239,0.0119, 0.4068.0.2813,0.2415.0.2121.0.1883.0.1678,0.1496,0.1331,0.1179.0.1036. 0.0900,0.0770,0.0645,0.0523,0.0404,0.0287.0.0172,0.0057.
0.4040,0.2794,0.2403,0.2116,0.1883,0.1683,0.1505.0.1344.0.1196.0.1056, 0.0924,0.0798.0.0677.0.0559.0.0444.0.0331.0.0220,0.0110, 0.4015,0.2774.0.2391.0.2110.0.1881,0.1686,0.1513.0.1356,0.1211,0.1075. 0.0947.0.0824.0.0706.0.0592,0.0481.0.0372,0.0264.0.0158,0.0053, 0.3989.0.2755,0.2380,0.2104.0.1880,0.1689,0.1520.0.1366,0.1225.0.1092, 0.0967,0.0848.0.0733.0.0622,0.0515.0.0409,0.0305,0.0203.0.0101, 0.3964.0.2737,0.2368,0.2098,0.1878.0.1691.0.1526.0.1376,0.1237.0.1108. 0.0986.0.0870,0.0759.0.0651.0.0546.0.0444,0.0343.0.0244,0.0146.0.0049, 0.3940,0.2719.0.2357,0.2091,0.1876,0.1693,0.1531.0.1384,0.1249.0.1123. 0.1004,0.0891,0.0782,0.0677.0.0575,0.0476.0.0379.0.0283.0.0188.0.0094, 0.3917,0.2701,0.2345.0.2085,0.1874,0.1694,0.1535,0.1392,0.1259,0.1136.
б*
2
164
Глава 2. Проверка гипотез
0.1020,0.0909,0.0804,0.0701.0.0602.0.0506.0.0411.0.0318.0.0227.0.0136, 0.0045,
0.3894.0.2684,0.2334,0.2078.0.1871.0.1695.0.1539,0.1398.0.1269,0.1149. 0.1035,0.0927.0.0824,0.0724.0.0628.0.0534.0.0442,0.0352.0.0263.0.0175. 0.0087,
0.3872.0.2667,0.2323.0.2072.0.1868,0.1695.0.1542,0.1405.0.1278,0.1160, 0.1049,0.0943,0.0842,0.0745,0.0651.0.0560,0.0471,0.0383.0.0296,0.0211. 0.0126,0.0042.
0.3850,0.2651,0.2313.0.2065.0.1865,0.1695,0.1545.0.1410,0.1286.0.1170, 0.1062.0.0959,0.0860,0.0765,0.0673.0.0584.0.0497.0.0412,0.0328.0.0245, 0.0163.0.0081,
0.3830.0.2635,0.2302.0.2058.0.1862.0.1695,0.1548,0.1415.0.1293.0.1180. 0.1073,0.0972,0.0876,0.0783,0.0694.0.0607,0.0522.0.0439.0.0357,0.0277. 0.0197,0.0118,0.0039,
0.3808,0.2620,0.2291.0.2052.0.1859,0.1695,0.1550,0.1420,0.1300,0.1189, 0.1085.0.0986,0.0892.0.0801,0.0713,0.0628,0.0546.0.0465.0.0385,0.0307. 0.0229,0.0153,0.0076,
0.3789,0.2604,0.2281,0.2045,0.1855,0.1693.0.1551,0.1423,0.1306.0.1197, 0.1095,0.0998,0.0906,0.0817,0.0731,0.0648.0.0568,0.0489,0.0411,0.0335. 0.0259,0.0185.0.0111.0.0037,
0.3770.0.2589,0.2271.0.2038,0.1851.0.1692.0.1553,0.1427.0.1312.0.1205. 0.1105.0.1010.0.0919.0.0832.0.0748,0.0667,0.0588,0.0511.0.0436,0.0361. 0.0288.0.0215,0.0143,0.0071.
0.3751,0.2574,0.2260,0.2032.0.1847,0.1691,0.1554.0.1430,0.1317.0.1212. 0.1113,0.1020.0.0932.0.0846.0.0764.0.0685.0.0608,0.0532,0.0459.0.0386. 0.0314.0.0244,0.0174.0.0104,0.0035}:
//////////////////////////
// Определение знаменателя
d = VectorSum (x.n);
d = VectorSumSQ (x.n) - d * d / n:
//////////////////////////////////////////////////
// Вычисление начала отсчета массива коэффициентов
for (1 = 1: i < n - 2: 1++)
for (j = 0; j <= i / 2: j++)
s++:
////////////////////////
// Определение числителя
j = n - 1:
for (i = 0; 1 < n / 2; 1++)
b += a[s++] * (x[j—] - x[l++]):
return b * b / d:
}
Критерий Саркади
Для проверки нормальности распределения можно воспользоваться критерием Саркади [32, с. 57]. в основе которого лежит идея, за-
Проверка типа распределения эмпирических данных
165
ключаютцаяся в построении из исходной выборки £ выборки т], распределенной по стандартному нормальному закону, по формулам:
Сн---------~	=m>m+t •••>«-1-
П + у/п i=i	\1П + 1
где тп — параметр, обычно равный п или 1.
Случайные величины £ подчиняются распределению Стьюдента с числом степеней свободы (п - j - 1) и вычисляются по формуле
J=1,2,..., и-2.
-----
n-j-ltt
Таким образом, если исходная выборка имела нормальное распределение, величины 8 имеют равномерное распределение на отрезке [0,1] и вычисляются по формуле
=	...«-2,
где 5V(.) — функция распределения Стьюдента с v степенями свободы.
Соответствие распределения величины 8 теоретическому равномерному распределению проверяется одним из критериев согласия. Мы выбрали для этого критерий X Пирсона [187, с. 324]. Критерий Саркади интересен тем, что тип распределения эмпирической выборки проверяется без оценки параметров распределения по выборке. Это позволяет применять в его схеме расчета хорошо исследованные критерии согласия для простой гипотезы. Теоретические вероятности равномерного распределения на интервале ]а,Д[, необходимые для проверки соответствия распределения величины 8 равномерному распределению, получены по формуле [63, с. 48]
fQ^aJb) = 1 / (b - а), а <х< b.
Интерпретация результатов расчета следующая. Предположим, вычислено р = 0,958 > 0,95 — распределение отличается от теоретического нормального распределения с коэффициентом дове-
166	Глава 2. Проверка гипотез
2
рия 0,95. Предположим, вычисленор = 0,258 < 0,95 — распределение не отличается от теоретического нормального распределения с коэффициентом доверия 0,95.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <math.h>
#include <megastat.h>
void main (void)
{
register int i; // Счетчик цикла
int п. т. Code;	// Численность тестового массива	
	//	Код ошибки
doublе у[200],	//	Тестовый массив вариант
с.	//	Статистика критерия
Р:	//	Доверительный уровень
n = sizeof (y) / sizeof (y[0]);
m = n - 1:
///////////////////////////////////////////
// Вычисление случайной величины, нормально
// распределенной с параметрами [0.1]
for (i = 0; i < n; i++)
{
y[i] = rand ():
y[i] /= RAND_MAX;
y[i] = InverseNormalDistribution (y[ij):
}
Code = Sarkadi (y.n.m.&c.&p):
if (’Code)
cout « "Chi Square = " « c « endl « "p = " « p « endl: else if (Code == -1)
cout « "Мало памятиХп";
el se
cout « "Ошибка в вычислениях\п":
}
int Sarkadi (double x[].int n.int m.double *c,double *p)
//
// Функция вычисления критерия Саркади для проверки
// нормальности
Проверка типа распределения эмпирических данных . 167
// распределения эмпирической выборки.
// Обозначения:
// х - анализируемая выборка,
// п - численность выборки.
// m - параметр, обычно (при нумерации с 0)
// *с - статистика хи-квадрат,
// *р - доверительный уровень.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -1 при недостатке памяти для вычислений.
// -2 при ошибке в вычислениях.
//
register int j;
int k;
double si = VectorSum (x.n) / (n + sqrt (n)), s2 = 1 / (sqrt (n) + 1).
*h.*d.*b;
равный n - 1.
// Счетчик
// Число классов
// Параметр
// Параметр
// Рабочие
// массивы
2
if (!(h = new double[n - 1])) return -1;
if (!(d = new double[n - 2])) { delete [] h;
return -1;
}
/////////////////////////////////////////////
11 Выборка с нормальным распределением N[0,s]
for (j = 0: j < n - 1; j++)
h[j] - j < m - 1 ? x[j] - si - s2 * x[m] : x[j + 1] - si -s2 * x[m]:
for (j - 0; j < n - 2; j++)
{
for (k- j + 1. si = 0: k < n - 1; k++)
si += h[k] * h[k]:
if (!sl)
{
delete [] d: delete [] h:
return -2:
}
/////////////////////////////////////
// Выборка с распределением Стьюдента d[j] = h[j] / sqrt (si / (n - j)):
/////////////////////////////////////////////
II Выборка с равномерным распределением [0.1]
168
Глава 2. Проверка гипотез
d[j] = StudentDistribution (п - j.d[j]); }
k = Sturgess (n - 2):
if (!(b = new double[k]))
{ delete [] h; delete [] d:
-	return -1;
}
////////////////////////////////////////////// // Получение эмпирических частот распределения Allocate (d.n - 2,h,b,k);
//////////////////////////////// // Величина классового интервала si - b[l] - b[0]:
///////////////////////////////////////////////////////////// // Теоретические вероятности равномерного распределения [0,1] for (j = 0; j < k: j++)
b[j] = 1;
/////////////////////////////////////// // Критерий согласия хи-квадрат Пирсона *с = ChiSquareEmpire (h,b,k,(n - 2) * si):
///////////////////////////////////////////// // Доверительный уровень для простой гипотезы *р = ChiSquareDistribution (к - 1,*с);
delete [] h; delete [] d; delete [] b;
return 0;
}
Метод размаха варьирования
Проверяется нулевая гипотеза об отличии эмпирического распределения от нормального распределения методом размаха варьирования [155, с. 28]. Исходными данными для расчета являются вычисленные нами в разделе «Описательная статистика» главы 1 размах выборки R и оценка среднего квадратичного отклонения s, а также численность выборки п. Решение об отличии эмпирического распределения от нормального на стандартном уровне значимости р принимается, если
L <R/s<H . пр '	njy
Проверка типа распределения эмпирических данных
169
где Ln<p — нижнее критическое значение, Нпр — верхнее критическое значение.
Нижнее и верхнее критические значения вычисляются функцией RangeOfVarDistribution, однако функция RangeOfVar, вычисляющая стандартный уровень значимости нулевой гипотезы, построена так, что в явном вызове функции RangeOfVarDistribution нет не-обходимости — все критические значения на стандартных уровнях ? значимости проверяются функцией RangeOfVar автоматически. Для уровня значимости 0,005 функцией не делается различия — р больше 0,005 или р меньше 0,005. Такую проверку несложно организовать путем небольшого усовершенствования функции, однако делать это нет необходимости. При проверке гипотезы об отсутствии нормального распределения, если можно так выразиться, желательным для исследователя обычно является опровержение нулевой гипотезы о том, что распределение не отличается от нормального, и уже на уровне значимости 0,05 с отстутствием нормальности приходится согласиться, поэтому более высокую значимость различий можно было бы вообще не проверять.
Рассмотрим пример. Пусть функцией вычислен стандартный уровень значимости 0,1. Следовательно, на уровне значимости >0,1 принимается нулевая гипотеза о том, что распределение значимо не отличается от нормального.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include "megastat.h"
void main (void)
{
double г = 1.3, s = 0.391. n = 10.
P:
// Размах выборки
// Оценка среднего квадратичного отклонения
// Численность выборки
// Стандартный уровень значимости
if (’RangeOfVar (r.s.n.&p)) cout « "г = " « г « "\ns = " « "\np = " « p « endl:
el se
cout « "Domain error\n";
}
« s « "\nn = " « n
int RangeOfVar (double r.double s.double n.double *p) //
// Функция вычисляет критические значения статистики метода
170
Глава 2. Проверка гипотез
// размаха варьирования.
// Обозначения:
// г - размах выборки,
// s - оценка среднего квадратичного отклонения,
// п — численность выборки.
// *р - вычисленный стандартный уровень значимости (*р >).
// Возвращаемое значение:
//	0 при нормальном окончании расчета,
2	// -2 при ошибке в фактических параметрах.
“ //
{
register int i;	//	Счетчик
double low,high.	//	Интервалы
pp[] = {0.1.0.05,0.025,0.01,0.005}; // Стандартные
// уровни значимости
if (!s) return 2;
//////////////////////
// Размах варьирования г /= s;
/////////////////////
// Начальное значение
*Р - рр[4]:
/////////////////////////////////////////////
// Проверка на стандартных уровнях значимости
for (1=0: i < 5; 1++)
if (’RangeOfVarDistribution (n,pp[i],&1ow,&high)) {
if (low <= r && r <- high)
{
*p = ppCU:
return 0;
}
}
el se
return -2;
return 0;
}
Критерии отклонения распределения
от нормальности
Существует группа критериев, которые позволяют оценить откло-
нение ряда параметров распределения от нормального распределе
Проверка типа распределения эмпирических данных
171
ния [167, с. 626], но более точно, чем упрощенные методы, которые описаны в начале раздела. Данные критерии не рекомендуется называть критериями нормальности [91, с. 617], их лучше называть критериями эксцесса (статистики Ь2 и d) и критерием коэффициента асимметрии. Соответственно, не вводя в заблуждение потребителя результатов расчета, нужно формулировать и вывод по результату расчета, хотя вывод по результатам применения данных критериев, несомненно, более ценен, чем простое сделанное исследователем и не доказанное статистически предположение о нормальном характере распределения.
Применение критерия эксцесса и критерия коэффициента асимметрии для больших выборок рекомендуется [187, с. 336] для проверки отклонения от нормальности, например при решении вопроса о применении критерия Стьюдента, так как даже для выборок, несколько отличающихся от нормальных, результаты применения критерия Стьюдента будут близки к правильным, если эксцесс и коэффициент асимметрии у анализируемых выборок — такие же, как у нормальных.
Критерий эксцесса
Для проверки нормальности распределения достаточно больших, численностью более 50 вариант, выборок применяется статистика Ь2 [32, с. 56], вычисляемая по формуле
i=l
а в [там же, с. 259] приводятся таблицы распределения статистики. Название основано на том факте, что (Ь2 - 3) есть выборочный коэффициент эксцесса. Данный критерий не нашел широкого применения и упомянут здесь для полноты изложения.
См. также [155, с. 29], [180, т.1, с. 271], [187, с. 333].
Критерий Гири
Гири предложил заменить критерий Ь2 критерием d [161, с. 366], вычисление статистики которого производится по формуле [32, с. 56]
</ =—£|х,-х|.
Доверительный уровень вычисляется функцией GearyDistribution.
172
Глава 2. Проверка гипотез
Ввиду определенных теоретических и вычислительных сложностей применения критериев статистика Гири считается удобным способом проверки нормальности, если целью этой процедуры является только решение вопроса о возможности применения тех или иных параметрических тестов и методов дисперсионного анализа.
Исследования Гири (Джири) подробно изложены в [167, с. 630].
Исходные коды
double Geary (double х[],int n) //
// Функция вычисления статистики d Гири для проверки нормальности // распределения.
// Обозначения:
// х - исходная выборка,
// п - численность выборки.
// Возвращаемое значение:
// значение статистики Гири либо 0 при ошибке.
//
{
register int i;	// Счетчик цикла
double m = VectorSum (x, n) / n, // Выборочное среднее sigma - 0,	// Выборочная дисперсия
s = 0;	// Рабочая переменная
for (i = 0: i < n: i++) sigma += (x[i] - m) * (x[i] - m);
sigma /= (n - 1):
for (i = 0: i < n: i++) s += fabs (x[i] - m);
if (sigma != 0)
return s / n / sqrt (sigma):
el se return 0;
}
Для многомерного случая критерий проверки сферичности нормального распределения описан в [190, с. 598].
Критерий коэффициента асимметрии
В [32, с. 56] дан еще один критерий оценки отклонения от нормальности, основанный на выборочном коэффициенте асимметрии. Вычисления производятся по формуле
Дальнейшие исследования и программные ресурсы
173
Программная реализация не сложнее предыдущей, а таблицы распределения статистики приводятся в [32, с. 258]. Критерий описан также в [28, вып. 2, с. 154], [155, с. 28], [187, с. 333]. В [180, т. 1, с. 271] представлена оценка в модификации Фишера. Для многомерного случая критерий проверки гипотезы о симметричности ^-мерного нормального распределения по k переменным рассмотрен в [190, с. 598]. Критерий Гупта, предназначенный для статистической проверки симметричности распределения относительно выборочной медианы, рассмотрен в [156, с. 117].
Критерий анализа процентилей
В [52, с. 35] предлагается критерий, позволяющий на основе процентилей разобраться, насколько эмпирическое распределение близко к нормальному. Так, если процентили эмпирического распределения не слишком отличаются:
2,5%-процентиль — от Д - 2ст,
16%-процентиль — от Д - а,
50%-процентиль — от Д,
84%-процентиль — от Д + а,
97,5%-процентиль — от Д + 2а, распределение близко к нормальному.
Данная процедура проверки может быть легко реализована с помощью разработанных нами и показанных выше функций и для экономии места не приводится.
Дальнейшие исследования и программные ресурсы
•	Исследования по применению критериев согласия для различных типов теоретического распределения.
•	Проверка соответствия типа распределения многомерных эмпирических данных многомернььм теоретическим типам распределения. Эта задача актуальна для многомерного нормального распределения, так как в ряде методов классификации и распознавания образов предполагается, что исходные данные имеют именно такой тип распределения.
174
Глава 2. Проверка гипотез
• Составление рекомендаций и программы-мастера, которые помогут пользователю выбрать метод исследования, адекватный представленным для анализа исходным экспериментальным данным: типом исходных данных определяется метод, предназначенный для их обработки. К тому же эта концепция хорошо укладывается в схему объектно-ориентированного проектирования.
Некоторые представленные в данной главе расчеты можно проделать с помощью стандартных электронных таблиц, например StarCalc из пакета Star Office производства Sun Microsystems. Для выполнения расчетов с помощью непараметрических тестов можно воспользоваться одной из десятков программ анализа данных, имеющихся на рынке программного обеспечения для научных исследований.
Глава 3.
Дисперсионный анализ
Дисперсионным анализом называют совокупность статистических методов, предназначенных для обработки данных экспериментов, целью которых являлось не установление каких-то свойств и параметров, а сравнение эффектов различных воздействий на каком-либо экспериментальном материале. Методы дисперсионного анализа используются для проверки гипотез о наличии связи между результативным признаком и исследуемыми факторами, а также для установления силы влияния факторов и их взаимодействий.
Для многих параметрических и непараметрических тестов существуют многомерные аналоги в дисперсионном анализе. Именно эти методы и следует использовать, когда число выборок больше двух. Авторы [158] отмечают, что в этом случае нельзя применять критерии, предназначенные для проверки статистических гипотез, то есть для сравнения групп выборок попарно, а затем делать какие-либо выводы относительно всей многомерной совокупности.
Подобно критериям проверки гипотез, методы дисперсионного анализа могут быть предназначены для нормально распределенных совокупностей (то есть будут многомерными аналогами параметрических тестов) и для выборок, свободных от предположения о типе распределения (то есть будут многомерными аналогами непараметрических тестов).
В дисперсионном анализе, как и в других областях анализа данных, сложилась определенная терминология [187, с. 191]. Фактором называют величину, определяющую свойства исследуемого объекта или системы [там же, с. 463], иначе — причину, влияющую на конечный результат [там же, с. 191]. Конкретную реализацию фактора называют уровнем фактора или способом обработки. Значение измеряемого признака называют откликом.
Однофакторный анализ
Данные для рассматриваемых далее методов однофакторного дисперсионного анализа представлены в виде таблиц, причем число столбцов (выборок) соответствует числу уровней фактора (уровней об
176
Глава 3. Дисперсионный анализ
работки), число строк равно числу наблюдений. При этом выборки могут иметь как однаковое число вариант (равные объемы), так и различное. В наших программных реализациях таблицы представлены в виде одномерных массивов, причем выборки расположены друг за другом. Задается также число столбцов (уровней фактора) и массив длин выборок (массив объемов выборок), причем длина упомянутого массива равна числу факторов.
Однофакторный дисперсионный анализ
При однофакторном дисперсионном анализе (дисперсионном анализе по одному признаку, ANOVA [28, вып. 2, с. 40]) предполагается, что результаты наблюдений для разных уровней представляют собой выборки из нормально распределенных генеральных совокупностей. Эти совокупности имеют свои средние и дисперсии, которые полагаются одинаковыми и не зависят от уровней. Задачей анализа является проверка нулевой гипотезы о равенстве средних рассматриваемых совокупностей. Вычисления критериальной статистики производятся по формуле1 [140, с. 135]
Л	2
* N-k £ л '	7
“ bi k	~,
«=1 J=1
k
где W =	— общая численность,
i=i
k — число выборок,
и, i =1,2,..., k, — численность i-й выборки,
xi = —^xij^ ~ 1,2,..., k > _ среднее i-й выборки,
ni j=i
1 *
=	~ общее среднее.
Сумма, стоящая в числителе формулы вычисления критериальной статистики, служит приближенной мерой вариации между анали
1 Мы несколько изменили запись формулы для удобства расчета.
Однофакторный анализ
177
зируемыми выборками, а сумма, стоящая в знаменателе, служит мерой вариации внутри выборок [28, с. 39].
Доверительный уровень вычисляется функцией FDistribution с параметрами (k - 1) и N.
Подробности методики применения однофакторного дисперсионного анализа и примеры применения даны в [26, с. 137], [89, с. 136], [123], [158, с. 174]. Ковариационный анализ подробно рассмотрен в [180, т. 1, с. 494].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
int n[] = {10.10.10,10}, // Численности выборок k = 4;	// Число выборок
double a[] = {1,2,3,4.5,1.2.3.4,5.
2,3,4.5,6.2.3.4.5,6,
1.3.5,7.9.1.3.5.7.9.
2,3.2.3.2.3.2.3.2.3}.
с:	// значение критерия
if (’OneWayAnalysis (a.n.k,&c)) cout « « el se cout «
с « enoi
FDistribution (k - 1,VectorSum (n.k).c) « endl;
"Мало памяти\п";
int OneWayAnalysis (double *data,int *n, int k.double *criterion) //
// Функция проводит однофакторный дисперсионный анализ.
// Обозначения:
// data - массив к векторов данных (вектора друг за другом).
//	п - нассив длин к векторов.
// *criterion - критериальная статистика.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -1 при недостатке памяти.
//
{
register int i.j;	// Счетчик цикла
mt nn = VectorSum (n.k). // Общее число вариант
178
Глава 3. Дисперсионный анализ
m = 0;	// Счетчик одномерного массива
double *x.*t.	//	Рабочий массив
s = 0,	//	Полная дисперсия
si = 0.	//	Сумма дисперсий	выборок
ttt:	//	Вспомогательная	переменная
if (Ct = new doublefk]) == 0)
return -1:
if ((x = new double[MaximumOf (n.k)]) == 0)
{
delete [] t:
return -1:
}
for (i = 0; i < k; i++)
{
for (j = 0; j < n[i); j++) x[j] = data[m++]:
t[i] = VectorSum (x,n[ij): s += VectorSumSQ (x.n[i]): si += t[i] * t[i] / n[i];
}
ttt = VectorSum (t.k): ttt *= ttt: s -= ttt / nn: si -= ttt / nn;
delete [] t: delete [] x:
♦criterion = si / (k - 1) / ((s - si) / (nn - k)):
return 0: }
Ранговый однофакторный анализ Краскела—Уоллиса
Критерий Краскела—Уоллиса (ранговый однофакторный анализ Краскела—Уоллиса, статистика Крускала—Уоллиса) является непараметрическим аналогом однофакторного дисперсионного анализа [52, с. 346] и предназначен для проверки нулевой гипотезы о равенстве эффектов воздействия (обработки) на выборки (количество выборок превышает две) с неизвестными, но равными средними. Нулевая гипотеза формулируется так: все совокупности одинаково распределены. Вычисление статистики критерия производится по формуле [111, с. 171]
Однофакторный анализ
179
гжЙ>!>'
где R., i = 1,2,..., k, — сумма рангов наблюдений z-й группы, k — число групп, k
N = ^nt — общая численность.
j=i
При больших n., i = l,2,k, распределение статистики Нимеет асимптотическое X -распределение с числом степеней свободы (k - 1). В этом случае доверительный уровень вычисляется функцией ChiSqu-areDistribution.
Обсуждение см. также в [28, вып. 2, с. 129], [120, с. 57], [156, с. 127], [158, с. 178], [187, с. 196], [218, с. 131].
Исходные коды
int KruskalWallis (double *data,int *n. int k,double *criterion)
//
// Функция проводит однофакторный дисперсионный анализ
// Краскела-Уоллиса.
// Обозначения:
//	data - массив к векторов данных (вектора друг за другом).
//	п - массив длин к векторов.
// *criterion - критериальная статистика.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -1 при недостатке памяти.
//
{
register int i.j; // Счетчик
int kk, m. *ix;	// Общее число наблюдений // Счетчик одномерного массива // Информация об оригинальном массиве
double s = O.sl.	// Вспомогательная переменная
*y.	// Массив рангов отсортированного массива
*x.	// Массив рангов одного вектора
*r;	// Копия исходного массива и массив рангов
kk = VectorSum (n.k);
if ((ix = new int[kk]) == 0) return -1;
if ((r = new double[kk]) == 0) {
delete [] ix;
180
Глава 3 Дисперсионный анализ
return -1:
}
if ((у - new double[kk]) == 0)
{
delete [] ix; delete [] r;
return -1;
}
if ((x = new double[MaximumOf (n.k)]) == 0)
{
delete [] ix; delete [] r; delete [] y;
return -1;
}
//////////////////////////
// Копия исходного массива
ArrayToArray (data.r.kk);
////////////////////////////
// Сортировка по возрастанию
SortArrayUp (r.kk.ix.l):
///////////////
// Ранжирование
Rank (r.y.kk);
//////////////////////////////////////////////
// Восстановление рангов оригинального массива UnSortArray (y.r.kk.ix);
for (i=0, m=0;i<k; i++)
{
for (j = 0; j < n[i]; j++) x[j] = r[m++J;
si = VectorSum (x.n[i]>;
s += si * si / n[i];
}
♦criterion = s * 12 / kk / (kk + 1) - 3 * (kk + 1);
delete [] ix; delete [] y; delete [] r; delete [] x;
return 0;
}
Критерий Джонкхиера—Терпстра
Критерий Джонкхиера—Терпстра представляет собой многомерное обобщение критерия Манна—Уитни и предназначен для проверки нулевой гипотезы о равенстве эффектов воздействия (обработки) на выборки с неизвестными, но равными средними. Вычисление критерия производится по формуле [187, с. 197]
Однофакторный анализ
181
*-i к
1=1 j=i+l
где Uijt i = 1, 2,k-l,j =2, 3,k, — статистика критерия Манна-Уитни для выборок с номерами i и у,
k — количество сравниваемых выборок, k > 2.
Для больших выборок [187, с. 198] доверительный уровень вычисляется функцией NormalDistribution, вызываемой с параметром нормальной аппроксимации, вычисленным функцией Jonckhe-ereTerpstra.
Обсуждение дано в [218, с. 136].
Исходные коды
int JonckheereTerpstra (double *data,int *n. int k.double Criterion, double *t)
//
// Функция вычисляет критерий Джонкхиера-Терлстра.
// Обозначения:
// data - массив к векторов данных (вектора друг за другом),
//	п - массив длин к векторов.
// *criterion - критериальная статистика.
// *t - параметр нормальной аппроксимации.
// Возвращаемое значение:
//	0 при нормальном окончании расчета,
// -1 при недостатке памяти.
//
{
register int i.j.l.m;	// Счетчик цикла
int nx,	// Число вариант первого
// сравниваемого массива
nn = VectorSum (n.k),	//	Общее число вариант
ml.m2;	//	Счетчик	одномерного массива
double *х,*у,	//	Рабочий	массив
buf.bufl;	//	Рабочие	переменные
if (!(х = new double[MaximumOf (n.k)])) return -1;
if (!(y = new double[MaximumOf (n.k)]))
{
delete [] x;
return -1;
}
for (i = 0,ml » O,*criterion » 0; i < k - 1; i++)
{
182
Глава 3 Дисперсионный анализ
for (j = 0; j < n[i]; j++) x[j] = data[ml++];
nx = n[i]:
for (m = i + 1. m2 = ml; m < k; m++)
{
for (1 = 0; 1 < n[m]; 1++)
y[l] = data[m2++];
MannWhitneyTest (x.y.nx.n[m].&buf);
♦criterion += buf;
}
}
delete [] x; delete [] y;
for (j = O.buf = O.bufl =0; j < k; j++) {
buf -= n[j] * n[j];
bufl -= n[j] * n[j] * (2 * n[j] + 3):
}
*t = (*criterion - 0.25 * (buf + nn * nn)) /
sqrt (0.01388889 * (bufl + nn * nn * (2 * nn + 3)));
return 0; }
М-критерий Бартлетта
M-критерий Бартлетта служит для проверки нулевой гипотезы о равенстве дисперсий нескольких генеральных совокупностей. Предполагается, что выборки извлечены из нормальных генеральных совокупностей. Вычисления производятся по формулам [140, с. 118]:
k
t =	(N-A)lgS2-£(n,-l)lgS,2
с	i=1
1	1 lv 1	1 I
с = 1н--->-----------,

k
где N =	— общая численность,
i=l
k — число выборок, k > 2,
nif i =1,2,..., k, — численность z-й выборки,
Однофакторный анализ
183
s2 = — я,-1
— выборочная дисперсия i-й выборки,
X =—= .Л — среднееz-йвыборки.
' niM
При больших i = l,2,..., k, распределение статистики критерия имеет асимптотическое с2-распределение с числом степеней свободы (k - 1). В этом случае доверительный уровень вычисляется функцией ChiSquareDistribution.
Описание критерия дано также в [32, с. 47], [70, с. 271], [156, с. 96], [158, с. 203].
Исходные коды
int Bartlett (double *data,int *n, 1nt k,double *criterion)
//
// Функция вычисляет М-критерий Бартлетта для проверки
// равенства нескольких дисперсий.
// Обозначения:
// data - массив к векторов данных (вектора друг за другой), //	п — массив длин к векторов.
// *criterion - критериальная статистика.
// Возвращаемое значение:
//	0 при нормальном окончании расчета,
// -1 при недостатке памяти.
//
{
register int i,j; //	Счетчик цикла
int nn.	//	Общее число вариант
ш;	//	Счетчик одномерного массива
double *х,	//	Рабочий массив
s »	0.	//	Выборочная дисперсия
z,	// Вспомогательная переменная
si = 0,
S2 = 0, с - 0;
if ((х » new double[MaximumOf (n.k)]) -- 0)
return -1:
nn - VectorSum (n.k);
for (i « o, m - 0; i < k; i++) {
for (j - 0; j < n[i]; j++) x[j] = data[m++];
184
Глава 3 Дисперсионный анализ
с += 1.0 / (n[ij - 1):
s = Moment (2,x.0,&z.n[iJ);
si += log (s) * (n[i] - 1):
s2 += s * (n[i] - 1);
}
c = (c - 1.0 / (nn - k)) / 3 / (k - 1) + 1:
s2 /= (nn - k);
♦criterion = (log (s2) * (nn - k) - si) / c:
delete [] x;
return 0;
G-критерий Кокрена
G-критерий Кокрена (статистика Кокрена) используется для проверки нулевой гипотезы о равенстве дисперсий k (k > 2) нормальных генеральных совокупностей по независимым выборкам с одинаковыми объемами. Вычисление статистики критерия производится по формуле [120, с. 26]
2 max ст lAz/, *
Критические значения для статистики G вычисляются с помощью функции CochraneGDistributionExact либо CochraneGDistribu-tionApprox. Применение последнего метода рекомендуется при &>2ии>10. Выводы по результатам расчета могут быть следующие. Так, допустим, при & = Зии=10 нами вычислено значение критериальной статистики G = 0,6112, что превышает критическое значение, при р = 0,95 равное 0,5983 (табличное «точное» значение составляет 0,6025 и отличается от приближенного примерно на 0,5%). Следовательно, на доверительном уровне 0,95 гипотеза о равенстве дисперсий должна быть отвергнута.
Методика рассмотрена также в [32, с. 46], [140, с. 155], [156, с. 95]. |
Исходные коды
int CochraneG (double *data,int k.int n,double *criterion) //
// Функция вычисляет G-критерий Кокрена для проверки равенства // нескольких дисперсий.
Однофакторный анализ
185
// Обозначения:
// data - массив к векторов данных (вектора друг за другом),
//	п - длина каждого вектора,
// *criterion - критериальная статистика.
// Возвращаемое значение:
//	0 при нормальном окончании расчета,
// -1 при недостатке памяти.
//
register int i, J: // Счетчик цикла
int m:	//	Счетчик одномерного массива
double *х.	//	Рабочий массив
*s,	//	Массив выборочных дисперсий
z,	//	Вспомогательная переменная
ss = 0:	//	Сумма дисперсий
if (!(х = new doublefn])) return -1:
if (!(s = new doublefk]))
{ delete [] x; return -1:
}
for (i =0. m = 0; i < k: i++)
{
for (j = 0; j < n; j++) x[j] = data[m++];
s[i] = Moment (2,x.0.&z.n);
ss += s[i];
}
Criterion = MaximumOf (s,k) / ss;
delete [] x; delete [] s;
return 0; }
Критерий Шеффе
Дисперсионный анализ, выполненный с применением одного из рассмотренных выше критериев, может показать, что средние совокупностей различаются. Однако он не позволяет узнать, средние каких совокупностей действительно различаются между собой. Попарное сравнение выборок исследуемой группы выборок является ошибочным подходом, как это показано в [158, с. 182], поэтому Для решения проблемы применяется метод множественного срав
186
Глава 3. Дисперсионный анализ
нения Шеффе (критерий Шеффе, метод Шеффе). Критерий Шеф-фе предназначен для проверки так называемой гипотезы о линейном контрасте [140, с. 136]
i=l
Линейный контраст представляет собой линейную функцию от средних значений k независимых нормальных выборок с неизвестными, но равными дисперсиями, и известных постоянных, удовлетворяющих условию
1с. =0.
Вычисления статистики критерия при проверке нулевой гипотезы L = Lq производятся по формуле [там же]
ЕС.Л~А>
где N— общая численность,
k — число выборок,
i = 1,2,..., k, — численность z-й выборки,
М =
— средний квадратичный остаток,
г- =—У хй,г = 1,2,...,А, — среднее i-й выборки.
Нами дан пример применения критерия Шеффе для проверки серии гипотез о простых линейных контрастах вида
L = д, - Д, = 0, i = 1, 2,..., k - 1,7 = i + 1,k,
при этом вычисленное значение статистики критерия для сравнен ния с критическим значением следует взять по модулю.
Однофакторный анализ
187
Доверительный уровень вычисляется функцией FDistribution с параметрами (k - 1) и Лг.
Обсуждение и примеры применения даны в [28, вып. 2, с. 50], [111, с. 178], [120, с. 31], [156, с. 99], [158, с. 182]. В [37, с. 291] метод называется как 5-метод и дается его сравнение с критерием Тьюки.
Исходные коды и пример применения
#include ^include #include
#include
<fstream.h>
<iomanip.h>
<math.h>
"megastat.h
void main (void)
{
register int i.j.
m = 0:
// Счетчики цикла // Счетчик
int n[] = {10,10,10,10}. k = 4;
// Численности выборок
// Число выборок
double а[] = {1,2,3,4,5,1,2,3,4,5,
2,3.4,5.6,2,3,4.5,6,
1.3.5.7.9.1.3.5.7.9.
2,3.2.3.2.3.2.3.2.3}.
*с:	// Массив критериальной статистики
с = new double[(k * k - k) / 2];
if (IScheffe (a.n.k.O)
for (i =0; i < k - 1; i++)
for (j = i + 1: j < k; j++,m++)
cout « (i + 1) «	« (j + 1) « " "
« c[m] « ". p = "
« FDistribution (k - 1.VectorSum (n.k) - k.c[m]) « endl:
el se
cout « "Мало паняти\п":
delete [] c:
}
int Scheffe (double //
И Функция проводит
И независимых
II выборок в случае
II контрастах.
И Обозначения:
data[],int n[].int k,double criterion[]) множественные сравнения по Шеффе для проверки гипотез о простых линейных
188
Глава 3. Дисперсионный анализ
//	data - массив к векторов данных (вектора друг за другом),
//	п - массив длин к векторов.
// criterion - массив критериальной статистики длиной
// (к * к - к) / 2, заранее выделен.
// Возвращаемое значение:
//	0 при нормальном окончании расчета,
// -1 при недостатке памяти.
//
{
register int i.j:	// Счетчик цикла
int m,	// Счетчик одномерного массива
nn	= VectorSum (n.k): //	Общее число вариант
double	*x,*t,	//	Рабочий массив
s = 0,	//	Полная дисперсия
si - 0,	//	Дисперсия между выборками,
// остаточная дисперсия
ttt;	//	Вспомогательная переменная
if ((t = new double[k]) == 0) return -1;
if ((x = new double[MaximumOf (n.k)J) == 0) {
delete [] t;
return -1;
}
for (i = 0, m = 0: i < k; i++) {
for (j = 0: j < n[i]: j++) x[j] = data[m++]:
t[i] = VectorSum (x,n[i]): s += VectorSumSQ (x,n[ij): si += t[i] * t[i] I n[i];
}
ttt = VectorSum (t.k):
ttt *= ttt:
s -= ttt / nn: si -= ttt / nn:
/////////////////////// // Остаточная дисперсия s -= si:
/////////////////
// Массив средних
for (i =0: i < k: i++) t[i] /= n[i]:
Однофакторный анализ
189
/ / / / / / / / / / / / / / / / / / / / / / / / / / / /
// Массив попарных сравнений
for (1 = 0. m = 0: i < к - 1; i++)
for (j = i + 1; j < k; j++)
criterion[m++] = (t[i] - t[j]) * (t[i] - t[j]) /
(k - 1) / s * (nn - k) / (1.0 / n[1] + 1.0 / n[j]);
delete [] t: delete [] x;
return 0: }
Критерий Дункана
Гипотезы о простых линейных контрастах могут быть проверены также с помощью критерия Дункана (метода Дункана), по технике вычислений практически совпадающего с критерием Шеффе в случае проверки гипотез о простых линейных контрастах. Критерий Дункана имеет аналогичные критерию Шеффе предпосылки для своего применения. Вычисления производятся по формуле [140, с. 157]
t= .‘°' М у с2 V
где все обозначения соответствуют предыдущему методу.
Для вычисления ^-значений критерия Дункана применяются таблицы распределения критерия Дункана [151, с. 106], реализованные функцией Duncan Distribution и построенные на основе таблиц стьюдентизированного размаха [там же, с. 145].
Обсуждение см. также в [120, с. 34].
Критерий Тьюки
Если независимые выборки имеют равные численности, гипотезы о простых линейных контрастах могут быть проверены также с помощью критерия Тьюки (метода Тьюки). Критерий Тьюки имеет аналогичные критерию Шеффе предпосылки для своего применения. Вычисления производятся по формуле [140, с. 164]
190
Глава 3. Дисперсионный анализ
где k — число выборок,
т — численность каждой выборки,
1	*	2
М -	~~ средний квадратичный остаток,
1 т
xL	= 1,2,..., k, — среднее i-й выборки.
т i=\
Для вычисления p-значений критерия Тьюки применяются таблицы стьюдентизированного размаха [140, с. 164], [151, с. 144], выполненные нами в виде функции RangeStudent, показанной в главе 4.
Обсуждение см. также в [28, вып. 2, с. 48], [120, с. 31].
Многофакторный анализ
Результаты опытов никогда в точности не соответствуют степени влияния на них того или иного признака. Происходит это потому, что на результаты оказывают влияние и неучтенные в условиях эксперимента факторы. При включении в дисперсионный анализ двух и более факторов имеет место многофакторный дисперсионный анализ (MANOVA), различные методики которого рассмотрены ниже.
Данные для двухфакторного дисперсионного анализа, который мы далее рассматриваем, представлены в виде таблиц, причем число столбцов соответствует числу уровней первого фактора (уровней обработки), число строк равно числу уровней второго фактора (уровней обработки) [120, с. 225]. Как и на протяжении всей книги, в наших программных реализациях таблицы представлены в виде одномерных массивов. Задается также число столбцов (уровней первого факто-1 ра) и число строк (уровней второго фактора).
Обсуждение см. в [156, с. 105].
Многофакторный анализ
191
Двухфакторный дисперсионный анализ
Двухфакторный дисперсионный анализ, иначе называемый дисперсионным анализом по двум признакам, применяется для зависимых нормально распределенных выборок. Нулевая гипотеза состоит в утверждении о равенстве эффектов строк между собой и равенстве эффектов столбцов между собой. Вычисления производятся по формулам [158, с. 191]:
5
I — та' f — С0< row	’ со!	’
1 г т2
где =-^Т2--^- — дисперсия между столбцами, с i=i
Iе	Т2
5СО1=-^Т2	~~ ДиспеРсия между строками,
r f=i	гс
7; = ,г = 1’ •••»г , ~ суммы строк,
Tj =	, j = 1,2,...,с, — суммы столбцов,
1=1
г с
х„ — общая сумма,
i=l 7=1
;=1 >1
Т2
— остаточный средний квадрат, гс
с — число столбцов (выборок), г— число строк (параметров).
Если рассматриваемые данные не удовлетворяют предположениям статистической модели дисперсионного анализа по двум признакам, необходимо применять описанный ниже непараметрический критерий Фридмана.
Доверительный уровень вычисляется функцией FDistribution с параметрами (г — 1) и (г — 1)(с — 1) в случае исследования эффекта строк и (с - 1) и (г - 1)(с - 1) в случае исследования эффекта столбцов. Обсуждение более общей проблемы см. в [28, вып. 2, с. 41].
192
Глава 3. Дисперсионный анализ
Исходные коды и пример применения
finclude <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void) {
int n = 10.	// Численность выборки
k = 4,	// Число выборок
Code;	// Код ошибки
double а[] - {1,2,3.4.5.1.2.3.4.5.
2.3.4.5.6.2.3.4.5.6.
1.3,5.7.9.1.3.5.7.9.
2.3.2.3.2.3.2.3.2.3}, г,с: // Критериальные статистики
if (!(Code = MultyFactor (a.n.k.&r.&c)))
cout « "Эффект строк: " « г
« ", р = " « FDistribution (n - l,(n - 1) * (k - l),r) « "ХпЭффект столбцов: " « с
« ", p = " « FDistribution (k - l,(n - 1) * (k - l),c) « endl;
else if (Code == -1)
cout « "Мало памятиХп";
el se cout « "Ошибка в вычисленияхХп";
}
int MultyFactor (double *data.int n, int k,double
*criterionR,double *criterionC) 11
// Функция проводит двухфакторный дисперсионный анализ.
// Обозначения:
//	data - массив к векторов данных (вектора друг за другом),
//	п - длина каждого вектора.
// *criterionR - критериальная статистика, эффект строк.
// *criterionC - критериальная статистика, эффект столбцов.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -1 при недостатке памяти.
// -2 при ошибке в вычислениях.
//
{
register int i.j; // Счетчик цикла
int nn = n * k, // Общее число вариант
m;	// Счетчик одномерного массива
double *x.*t.
// Рабочий массив
Многофакторный анализ
193
s = 0.	// Полная дисперсия
sr = 0,	// Дисперсия между строками
sc = 0.	// Дисперсия между столбцами
ttt;	// Вспомогательная переменная
if ((t = new double[MaximumOf (n.k)]) == 0) return -1;
if ((x = new double[MaximumOf (n.k)]) == 0) {
delete [] t:
return -1;
}
////////////////
// Эффекты строк
for (i =0. m = 0; i < k; i++)
{
for (j = 0: j < n; j++) x[j] = data[m++];
t[i] = VectorSum (x.n);
s += VectorSumSQ (x.n): sr += t[i] * t[i] / n;
}
ttt = VectorSum (t.k);
ttt *= ttt:
s -= ttt / nn: sr -= ttt / nn;
///////////////////
// Эффекты столбцов
for (i = 0: i < n; i++)
{
for (j = 0. m = i: j < k; j++)
{
x[j] = data[m]: m += n:
}
t[i] = VectorSum (x.k):
sc += t[i] * t[i] / k:
}
ttt = VectorSum (t,n);
ttt *= ttt:
sc -= ttt / nn:
delete [] t: delete [] x;
///////////////////////
И Остаточная дисперсия
s = (s - sr - sc) / (k - 1) / (n - 1):
7'2OO2
194
Глава 3 Дисперсионный анализ
if (s <= 0.000001) return -2:
sr /= к - 1: sc /= n - 1;
*criterionR = sr / s:
*criterionC = sc / s:
return 0; }
Ранговый критерий Фридмана
Если не выполнены предположения, позволяющие провести двух-1 факторный дисперсионный анализ, применяется свободный от типа распределения непараметрический критерий Фридмана. Ранговый двухфакторный анализ Фридмана (ранговый критерий Фридмана,] Кендалла и Смита) применяется для проверки нулевой гипотезы о том, что различные методы обработки или иных воздействий на изучаемый объект (процесс) дают одинаковые результаты [37, с. 244]. Таким образом, нулевая гипотеза состоит в отсутствии эффектов столч бцов (эффектов обработки).
Здесь предполагается, что данные расположены в виде прямоугольной матрицы, в которой п строк — блоков наблюдений параметров объектов — расположены в k столбцах, соответствующих видам обработки (видам воздействия на объекты). При этом каждый блок может быть результатом измерений параметров как на одном объек-| те, так и на группе объектов, например в виде среднего значения какого-либо параметра по всем объектам исследуемой группы при определенном виде воздействия на группу. Следующий блок, таким образом, будет средним значением другого параметра по всем объек-| там группы при том же виде воздействия. Отметим, что в зависимости от поставленной задачи матрица данных может быть транспонирована.
Вычисление статистики критерия производится по формуле [158, с. 196]
12 nk(k+l)
где k — число эффектов обработки (воздействий, уровней фактора), R., i =1,2,..., k, — сумма рангов г-го блока.
Многофакторный анализ
195
Доверительный уровень вычисляется функцией ChiSquareDistribu-tion при числе степеней свободы (k - 1).
Имеются разновидности приведенной формулы [123, с. 199], [187, с. 196], [218, с. 154], принципиально не отличающиеся от показанной нами. Хороший пример дан в [ 111, с. 170]. Обсуждение см. в [120, с. 59], [151, с. 407], [156, с. 129].
Исходные коды
int Friedman (double *data,int n, int k.double *criterion) //
// Функция проводит непараметрический дисперсионный анализ
И Фридмана по двум признакам для зависимых выборок.
// Обозначения:
// data - массив к векторов данных (вектора друг за другом), //	п - длина каждого вектора.
// *criterion - критериальная статистика.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -1 при недостатке памяти.
//
{
register int	i, j;	//	Счетчик
int kk = n *	k.	//	Общее число наблюдений
ml.m2.		//	Счетчик одномерного массива
*ix:		//	Информация об оригинальном массиве
double si = 0	,s2 = 0.	//	Вспомогательная переменная
s.			
*y.		//	Вспомогательный нассив
*x.		//	Массив рангов одного вектора
*r;		//	Массив рангов матрицы данных
if ((ix = new	int[k])	= =	0)
return -1;
if ((г = new double[kk]) == 0)
{
delete [] ix:
return -1:
. }
if ((x = new double[k]) == 0)
{
delete [] ix; delete [] r;
return -1;
. }
if ((y = new double[k]) == 0)
{
delete [] x; delete [] ix: delete [] r: return -1:
}
7*
196
Глава 3. Дисперсионный анализ
for (1 = 0, m2 = 0: i < n; 1++)
{
/ / / / / / / / / / / / / / /
// Копия строки
for (j =0. ml = m2; j < k; j++. ml += n) y[j] = data[ml];
lllllllllllillllllllllllilll // Сортировка по возрастанию SortArrayUp (y.k.ix.l);
/////////////// II Ранжирование Rank (y.x.k);
////////////////////////////////////////////// // Восстановление рангов оригинального массива UnSortArray (x.y.k.ix);
///////////////////////////////////////
// Заполнение массива рангов по строкам for (j = 0, ml = m2++; j < k; j++, ml += n) r[ml] = у[j]:
}
for (i = 0, ml = 0; i < k; 1++)
{
for (j = 0; j < n; j++) x[j] = r[ml++J;
s = VectorSum (x. n);
si += s;
s2 += s * s;
}
♦criterion = (s2 - si * si / k) * 12 / kk / (k + 1);
delete [] ix; delete [] r; delete [] x; delete [] y:
return 0;
}
Критерий Пэйджа
Критерий Пэйджа (Z-критерий, дисперсионный анализ Пэйджа) предназначен для проверки нулевой гипотезы о равенстве эффектов воздействия (обработки) на выборки (количество выборок превышает две) с неизвестными, но равными средними. Нулевая гипотеза состоит в утверждении о равенстве эффектов строк между собой и равенстве эффектов столбцов между собой. Статистика критерия вычисляется по формуле [218, с. 163]
Многофакторный анализ
197
1 = ^7?,,
1=1
где k — число эффектов обработки (воздействий, уровней фактора), 7?., i = 1,2,k, — сумма рангов i-го блока.
Для больших выборок применяется нормальная аппроксимация критических значений статистики L. В этом случае доверительный уровень вычисляется функцией NormalDistribution, вызываемой с параметром нормальной аппроксимации, вычисленным функцией Page.
Описание критерия Пэйджа можно найти также в [187, с. 229], [123, с. 224].
Исходные коды
int Page (double *data,int n. int k,double *criterion, double *t) //
// Функция проводит дисперсионный анализ Пэйджа, основанный
// на ранговых суммах Фридмана.
// Обозначения:
//	data - массив к векторов данных (вектора друг за другом),
//	п - длина каждого вектора.
// *criterion - критериальная статистика,
// *t - параметр нормальной аппроксимации.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -1 при недостатке памяти.
//
{
register int i.j; // Счетчик
int ml.m2. *ix;	// Счетчик одномерного массива // Информация об оригинальном массиве
double *y.	// Вспомогательный массив
*x.	// Массив рангов одного вектора
*r;	// Массив рангов матрицы данных
if ((ix - new int[k]) == 0) return -1;
if ((r = new double[n * k]) == 0) {
delete [] ix;
return -1;
}
if ((x = new double[k]) == 0)
{
delete [] ix; delete [] r;
198
Глава 3 Дисперсионный анализ
return -1;
}
if ((у = new double[k]) == 0)
{
delete [] x; delete [] ix; delete [] r;
return -1: }
for (i = 0, m2 = 0: i < n: i++) {
///////////////
// Копия строки for (j = 0. ml = m2: j < k: j++, ml += n) y[j] = data[ml];
SortArrayUp (y.k.ix.l):
Rank (y.x.k):
UnSortArray (x.y.k.ix):
/////////////////////////////////////// // Заполнение массива рангов по строкам for (j =0, ml = m2++: j < k: j++, ml += n) r[ml] = y[j];
}
for (i = 0. ml = 0, *criterion = 0: i < k: 1++) {
for (j = 0: j < n: j++) x[j] = r[ml++]:
♦criterion += VectorSum (x.n) * (k - i): }
*t = (*criterion - 0.25 * n * k * (k + 1) * (k + 1)) / sqrt (0.00694444 *n*(k*k*k-k)*(k*k*k-k) / (k - 1)):
delete [] ix: delete [] y: delete [] r: delete [] x:
return 0: }
Q-критерий Кокрена
Q-критерий Кокрена используется в случае, если группы однородных субъектов подвергаются более чем двум экспериментальным воздействиям, и их ответы (0 означает отрицательный ответ, 1 — положительный) носят двухвариантный (бинарный) характер. Каждая выборка представляет собой измерения одного условия по всем группам. Варианты выборки, таким образом, — это измерения в рассматриваемых группах по данному условию. Нулевая гипотеза со
Многофакторный анализ
199
стоит в том, что в генеральной совокупности доли всех экспериментальных условий равны. В альтернативной гипотезе утверждается, что доли условий в генеральной совокупности различны. Вычисления производятся по формуле [172, с. 61]
где Tj =	= 2, — >с> ~ суммы столбцов,
»=1
TL = 1,2,rf — суммы строк, >=i
с — число столбцов (выборок),
г — число строк (параметров).
Доверительный уровень вычисляется функцией ChiSquareDistribu-tion при числе степеней свободы, равном (с - 1).
Обсуждение дано в [37, с. 246].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h”
void main (void)
{
int k = 4. // Число столбцов (выборок) n = 15; // Число строк (параметров)
double data[] = {0.0.О,0,1.0,1.1,0,0.1,1,0,1,1, 0,1,1,0,0,1,1,0.1,0.1,1,0,0.1. 0,0,0,0.1,0,0,0,1,0.0,1,0,0,1, 0.1.1,0,1.1,1.1.0.1.1,0,1,1,1}.
Ч:
if (ICochraneQ (data.n.k,&q))
cout « q « ". p = " « ChiSquareDistribution (k - l.q) « endl;
el se
200
Глава 3. Дисперсионный анализ
cout « "Мало памяти\п":
}
int CochraneQ (double *data.int n, int k,double *criterion) //
// Функция вычисляет Q-критерий Кокрена.
// Обозначения:
11	data - нассив k векторов данных (вектора друг за другом),
//	п - длина каждого вектора.
// *criterion - критериальная статистика.
// Возвращаемое значение:
//	0 при нормальном окончании расчета,
// -1 при недостатке памяти.
//
{
register int i,j; // Счетчик цикла
int m = 0:	//	Счетчик одномерного массива
double *x,*t,	H	Рабочий массив
si = 0,	H	Сумма итоговых значений по столбцам
s2 = 0,	//	Сумма квадратов si по столбцам
s3 = 0,	//	Сумма итоговых значений по строкам
s4 = 0;	//	Сумма квадратов s3 по строкам
if ((х = new double[MaximumOf (n.k)J) == 0) return -1:
if ((t = new double[MaximumOf (n.k)J) == 0) {
delete [] x:
return -1;
}
for (i = 0; i < k; i++)
{
for (j = 0; j < n; j++) x[j] = data[m++];
t[i] = VectorSum (x,n);
si += t[i]:
s2 += t[i] * t[i);
}
for (i = 0; i < n: i++)
{
for (j = 0. m = i; j < k; j++)
{
x[j] = data[m]:
m += n:
}
t[i] = VectorSum (x,k);
s3 += t[i]:
s4 += t[i] * t[i];
Многофакторный анализ
201
★criterion = fabs ((k * s2 - si * si) * (k - 1) / (k * s3 -s4));
delete [] x: delete [] t:
return 0:
}
Критерий Шеффе для связанных выборок
Дисперсионный анализ по двум признакам (двухфакторный дисперсионный анализ) позволяет обнаружить существование эффектов столбцов (эффектов обработки) в таблице дисперсионного анализа Однако он не дает возможности точно указать столбцы, которые обладают нулевыми эффектами. Подход с попарными сравнениями всех выборок между собой будет неверным, как это показано в [ 158, с. 198]. Для решения проблемы применяется метод множественного сравнения Шеффе (критерий Шеффе) для связанных выборок. Вычисления производятся по формуле [там же]
(г \2
f=-L±!—L (г -1)^уС|2 с i=l
rc т2
где 5 = V у х2 - — — остаточный средний квадрат,
’ ГС т с
Т	— общая сумма,
с — число столбцов (выборок),
г~ число строк (параметров),
остальные обозначения те же, что и при описании критерия Кокрена. Обратим внимание, что в показанной формуле с без индекса — это число строк (общепринятое обозначение для многофакторного дисперсионного анализа), а с„ i =1,2,..., г, — константы (общепринятое обозначение для проверки гипотез о линейных контрастах).
Доверительный уровень вычисляется функцией FDistribution с параметрами (г- 1) и (г - 1)(с - 1) в случае исследования эффекта строк и (с - 1) и (г- 1)(с - 1) в случае исследования эффекта столбцов.
202
Глава 3. Дисперсионный анализ
Нами дан пример применения критерия Шеффе для проверки серии гипотез о простых линейных контрастах между строками и столбцами вида [158, с. 199]
L =	- Hj =0,i= 1,2,k - l,j = i + 1,k.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void) {
register int i.j.	//	Счетчики цикла
m:	//	Счетчик
int n = 10,	//	Численность каждой выборки
k = 4,	//	Число выборок
nl.n2.	//	Рабочие переменнные
Code:	//	Код ошибки
double a[] = {1.2,3,4.5.1,2,3.4.5.
2.3.4.5.6.2.3.4.5.6.
1.3.5.7.9.1.3.5.7.9.
2.3.2.3.2.3.2.3,2.3}.
*r,*c:	// Массивы критериальных статистик
г = new double[(n * n - n) /2]:
c = new double[(k * k - k) I 2];
if ('(Code = ScheffePair (a.n.k.r.c)))
{
nl - n - 1;
n2 = (k - 1) * nl:
cout « "Эффекты строк:\n": for (i=0, m=0:i<n-l: i++) for (j = i + 1; j < n; j++.m++)
cout « (i + 1) «	« (j + 1) « " " « r[m]
<< ", p = " « FDistribution (nl.n2,r[mj) « endl:
nl = k - 1:
n2 = (n - 1) * nl:
cout « "Эффекты столбцов:\n";
for (i = 0. m = 0: i < k - 1: i++)
for (j=i+l:j<k: j++,m++)
cout « (i + 1) «	« (j + 1) « " " « c[m]
« ". p = " « FDistribution (nl.n2,c[mj) « endl: }
Многофакторный анализ
203
else if (Code == -1)
cout « "Мало памятиХп";
el se
cout « "Ошибка в вычисленияхХп";
delete [] г; delete [] с:
}
int ScheffePair (double data[].int n, int k,double criterionR[].double criterionCf]) //
// Функция проводит множественные сравнения по Шеффе
// для зависимых выборок.
// Обозначения:
// data - массив к векторов данных (вектора друг за другом).
//	п - длина каждого вектора.
// criterionR - массив длиной (п * п - п)/2. эффект строк.
// criterionC - массив длиной (к * к - к)/2. эффект столбцов.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -1 при недостатке памяти.
// -2 при ошибке в вычислениях.
//
{
register int i.j; // Счетчик цикла
int nn m;	= n * k.	// Общее число вариант // Счетчик одномерного массива
double	*x,	// Рабочий массив
	*t.	// Рабочий массив, затем средние по строкам
	*tl.	// Рабочий массив, затем средние по столбцам
	s = 0.	// Полная дисперсия
	sr = 0.	// Дисперсия между строками
	sc = 0.	// Дисперсия между столбцами
	ttt;	// Вспомогательная переменная
if ((t = new double[k]) == 0) return -1;
if ((tl = new double[n]) == 0)
{ delete [] t; return -1;
}
if ((x = new double[MaximumOf (n.k)]) == 0) {
delete [] t; delete [] tl;
return -1;
}
//////////////// // Эффекты строк
204
Глава 3.
Дисперсионный
анализ
for (1 = 0. ш = 0: 1 < к; 1++) { for (j = 0; j < n: j++) x[j] = data[m++J;
t[i] = VectorSum (x.n): s += VectorSumSQ (x.n); sr += t[i] * t[i] / n;
}
ttt = VectorSum (t.k);
I ttt *» ttt; s -= ttt / nn; sr -= ttt / nn;
///////////////////
// Эффекты столбцов for (i = 0; i < n: 1++)
{
for (j = 0. m = i; j < k; j++. m += n) x[j] = data[m];
tl[i] = VectorSum (x.k); sc += tl[i] * tl[i] / k;
}
ttt = VectorSum (tl.n): ttt *= ttt; sc -= ttt / nn;
/////////////////////// // Остаточная дисперсия s = (s - sr - sc) / (k - 1) / (n - 1);
if (s < 0.000001) {
delete [] t; delete [] tl; delete [] x; return -2;
}
for (i = 0; 1 < к; 1++) t[i] /= n;
for (i = 0; i < n; 1++) tl[i] /= k;
for (i = 0, m = 0; i < n - 1; i++) for (j - i + 1; j < n; j++)
criterionR[m++] = (tl[1J - tl[jj) * (tl[i] - tl[jj) * к / (n - 1) / s / 2;
for (i =0, m=0: 1 < к - 1; i++)
for (j = i + 1: j < k; j++) criterionC[m++] = (t[i] - t[j]) * (t[i]
- 1)/ s / 2;
t[jj) * n
(k
дальнейшие исследования и программные ресурсы 205
delete [] t: delete [] tl; delete [] x;
return 0:
}
Дальнейшие исследования и программные ресурсы
• Расширение номенклатуры методик анализа данных методами 3 однофакторного и многофакторного дисперсионного анализа.
Представленные в главе расчеты можно проделать с помощью одной из десятков программ анализа данных, имеющихся на рынке программного обеспечения для научных исследований. По крайней мере, это полезно для проверки правильности расчета.
Глава 4. Теория распределений
В настоящей главе излагаются методы расчета теоретических распределений различных статистических показателей.
*Определенная сложность, с которой мы столкнулись при формиро-4	вании структуры настоящей книги, заключалась в том, что построе-
ние эмпирических распределений нам хотелось рассмотреть в главе 1, так как с эмпирическими частотами связана методика построения гистограммы — одной из основных характеристик выборки. В то же время эмпирические распределения невозможно рассмотреть, предварительно не введя определения плотности распределения, функции распределения, дискретных и непрерывных распределений, уровня значимости и коэффициента доверия. Поэтому понятия о функциях распределения мы ввели в разделе «Вариационная статистика» главы 1, где рассмотрели методику построения эмпирических распределений, а в конце настоящей главы рассмотрим пример вычисления теоретических частот эмпирических распределений. Основные понятия, касающиеся характеристик гипотез, были введены в главе 2.
Общая методика
При вычислении распределений используются:
•	точное вычисление критических значений;
•	прямое интегрирование формул распределения;
•	разложение в бесконечный ряд и взятие конечного числа членов ряда;
•	кусочная аппроксимация элементарными функциями;
•	аппроксимация с помощью нейронной сети.
Точное вычисление с успехом применяется только при вычислении параметров дискретных распределений. При этом используется тот или иной рекуррентный алгоритм, что часто ведет к неоправданно! большому времени счета. Эта проблема затрудняет программную реа-| лизацию диалоговой статистической программной системы (не за-|
Общая методика
207
ставлять же пользователя ждать результата несколько минут!) и часто без потери точности выводов решается с помощью аппроксимации статистик критериев другими стандартными распределениями, как показано при описании соответствующих критериев.
Прямое интегрирование обычно производится по формуле трапеций либо с помощью формулы Симпсона, представленной в главе 16, хотя может быть применен и любой другой метод, например метод Монте-Карло [135, с. 386], [210, с. 26] или метод Гаусса [128, с. 219]. Наиболее полно вопросы расчета основных непрерывных статистических распределений — нормального распределения, Z2 3 -распределения и ^-распределения — с помощью рядов рассмотрены в [159]. Удобнее указать общий подход, чем проводить элементарные выкладки для частных случаев. Пусть требуется вычислить некоторую статистическую функцию распределения, в общем виде представленную формулой [159, с. 333]
Вычисление данного интеграла, который для перечисленных непрерывных статистических распределений не берется в квадратурах, упрощается благодаря следующим обстоятельствам:
1. Значение функции Р(°°) = 1, а следовательно, для симметричных относительно х = 0 распределений
P(x)=jf(t)dt = ± + jf(t)dt-—	z о
2. Функция /(f) довольно быстро затухает при увеличении |ф поэтому, даже если не использовать свойство 1, левый предел, при котором Р(х) = 0 при заданной точности вычислений, можно указать довольно точно.
3. Функция/(£) непрерывна и дифференцируема бесконечное число раз, поэтому решение может быть получено разложением в ряд Тейлора или Маклорена. Это наиболее быстрое, в смысле времени работы программы, решение, если необходима гарантированная точность.
Предположим, что подынтегральная функция определена в некоторой окрестности t0 и имеет в этой точке производные всех порядков,
208
Глава 4. Теория распределений
согласно свойству 3. Тогда подынтегральная функция может быть представлена в виде бесконечного степенного ряда Тейлора [135, с. 578]:
и=0
п! о)
При t0 = 0 разложение функции принимает более простой вид и называется рядом Маклорена:
4
/«>=££»
t" 
Подставив данное выражение в формулу вычисления определенного интеграла, после элементарных выкладок и взятия интеграла получим

п=0
/(л)(0) (п + 1)!
х”+1
Осталось вычислить для функции распределения производную порядка п в общем виде (если это возможно) и приступать к составлению достаточно простой программы [ 128, с. 149]. Количество удерживаемых членов разложения частичной суммы порядка п [135, с. 533] зависит как от требуемой точности, так и от интервала значений переменной. Случай разложения в ряд Маклорена функции т переменных представлен в [там же, с. 333], что необходимо, например, для вычисления функции F-распределения.
Кусочная аппроксимация при вычислении непрерывных статистических распределений, как правило, не обеспечивает точность, сопоставимую с точностью рассмотренного выше метода, однако при. достаточной для практического применения точности (до 2-3 знаков после десятичной запятой) сильно превосходит другие методы по скорости вычислений. Иногда аппроксимации делаются и при наличии точных формул, применение которых невыгодно из соображений высокой трудоемкости вычислений. В необходимых случаях аппроксимации были сделаны нами в электронных таблицах Microsoft Excel, а также с помощью функций, представленных в главе 15.
Аппроксимация с помощью нейронной сети выполняется с доста-| точной для практического применения точностью, обычно до 2-4 зна-j
функции распределения и обратные функции распределения 209
ков после десятичной запятой, и применяется либо при недоступности источников с опубликованными формулами распределений, либо если эти формулы крайне сложны.
Функции распределения и обратные функции распределения
По определению [211, с. 8], для функции распределения F, отображающей значение х в вероятность а, обратная функция G, отображающая а в х, называется обратной функцией распределения. Поэтому в показанных функциях (там, где речь идет о доверительном уровне или уровне значимости, а не о критических или пороговых значениях статистик) мы приняли, что функции, возвращающие значение статистики для заданного доверительного уровня или уровня значимости, называются обратными (inverse). Действительно, величины, вычисленные по формулам распределений, представляют собой вероятности, полученные в зависимости от значений статистик. Напротив, приводимые в сборниках статистических таблиц распределения представляют собой значения статистик, вычисленные в зависимости от вероятностей, то есть являются решениями обратных задач. Поэтому функции, возвращающие значение доверительного уровня или уровня значимости для заданного или вычисленного значения статистики, имеют то же наименование, за исключением слова Inverse. Для методов вычислений функций распределения, не предполагающих наличие методов вычисления обратной функции, слово Inverse не применяется.
Обратное распределение обычно вычисляется делением отрезка пополам. Возможно, это не лучшее решение в смысле скорости вычислений, но процесс сходится достаточно быстро, и для практических вычислений скорость приемлема. Для повышения скорости и точности вычислений возможно применение любого другого локального метода одномерной минимизации.
Одномерные распределения
Представленные ниже распределения подразделяются на непрерывные и дискретные, как показано в главе 1. Рассмотрены как основные стандартные типы распределений, так и вычисленные на их основе специфические распределения статистик различных тестов.
210 Глава 4. Теория распределений
Непрерывные распределения
В [32], [37, с. 136], [47], [63, с. 46], [72, с. 62], [134], [140, с. 126] можно найти структурированную информацию о взаимосвязи различных непрерывных теоретических распределений. На рис. 4.1 схематически показаны точные взаимоотношения между основными непрерывными одномерными распределениями. Эта информация поможет снизить объем кода программной реализации распределений различных типов: многие распределения могут быть запрограммированы с использованием кода уже составленных функций. Формулы здесь не приводятся, но при описании распределений в настоящей главе указаны подробные формулы и даны исходные коды функций для вычисления.
Рис. 4.1. Взаимоотношения между основными непрерывными одномерными распределениями
Примерно такая же схема представлена в [156, с. 39], причем в источнике отражены также связи непрерывных и дискретных типов распределений и несколько частных случаев.
Нормальное распределение и обратное к нему, нормальный интеграл
Функция плотности нормального распределения (- оо < д < оо, ст >0) имеет вид [158, с. 97]
р	, — ОО < X < оо .
aVSF
В [84, с. 73] путем введения нормированного отклонения
Одномерные распределения
211
где а — обычно среднее арифметическое,
ст2 — дисперсия,
показанной выше формуле придан несколько иной вид. Этой формулой удобно пользоваться при расчете теоретических частот эмпирического распределения. К тому же таблицы обычно даются для функции [84, с. 73], называемой также плотностью вероятности стандартизованной (стандартной) нормальной случайной величины [151],
1
Функция плотности нормального распределения имеет краткое обозначение N(a, сг2). Стандартное нормальное распределение обозначается как 7V(0,l). Функция стандартного нормального распределения [140, с. 93]
1
и называется функцией Лапласа (вторым законом распределения Лапласа) [там же, с. 75], [135, с. 307] либо законом Гаусса (гауссовым распределением) в честь применения данного закона распределения для изучения ошибок наблюдений.
Для вычисления функции стандартного нормального распределения нами применяется аппроксимационная формула, данная в [161, с. 439]. Другие аппроксимации даны в [140, с. 95]. В [139, с. 280], помимо теоретических выкладок даны программы аппроксимаций на языке программирования Бейсик. Свойства стандартного нормального распределения рассмотрены в [33, с. 33], [37, с. 60], [63, с. 44], [187, с. 74]. В [128, с. 149] подробно проанализировано вычисление интеграла вероятностей
Р(х) = —== f e~^/2dy
путем разложения в ряд. Результатами обсуждения легко воспользоваться для вычисления функции распределения, вспомнив введенное в разделе «Общая методика» свойство 2, а именно разделив полученное по формуле число на 2, а затем прибавив к нему 0,5.
212
Глава 4. Теория распределений
Исходные коды
double NormalDistribution (double х)
//
// Вычисление функции стандартного нормального распределения.
// Обозначения:
// х - функция распределения.
// Возвращаемое значение:
// доверительный уровень.
//
^double с[] = {0,0.196854,0.115194.0.000344,0.019527};
return 1.0 - 0.5 / pow (1 + Horner (с,4,х),4);
}
В ситуциях, когда необходима повышенная точность (до 5-6 знаков после десятичной запятой), для вычисления функции стандартного нормального распределения мы используем прямое интегрирование. Наилучшую точность дает метод Симпсона, применяемый путем вызова функции Simpson без каких-либо модификаций последней. Нижний предел интегрирования и число узлов интегрирования подобраны эмпирически.
Исходные коды
double Normal Distribution! (double x)
//
// Вычисление функции стандартного нормального распределения.
// Обозначения:
// х - стандартизированная случайная величина.
// Возвращаемое значение:
// уровень значимости.
//
{
return Simpson (-15,х,lOO.NormalDensity) / sqrt (M_PI * 2);
}
double NormalDensity (double t)
//
// Функция вычисления плотности вероятности стандартизированной // случайной величины.
// Обозначения:
// х - стандартизированная случайная величина.
// Возвращаемое значение.
// значение плотности вероятности.
//
{
return 1.0 / exp (t * t / 2);
}
Результат работы следующей функции называется также нормальным интегралом [91, с. 412] и применяется в различных статиста-
Одномерные распределения
213
ческих алгоритмах. Аппроксимация производится по формулам, данным в [161, с. 440], [174, с. 154].
Исходные коды
double InverseNormalDistribution (double р)
//
// Функция вычисления обратной функции стандартного нормального // распределения.
// Обозначения:
// р - доверительный уровень.
// Возвращаемое значение:
// функция распределения.
//
{
int flag = 1: // Параметр для учета симметрии распределения
double t; // Рабочая переменная
if (р < 0.5)
р = 1 - р:
else if (р == 0.5)
return 0.0:
el se
flag = 0:
///////////////////
// Разложение в ряд
t = sqrt (- 2.0 * log (1.0 - p)):
t -= (2.515517 + 0.802853 * t + 0.010328 * t * t) /
(1.0 + 1.432788 * t + 0.189269 * t * t + 0.001308 * t *
t * t):
if ('flag) return t:
el se return -t;
}
Г-распределение, Z*- распределение и обратное к нему
Плотность Г-распределения (гамма-распределения) ( а > 0, Р > 0) определяется формулой [63, с. 47]
/(х)= Г(а)
——ха 'е Рх,х>0,
0,х<0.
214
Глава 4. Теория распределений
%2 -распределение (хи-квадрат распределение) является частным случаем Г-распределения [63, с. 47] с параметрами ct - n/2, Р = 1/2, поэтому плотность Z -распределения [187, с. 79]
/(*) =
1 2”/2Г(и/2)
x”/2"iex/2,x>0,
0,х<0.
2
Вычисление функции X -распределения производится по формуле [32, с. 16]
Fn(x)= 1-Рл(х),
где Р„(х, п) — интеграл вероятностей с2, вычисляемый по формуле [там же, с. 15, формула (1)]
Р (х) = - ------fyn/2~ie~y/2dy •
7 2"/2Г(и/2р/
Прямое вычисление по данной формуле реализует показанная ниже функция ChiSquarelntegral. Интегрирование производится по формуле трапеций, причем при п - 1 число интервалов интегрирования взято значительно большим, чем для других значений параметра, с целью получения приемлемой точности решения. Параметры быстродействия и точности, очевидно, могут быть значительно улучшены, если применять более совершенную формулу интегрирования либо интегрирование путем разложения в ряд [159, с. 335]. Данный подход обеспечивает заданную точность и требует от программиста только аккуратности.
Для больших выборок вычисляется аппроксимация обратного X -распределения [161, с. 442]. Если нужно вычислить Q-процентную точку X -распределения, весь код показанной далее функции ChiSquareDistribution следует заменить на
return ChiSquarelntegral (n.x) * 100.
В [174, с. 147] даны другие формулы вычисления, в которых используются асимптотические свойства оценок параметров, входящих в выражение функции распределения, а в [140, с. 116] обсуждаются различные аппроксимации. Подробности о приемах вычисления X -распределения см. в [37, с. 74], где также даны полезные аппроксимации. Авторы [211, с. 63] дают сводку связи X -распределения с дру-
Одномерные распределения
215
гимн типами распределений. Другой частный случай Г-распределе-ния — распределение Эрланга — проанализирован в [211, с. 79], [206, с. 111]
Исходные коды
double ChiSquareDistribution (double n.double x) //
// Вычисление функции хи-квадрат-распределения.
// Обозначения:
// n - число степеней свободы,
// х - функция распределения.
// Возвращаемое значение:
// доверительный уровень.
//
{ double buf;
if (х < 0.0001)
return 0:
buf = 1.0 - ChiSquarelntegral (n.x);
if (buf > 1.0)
return 1.0;
else
return buf;
}
double InverseChiSquareDistribution (double n.double p)
//
// Функция вычисления обратной функции
// хи-квадрат-распределения.
// Обозначения:
// п - число степеней свободы,
// р - доверительный уровень.
// Возвращаемое значение:
// функция распределения.
//
{
double с = 0.0000003, // Левая граница локализации
d,	// Открытая правая граница локализации
у = с + 10.0, // Вспомогательная переменная cx.dx.
а[] = {0.0001,-0.020323,2.051022.-3.722753.13.242947, -18.82835.11.432256};
if (n == 1)
{
if (р <= 0.8)
return Horner (а.б.р):
if (р > 0.8 && р <= 0.9)
216
Глава 4. Теория распределений
return 10.64 * р - 6.87;
else if (р > 0.9 && р <= 0.95)
return 22.7 * р - 17.724;
else if (р > 0.95 && р <= 0.975)
return 47.32 * р - 41.113;
else if (р > 0.975 && р <= 0.99)
return 107.4 * р - 99.691;
else if (р > 0.99 && р <= 0.995)
return 248.8 * р - 239.677;
else if (р > 0.995 && р <= 0.999)
return 737.25 * р - 725.68475;
else if (р > 0.999)
return 2575.999993 * р - 2562.595993;
}
if (n < 120)
{
/////////////////////////////////////
// Поиск границ интервала локализации
сх = р - ChiSquareDistribution (п,с);
beg:
dx = сх * (р - ChiSquareDistribution (п.у));
if (!dx)
return у;
else if (dx > 0)
{
у += 1; // Шаг поиска goto beg;
}
el se
d = y;
//////////////////////////////////////////////////// // Уточнение корня в найденной интервале локализации // методом деления отрезка пополам do
{
сх = р - ChiSquareDistribution (п.с):
у = (с + d) / 2;
сх *= р - ChiSquareDistribution (п.у);
if (!сх)
return у;
else if (сх > 0)
с = у;
el se
d = у;
} while (fabs (с - d) > 0.0001);
return у;
}
el se
return InverseChiSquareDistributionBig (n.p);
}
Одномерные распределения
217
double InverseChiSquareDistributionBig (double n,double p) //
// Вычисление обратной функции хи-квадрат-распределения
// для больших выборок.
// Обозначения:
// п - число степеней свободы.
// р - доверительный уровень.
// Возвращаемое значение:
// функция распределения.
//
double t = InverseNormalDlstribution (р) + sqrt (2 * n - 1);
return t * t / 2:
}
double ChiSquarelntegral (double n.double x)
//
// Функция вычисления интеграла вероятностей хи-квадрат-
// распределения.
// Обозначения:
// п - число степеней свободы.
// х - параметр.
// Возвращаемое значение:
// доверительный уровень.
//
{
double s = 0.
У.
h = х / 1000.
п2 = п / 2.
c.d = 0:
if (n == 1) h /= 100;
for (у = h; у <= x; у += h)
{
c = d;
d = pow (y,n2 - 1) / exp (y / 2);
s +» c + d;
}
return 1.0 - s * h / pow (2.0.n2) / Gamma (n2) / 2:
В-распределение и обратное к нему
Плотность В-распределения (бета-распределения) (а > 0. Р > 0) задается как [63, с. 47]
218
Глава 4. Теория распределений
/(*)=
Г(«)Г(Д)
ха 1(1-х)р 1,0<х<1,
0,х<0,х>1.
Функция В-распределения определяется формулой [32, с. 27]
0
где В(д,6) — В-функция Эйлера, а = п2 / 2, Ь = п,/2.
Для больших выборок практическое вычисление производится по асимптотической формуле [32, с. 29, 31]. Обсуждение дано в [37. с. 135], [211, с. 75].
Исходные коды
double BetaDistribution (double nl.double n2.double x) //
// Вычисление функции В-распределения.
// Обозначения:
// nl и n2 - параметры распределения,
//	х - функция распределения.
// Возвращаемое значение:
// доверительный уровень.
//
{
double s = 0.
to = 0.000000001. h = х / 200, а = n2 / 2.b = nl / 2.
c.d.y.t;	// Рабочая переменная
if (nl <= 120 && n2 <= 120) {
////////////////////////////// // Прямое вычисление интеграла d = pow (t0.а - 1) * pow (1.0 - tO.b - 1); for (t = h; t <= x; t +- h)
{ c = d;
d = pow (t.a - 1) * pow (1.0 - t.b - 1):
s += h * (c + d) / 2: }
s /= Beta (a.b);
Одномерные распределения
219
//////////////////////////////////////////
// Компенсация небольших ошибок округления
if (s < 0)
return 0;
else if (s > 1)
return 1;
el se return s:
}
el se
{
////////////////////////////////////
// Аппроксимация для больших выборок do
{
t = х - InverseBetaDistributionBig (nl,n2,c);
у = (c + d) / 2;
t *= x - InverseBetaDistributionBig (nl.n2.y):
if (t == 0) return y;
else if (t > 0)
c = y;
el se
d = y:
} while (fabs (c - d) > 0.00000001): return y;
}
}
double InverseBetaDistribution (double nl, double n2, double p) //
// Функция вычисления обратной функции В-распределения.
// Обозначения:
// nl и п2 - параметры распределения.
//	р - доверительный уровень.
// Возвращаемое значение:
// функция распределения.
//
{
double с =	0.000001, //	Левая граница локализации
d =	1.	//	Правая граница локализации
у,	//	Середина интервала локализации
t:	//	Рабочая переменная
if (nl < 120 && n2 < 120)
{
do
{
t = р - BetaDistribution (nl.n2.c);
у = (с + d) / 2:
t *= р - BetaDistribution (nl,n2.y);
if (t == 0)
220
Глава 4. Теория распределений
return у;
else if (t > 0)
с = у;
el se
d = у;
} while (fabs (c - d) > 0.00000001);
return y;
}
el se
return InverseBetaDistributionBig (nl,n2,p);
}
double InverseBetaDistributionBig (double nl, double n2, double p) //
// Функция вычисления обратной функции В-распределения
// для больших выборок.
// Обозначения:
// nl и п2 - параметры распределения,
//	р - доверительный уровень.
// Возвращаемое значение:
// функция распределения.
//
{
double а = п2 / 2,b » nl / 2. // Параметры распределения
t.c;	// Рабочая переменная
t = 1 / (Ь * 2 + а - 1);
с ~ InverseChiSquareDistributionBig (п2,р);
return с * 2 / (2.0 /t+c-
((а * а - 1) * 2 + (а - 1) * с - с * с) * t / 6):
}
F-распределение и обратное к нему
Функция плотности F-распределения (т > 0, п > 0) имеет вид [158, с. 102]

Г(7п/2+и/2)	xm/2-l
Г(т/2)Г(Я/2)[п] z т 1 +—х
I п 0,х<0.
,0<Х<оо,
где т — число степеней свободы числителя, п — число степеней свободы знаменателя.
Терминология и подробное обсуждение дано в [63, с. 50], [151, с. 63], [187, с. 81]. F-распределение (распределение дисперсионного отно
Одномерные распределения
221
шения) подробно рассмотрено в [211, с. 66]. Функция F-распреде-дения обычно выражается и вычисляется через функцию В-распре-деления [32, с. 33], [37, с. 136], [161, с. 444], а практически может быть вычислена с заданной точностью также путем разложения вряд [159, с. 335].
Исходные коды
double FDistribution (double nl, double n2, double x)
//
// Вычисление функции F-распределения.
// Обозначения:
// nl и n2 - параметры распределения.
//	х - функция распределения.
// Возвращаемое значение:
// доверительный уровень.
//
{
return 1.0 - BetaDistribution (nl,n2.n2 / (n2 + nl * х));
}
double InverseFDistribution (double nl. double n2. double p) //
// Вычисление обратной функции F-распределения.
// Обозначения:
// nl и n2 - параметры распределения.
//	р - доверительный уровень.
// Возвращаемое значение:
// функция распределения.
//
{
double х;
if (nl == 1)
{
х = InverseTDistribution (n2,p / 2 + 0.5); return x * x;
}
else if (n2 == 1)
{
x = InverseTDistribution (nl.l - p / 2); return 1/x/x;
}
el se
{
x = InverseBetaDistribution (nl,n2,l - p);
return n2 / nl * (1 - x) / x;
222
Глава 4. Теория распределений
{-распределение Стьюдента и обратное к нему
Плотность ^-распределения ( а > 0) вычисляется по формуле [63, с. 48]

Г((а + 1)/2)Г
л/шгГ(а/2)^ а
,-©о<Х<оо.

Функция ^-распределения определяется по формуле [32, с. 23], [174], [151, с. 27]

1 Г((и+1)/2) j- Л Г(и/2) £
и
2 х-(и+1)/2
- du •
п
При п -» оо распределение Стьюдента становится нормальным. Счи-1 тается, что нормальное приближение корректно уже при п > 30 [50, с. 51]. Обсуждение дано также в [187, с. 80]. В случае п = 1 £-распре-1 деление называют распределением Коши [63, с. 49], [70, с. 92]. Этот факт учитывается в показанной ниже функции. В [152, с. 46], [159, с. 336] приводятся достаточно простые формулы вычисления рассматриваемого распределения путем взятия конечного числа членов бесконечного для достижения любой заданной точности.
Исходные коды
double TDistribution (double n.double t) 11
// Вычисление функции t-распределения.
// Обозначения:
// n - число степеней свободы, // t - функция распределения. // Возвращаемое значение: // доверительный уровень. //
{ double s = 0,	//	Начальное значение	интеграла
u, h = 0.	// 04,	//	Текущая переменная Шаг интегрирования	
c.d.	//	Значения на концах	интервала
n2 = n n3 = -	/ 2.	// n2 - 0.5:	Вспомогательная величина	
if (n == 1)
//////////////////////////////////////////// // Аппроксимация функцией распределения Коши return atan (t) / M_PI + 0.5:
Одномерные распределения
223
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
// Прямое интегрирование по формуле трапеций
d = pow (t * t / n + 1,пЗ):
for (u = t - h: u >= -30; u -= h)
{
c = d;
d » pow (u * и / n + l,n3):
s += h * (c + d) / 2;
}
return s * Gamma (n2 + 0.5) / Gamma (n2) / sqrt (M_PI * n); }
С целью уменьшения времени счета для некоторых значений обратной функции 7-распределения там, где это допустимо из соображений точности, производится аппроксимация. См. [32, с. 25], Q рассматривается в [92, с. 554], Р = 2(1 - F) рассматривается в [151, с. 27].
Исходные коды
double InverseTDistribution (double n, double p) //
// Вычисление обратной функции t-распределения.
// Обозначения:
// n - число степеней свободы.
// р - доверительный уровень.
// Возвращаемое значение:
// функция распределения.
//
{
int m =	= (int) n -	1: //	Индекс элемента массива
double	c = 0.	//	Левая граница локализации корня
	d = 7.	//	Правая граница локализации корня
	У.	//	Середина интервала локализации
	ex,	//	Значения функции на конце интервала
/////////////////////////////////////////////////////////////// ///////
// Табличные значения для "трудных" в вычислительном смысле
// интервалов
t95[]	= {2.9200.2.3534.2.1318.2.0150.1.9432.1.8946.
1.8595.1.8831.1.8125.1.7959.1.7823}.
t975[] = {4.3027.3.1824.2.7764.2.5706.2.4469.2.3646.
2.3060.2.2622.2.2281,2.2010.2.1788}.
t99[]	= {6.9646.4.5407.3.7469,3.3649.3.1427.2.9980.
2.8965.2.8214.2.7638.2.7181.2.6810}.
t995[] = {9.9248.5.8409.4.6041.4.0321.3.7074.3.4995.
3.3554.3.2498,3.1693.3.1058.3.0545}.
t9975[] = {14.0890,7.4533.5.5976.4.7733.4.3168.4.0293.
3.8325.3.6897.3.5814.3.4966.3.4284}.
224
Глава 4. Теория распределений
t999[] » {22.3271.10.2145.7.1732,5.8934,5.2076,4.7853, 4.5008.4.2968.4.1437.4.0247.3.9296}.
t9995[] = {31.5991.12.9240.8.6103,6.8688.5.9588.5.4079.
5.0413.4.7809,4.5869.4.4370.4.3178}:
////////////////////////////////////////////
11 Аппроксимация функцией распределения Коши if (m == 0)
return tan (M_PI * (p - 0.5)):
if (m < 12 && p > 0.95)
{
////////////////////////////////////////////////
'	// Сдвиг на 1, т.к. строка n = 1 не используется
I	m—:
////////////////////////////////////////////
II Аппроксимация кусочно-линейными функциями if (0.95 < р && р < 0.975)
return (t975[m] - t95[m]) / 0.025 * (р - 0.95) + t95[m]:
else if (0.975 <= p && p < 0.99)
return (t99[m] - t975[m]) / 0.015 * (p - 0.975) + t975[m]: else if (0.99 <= p && p < 0.995)
return (t995[m] - t99[m]) / 0.005 * (p - 0.99) + t99[m];
else if (0.995 <= p && p < 0.9975)
return (t9975[mj - t995[m]) / 0.0025 * (p - 0.995) + t995[m]:
else if (0.9975 <= p && p < 0.999)
return (t999[m] - t9975[m]) / 0.0015 * (p - 0.9975) + t9975[m];
el se
return (t9995[m] - t999[m]) / 0.0005 * (p - 0.999) + t999[m];
}
///////////////////////////////////////
// Коррекция во избежание переполнения if (n > 250).
n = 250:
//////////////////////////////////////////////////
// Уточнение корня методом деления отрезка пополам do
{
сх = р - TDistribution (п.с):
у = (с + d) /2:
сх *= р - TDistribution (п,у);
if (!сх)
return у;
else if (сх > 0) с = у;
el se
Одномерные распределения
225
d = у:
} while (fabs (с - d) > 0.000001):
return у:
}	2
Существует так называемое Г-распределение Хотеллинга, которое представляет собой многомерное обобщение f-распределения Стьюдента [167, с. 710]. Плотность /^-распределения вычисляется по формуле [там же, с. 713]
/(*) =
где k — размерность многомерной выборки, q — число линейных условий.
Практически функция /^-распределения Хотеллинга вычисляется, да обычно и вводится на основе F-распределения [63, с. 203], [180, т. 2, с. 217], поэтому необходимости в составлении специальной функции нет. Подробное обсуждение дано в [15, с. 152], [70, с. 358].
Распределение G-критерия Кокрена
Распределение критических значений G-критерия Кокрена легко получается, если подробно расписать статистику критерия (см. главу 3) и учесть, что отношение дисперсий представляет собой F-статистику1. Полученная точная формула имеет простой вид [120, с. 26]
F 8kv'-a~(k-V) + F’
где k — число выборок,
v — размер каждой выборки,
а ~~ Уровень значимости,
значение обратной функции F-распределения для v и (k - 1) v степеней свободы и доверительного уровня (1 - a/k ). ----- --------
На данную методику нам указал В. А. Уткин.
Р-2ОО2
226
Глава 4. Теория распределений
Обсуждение см. в [ 156, с. 95]. Показанная выше формула в частном случае k = 2 представлена в [32, с. 48].
Распределение критических значений G-критерия Кокрена при k > 2 и v > 10 может быть также задано аппроксимационной формулой [там же]
&k,v,\-a
2х
v(26-l)-2+x +
(2-v)(2 + v+x)+2x2 ’ 6(v(2&-l)-2)
где х — значение обратной функции ^-распределения для v степеней свободы и доверительного уровня, равного (1 - a/k).
Таблицы для стандартных доверительных уровней даны в [там же,' с. 242], [120, с. 160], [140, с. 155].
В соответствии с этими формулами нами составлены функции CochraneGDistributionExact и CochraneGDistributionApprox. Инте-1 ресно, что аппроксимационная формула часто дает несколько более высокую точность вычислений, чем ее «точный» аналог. Это вызвано тем, что точность вычислений по «точной» формуле целиком зависит от точности вычисления обратной функции F-распределения, и повышение точности вычисления последней ведет к повышению точности всех функций, на ней основанных.
Исходные коды и пример применения
#include <fstream.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
double k = 6,	// Число выборок
n = 20:	// Численность каждой выборки
double а = 0.01; // Уровень значимости
cout « "к = " « к « "\пп = " « п « "\па = " « а
« "\nG (approx.) = " « CochraneGDistributionApprox (k.n.a)
« "\nG (\"exact\") = " « CochraneGDistributionExact (k.n.a) « "\n":
}
double CochraneGDistributionExact (double k.double n.double a) //
Одномерные распределения
227
// Функция "точного" вычисления критического значения G-критерия // Кокрена в случае двусторонней гипотезы.
// Обозначения:
// к - число выборок.
// п - размер каждой выборки.
// а - уровень значимости.
// Возвращаемое значение:
// критическое значение G-критерия Кокрена.
//
{
double g = InverseFDistribution (n,(k - 1) * n.l - a / k):
// Рабочая переменная
return g / (k - 1 + g);
}
double CochraneGDistributionApprox (double k.double n.double a) //
// Функция вычисления критического значения G-критерия Кокрена // в случае двусторонней гипотезы.
// Обозначения:
// к - число выборок.
// п - размер каждой выборки.
// а - уровень значимости.
// Возвращаемое значение:
// критическое значение G-критерия Кокрена.
//
{
double x.g; // Рабочие переменные
/////////////////////////////////////////////////////////// // Аппроксимация обратной функцией хи-квадрат-распределения х = InverseChiSquareDistribution (n.l - а / k).
g = n * (2 * k - 1) - 2;
return x/(x+g+(4-n*n+(2-n)*x+2*x*x) /6 / g) * 2;
}
Распределение d-статистики Гири и обратное к нему
Вычисление критического значения d-статистики Гири производится нами с помощью аппроксимационных формул, полученных По табличным значениям [32, с. 56], с использованием программы Microsoft Excel. В пределах 11 < п < 1001 гарантируется точность относительно табличных значений 5%. Не рекомендуется использовать функцию InverseGearyDistribution при п < 11, так как дан-8‘
228
Глава 4. Теория распределений
ная область не табулирована в источнике. Впрочем, эта рекомендация перекрывается условиями применения критерия.
Исходные коды
double GearyDistribution (int n,double x)
//
// Вычисление функции распределения d-статистики Гири.
// Обозначения:
// п - число степеней свободы.
// х - функция распределения.
// Возвращаемое значение:
// доверительный уровень.
//
{
double с =	0.01,	//	Левая граница локализации
d =	1.0,	//	Правая граница локализации
у,	//	Середина интервала локализации
сх;	//	Рабочая переменная
do
{
сх = х - InverseGearyDistribution (п.с);
у = (с + d) / 2;
сх *= х - InverseGearyDistribution (п.у);
if (сх == 0)
return у;
else if (сх > 0)
с = у;
el se d = у;
} while (fabs (с - d) > 0.00000001);
return у;
}
double InverseGearyDistribution (int n, double p)
//
// Вычисление обратной функции распределения d-статистики Гири.
// Обозначения:
// п - число степеней свободы,
// р - доверительный уровень.
// Возвращаемое значение:
// функция распределения.
//
{
double a.b;
if (п <= 101)
{
if (0.95 < р)
{
а = 1.226575 * р - 0.183259;
b = -0.185425 * р + 0.139487;
Одномерные распределения
229
}
else if (0.9 <= р && р <= 0.95) {
а = 0.571320 *р+ 0.439233;
b = -0.091880 * р + 0.050619; }
else if (0.1 < р && р < 0.9)
{
а • 0.308114 * р + 0.676119;
b = -0.064391 * р + 0.025879; }
else if (0.05 <= р && р <= 0.1) {
а = 0.810620 * р + 0.625868;
Ь = -0.217080 * р + 0.041148;
}
el se
{
а = 1.813025 * р + 0.575748;
b = -0.528675 * р + 0.056728;
}
}
el se
{
if (0.95 < р)
{
а = 0.673075 * р + 0.243055;
b = -0.089525 * р + 0.072184;
}
else if (0.9 <= р && р <= 0.95) {
а = 0.370740 * р + 0.530273;
b = -0.054260 * р + 0.038682;
}
else if (0.1 < р && р < 0.9)
{
а = 0.153544 * р + 0.725750;
b = -0.024369 * р + 0.011780;
}
else if (0.05 <= р && р <= 0.1)
{
а = 0.335520 * р + 0.707552;
Ь = -0.058040 * р + 0.015147;
}
el se
{
а = 0.838325 * р + 0.682412;
b = -0.153100 * р + 0.019900;
return а
* exp (b * log (п));
230
Глава 4. Теория распределений
Распределение G-критерия и обратное к нему
Для п < 2, п > 20, а также для р < 0,95 и р > 0,9995 значение функции InverseGTestDistribution, реализующей аппроксимацию обратной функции распределения G-критерия [ 151, с. 143], не определено. Для 2 < п < 20 берутся табличные значения статистики, а вычисление при промежуточных значениях р производится путем линейной интерполяции табличных значений.
Исходные коды
double GTestDistribution (int n, double x) //
// Вычисление функции распределения G-критерия.
// Обозначения:
// n - число степеней свободы,
// х - функция распределения.
// Возвращаемое значение:
// доверительный уровень.
//
{
double с = 0.000001, // Левая граница локализации корня d = 26.	// Правая граница локализации корня
у,	// Середина интервала локализации
сх;	// Рабочая переменная
do {
сх = х - InverseGTestDistribution (п.с);
у = (с + d) / 2:
сх *= х - InverseGTestDistribution (п.у);
if (сх == 0) break;
else if (сх > 0) с = у;
el se d = у;
} while (fabs (с - d) > 0.000001);
if (у < 0)
У = 0;
if (у > 1)
у = 1;
return у; }
double InverseGTestDistribution (int n, double p) //
// Вычисление обратной функции распределения G-критерия.
Одномерные распределения
231
// Обозначения:
// п - число степеней свободы,
// р - доверительный уровень.
// Возвращаемое значение:
// значение функции распределения.
//
S///////////////////////////////////
// Табличные значения для интервалов
double t95[]
{2.322.0.974,0.644,0.493,0.405.0.347,0.306,0.275.0.250,
0.233,0.214,0.201,0.189.0.179,0.170,0.162.0.155.0.149,0.143}. t975[] =
{3.427.1.272,0.813.0.613.0.499.0.426.0.373.0.334,0.304,
0.280.0.260,0.243,0.228.0.216.0.205.0.195.0.187,0.179,0.172}, t99[]	=
{5.333,1.715,1.047,0.772.0.621,0.525,0.459,0.409,0.371,
0.340.0.315,0.294.0.276.0.261.0.247,0.236.0.225,0.216,0.207}, t995[] =
{7.916,2.093,1.237.0.896,0.714,0.600.0.521.0.464.0.419.
0.384,0.355,0.331.0.311,0.293.0.278,0.264,0.252.0.242.0.232}.
t999[] = {17.81, 3.27, 1.74. 1.21, 0.94, 0.77. 0.67.
0.59. 0.53, 0.48, 0.44, 0.41, 0.39, 0.36, 0.34, 0.33. 0.31, 0.30,0.29}.
t9995[] = {25.23, 4.18. 1.99, 1.35, 1.03, 0.85, 0.73. 0.64, 0.58, 0.52, 0.48, 0.45, 0.42, 0.39. 0.37, 0.35, 0.34, 0.32,0.31}:
/////////////////////////////////////
// Таблицы начинаются co строки n = 2
if (n < 2)
n = 2:
///////////////////////////////////////
// Таблицы заканчиваются строкой n = 20
if (n > 20)
n = 20:
n = 2:
////////////////////////////////////////////
// Аппроксимация кусочно-линейныни функциями
if (p < 0.975)
return (t975[n] - t95[n]) / 0.025 * (p - 0.95) + t95[n]:
else if (0.975 <= p && p < 0.99)
return (t99[n] - t975[n]) / 0.015 * (p - 0.975) + t975[n]:
else if (0.99 <= p && p < 0.995)
return (t995[n] - t99[n]) / 0.005 * (p - 0.99) + t99[n]:
else if (0.995 <= p && p < 0.9975)
return (t999[n] - t995[n]) / 0.004 * (p - 0.995) + t995[n]: el se
return (t9995[n] - t999[n]) / 0.0005 * (p - 0.999) +
232
Глава 4. Теория распределений
Процентиль критерия кУШапиро—Уилка
Значение критических значений критерия IV Шапиро—Уилка определено при численности выборки от 3 до 50 [206, с. 337,374]. Производится аппроксимация элементарными функциями. Параметры полиномиальной аппроксимации получены с помощью электронных таблиц Microsoft Excel. Дополнительно см. [123, с. 37].
Исходные коды
double CriticalW (int n.double alpha) //
// Функция вычисления процентили критерия W Шапиро-Уилка. // Обозначения:
// п - численность выборки.
// alpha - вероятность нормального распределения в %.
// Возвращаемое значение:
// процентиль.
//
{
double а = 0.000000003528 *	n*n*n*n*n-
0.000000691142 *	n*n*n*n +
0.000053501632 *	n * n * n -
0.002083849650 *	n * n +
0.043197037284 *	n +
0.509166666826.
b =-0.000000002072	* n	* n	* n * n * n +
0.000000360047	* n	* n	* n * n -
0.000024632867	* n	* n	* n +
0.000840099068	* n	* n	—
0.014922836830	* n	+	
0.133766666669:
return а * pow (alpha.b); }
Распределение Х-статистики Ван дер Вардена
Точность настоящей реализации, вычисляющей значение функции распределения Аг-статистики Ван дер Вардена, обеспечивается, как правило, до 2-го знака в интервалах изменения параметров распре-1 деления: 0,95 < р < 0,999, 10 < (т + п) < 50, 0 < (п - т) < 4. Точность недостаточна для теоретических исследований и составления таблиц, но для практических расчетов функция вполне может быть использована. Нами применяется аппроксимация табличных значений элементарными функциями на основе таблиц, представлен! ных в [32, с. 95, 361].
Одномерные распределения
233
Исходные коды
double InverseXDistribution (double n,double m.double p) //
// Вычисление обратной функции распределения Х-статистики // Ван дер Вардена.
// Обозначения:
// пит- параметры распределения.
// р - доверительный уровень.
// Возвращаемое значение:
// критическое значение функции распределения.
//
{
double ЬО,Ы.Ь2,ЬЗ.сО.с1.с2, М = fabs (п - т).
N = п + т;
if (р <= 0.95) {
Ь0 = 1.250214:
bl = -0.098452;
Ь2 = 0.146892:
ЬЗ = 0.030469:
СО = -0.000849;
cl = -0.000034: с2 = -0.00000675:
}
else if (р > 0.95 && р <= 0 99) {
Ь0 = 1.341006:
Ы = -0.078017:
Ь2 = 0.1796:
ЬЗ = 0.020529;
сО = -0.001055:
С1 = -0.00005975;
с2 = 0.000003625:
}
el se { Ь0 = 1.342562; bl = -0.070649; Ь2 = 0.203976; ЬЗ = 0.01456; СО = -0.001244; cl = 0.0000255; с2 = -0.00001475:
}
return Ь0 * exp (bl * M) + b2 * exp (ЬЗ * M) * N +
, (cO + cl * M + c2 * M * M) * N * N:
234
Глава 4. Теория распределений
Распределение критерия Аббе и обратное к нему
Для и <4, а также для р < 0,95 и р > 0,999 значение функции InverseAbbeDistribution, реализующей распределение, обратное к распределению критических значений критерия Аббе, не определено. Для 4 < п < 60 берутся табличные значения статистики, вычисленные в [32, с. 267]. Для п > 60 производится аппроксимация по [161, с. 406].
Исходные коды
double AbbeDistribution (int n. double x) //
// Функция вычисления распределения статистики Аббе.
// Обозначения:
// п - число степеней свободы,
// х - функция распределения.
// Возвращаемое значение:
// доверительный уровень.
//
{ double c = 0.000001,	//	Левая граница локализации корня
d = 1.	//	Правая граница локализации корня
У.	//	Середина интервала локализации
ex:	//	Рабочая переменная
{
сх = х - InverseAbbeDistribution (п,с);
у = (с + d) / 2:
сх *= х - InverseAbbeDistribution (п.у):
if (сх == 0)
break:
else if (сх > 0)
с = у:
el se
d = у:
} while (fabs (с - d) > 0.000001):
if (у < 0) У = 0: if (у > 1) у = 1:
return у: }
double InverseAbbeDistribution (int n. double p) //
Одномерные распределения
235
// Функция вычисления обратной функции распределения статистики // Аббе.
// Обозначения:
// п - число степеней свободы.
// р - доверительный уровень.
// Возвращаемое значение:
// функция распределения.
//
S///////////////////////////////////
// Табличные значения для интервалов
double AbbeTable95[] = {
0.3902.0.4102.0.4451.0.4680.0.4912.0.5121.0.5311.0.5482.0.5638,0.5778, 0.5908.0.6027,0.6137,0.6237.0.6330.0.6417.0.6498.0.6574.0.6645,0.6713. 0.6776.0.6836,0.6893.0.6946.0.6996,0.7046.0.7091,0.7136.0.7177,0.7216. 0.7256,0.7292,0.7328.0.7363,0.7396.0.7429,0.7461,0.7491,0.7521,0.7550. 0.7576,0.7603.0.7628.0.7653.0.7676,0.7698.0.7718,0.7739.0.7759.0.7779. 0.7799,0.7817.0.7836.0.7853,0.7872.0.7891.0.7906},
AbbeTable99[] = {
0.3180,0.2690,0.2808.0.3070.0.3314.0.3544,0.3759.0.3957.0.4140,0.4309. 0.4466,0.4611.0.4746,0.4872,0.4989.0.5100.0.5203,0.5301.0.5393.0.5479, 0.5562.0.5639.0.5713.0.5784,0.5850.0.5915,0.5975.0.6034.0.6089,0.6141. 0.6193.0.6242,0.6290.0.6337.0.6381,0.6425.0.6467.0.6508.0.6548.0.6587. 0.6622.0.6659.0.6693,0.6727,0.6757.0.6787.0.6814,0.6842.0.6869,0.6896. 0.6924,0.6949.0.6974,0.6999,0.7024.0.7049.0.7071},
AbbeTablе999[] = {
0.2949.0.2080.0.1817,0.1848.0.2018.0.2210,0.2408.0.2598.0.2778.0.2949, 0.3112,0.3266,0.3413.0.3552.0.3684,0.3809,0.3926,0.4037.0.4142.0.4241, 0.4334.0.4423.0.4509.0.4591.0.4670,0.4748.0.4822.0.4895.0.4963,0.5027. 0.5090.0.5150.0.5208.0.5265.0.5319.0.5373.0.5425,0.5475.0.5524.0.5571. 0.5616.0.5660.0.5701.0.5743.0.5781.0.5817.0.5853,0.5887.0.5922.0.5955. 0.5989.0.6020.0.6051,0.6083.0.6114,0.6145.0.6174}.
a.b.	// Коэффициенты аппроксимации прямой линией
criterion:	// Возвращаемое значение статистики
if (п < 60)
{
а = р < 0.99 ? (AbbeTable99[n - 4] - AbbeTablе95[п - 4]) /0.04 : (AbbeTablе999[п - 4] - AbbeTablе99[п - 4]) / 0.009:
b = р < 0.99 ? AbbeTablе95[п - 4] - а * 0.95 :
AbbeTable99[n - 4] - а * 0.99:
return а * р + b:
}
el se
{
criterion = InverseNormalDistribution (1 - p);
criterion = criterion / sqrt ((criterion * criterion + 1) /
2 + n) + 1;
}
return criterion:
236
Глава 4. Теория распределений
Распределение критерия Пагуровой
Критическое значение статистики критерия зависит как от степеней свободы сравниваемых выборочных совокупностей Ц и и2 и доверительного уровня р, так и от параметра с, зависящего от отношения неизвестных дисперсий генеральных совокупностей (вычисляется вместе со статистикой критерия). Вычисления производятся по формулам [152, с. 4]:
n_. (0->Q2(l->7). ,	[в(1-в)+(20-1)(??-в)]??(1-г?)	(0-77)27J
02	+ H+v2.p	02(1-0)2	V-P (1-0)2 1
где — значения обратной функции Г-распределения.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void) {		// Численности выборок
int nl n2	= 18. = 18:	
double	c = 0.249.	// Параметр, зависящий от отношения
		// дисперсий
	p = 0.995:	// Доверительный уровень двухсторонней
		// гипотезы
cout « InversePagurovaDistribution (nl - l,n2 - l,c,(p + 1) / 2) « endl:
}
double InversePagurovaDistribution (int nl.int n2, double
c,double p)
//
// Функция вычисления обратной функции распределения
// статистики критерия Пагуровой.
// Обозначения:
// nl - число степеней свободы.
// п2 - число степеней свободы.
Одномерные распределения
237
// с - параметр, зависящий от отношения дисперсий.
// р - доверительный уровень односторонней гипотезы.
// Возвращаемое значение:
// функция распределения.
//
double h.t. // Рабочие константы
ht.tl.hl: // Константы для уменьшения объема записи
h = с - 2 * с * (1 - с) * ((1 - с) / п2 - с / nl):
t = (double) nl / (nl + n2):
tl = 1 - t;
hl = 1 ~ h;
ht = h - t:
return ht * ht * hl / t / t * InverseTDistribution (n2.p) +
(t * tl + (2 * t - 1) * ht) * h * hl / t / t / tl / tl * InverseTDistribution (nl + n2.p) +
ht * ht * h / tl / tl * InverseTDistribution (nl.p):
}
Распределение критерия Данна
Критические значения статистики критерия Данна получены путем аппроксимации полиномом 6-й степени с помощью электронных таблиц Microsoft Excel табличных значений при стандартных уровнях значимости для попарного сравнения [52, с. 352] и для сравнения с контрольной группой [52, с. 353]. Критические значения зависят только от числа сравниваемых выборок k и табулированы для значений 2 < k < 25. Экстраполяцию для других значений k с помощью данных функций мы делать не рекомендуем.
Исходные коды
double DannDistribution95 (int k)
//
// Функция вычисления критического значения статистики критерия
Ч Данна для попарного сравнения при уровне значимости 0.05.
// Обозначения:
Ч к - число сравниваемых выборок.
Ч Возвращаемое значение:
Ч критическое значение статистики.
//
{
/////////////////////////////////////////////////
Ч Коэффициенты аппроксимации полиномом 6-й степени
double а[] = { 0.588190556232. 0.966244168207.-0.165163435034.
0.015897511430.-0.000842601438.
°-000022977149.-0.000000251503}:
238
Глава 4. Теория распределений
//////////////////// // Значение полинома return Horner (а.6,double (к)); }
double DannDistribut1on99 (int к) //
// Функция вычисления критического значения статистики критерия // Данна для попарного сравнения при уровне значимости 0.01. // Обозначения:
// к - число сравниваемых выборок.
// Возвращаемое значение:
// критическое значение статистики.
//
{
//////////////////////////III////////////////////
// Коэффициенты аппроксимации полиномом 6-й степени
double а[] = { 1.449135309643, 0.787940262178.-0.132133234787, 0.012609621752,-0.000664881283,
0.000018065176.-0.000000197198}:
//////////////////// // Значение полинома return Horner (а.6,double (k)); }
double DannDistribution95c (int k) //
// Функция вычисления критического значения статистики критерия // Данна для сравнения с контрольной группой при уровне // значимости 0.05.
// Обозначения:
// к - число сравниваемых выборок.
// Возвращаемое значение:
// критическое значение статистики.
// {
/////////////////////////////////////////////////
// Коэффициенты аппроксимации полиномом 6-й степени
double а[] = { 1.065120712080, 0.635501656065,-0.110820876210, 0.010771151900,-0.000574089821,
0.000015710820,-0.000000172389};
//////////////////// // Значение полинома return Horner (а,6,double (k)): }
double DannDistribution99c (int k) //
// Функция вычисления критического значения статистики критерия
Одномерные распределения
239
// Данна для сравнения с контрольной группой при уровне
// значимости 0.01.
// Обозначения:
// к - число сравниваемых выборок.
// Возвращаемое значение:
// критическое значение статистики.
//
S////////////////////////////////////////////////
// Коэффициенты аппроксимации полиномом 6-й степени
double а[] = { 1.842663470189. 0.518226356741.-0.089355861698, 0.008642394656.-0.000459257429.
0.000012542114.-0.000000137408};
////////////////////
// Значение полинома
return Horner (а.6.double (k));
}
Распределение выборочного размаха
Функция распределения выборочного размаха Р„(к’) для выборки численности п, или вероятность того, что размах выборки не превысит w [151, с. 138], определяется формулой [205, с. 276]
Рп (w)=п J [F(x+w) - F(x)]"-1 dF(x).
Если совокупность распределена нормально, то выражение F(.), входящее в представленную выше формулу, является функцией распределения стандартизованной случайной величины [151]
Р(х) = Г е r^dt-
Однако для практического вычисления функции распределения размаха дополнительно необходимо выразить величину dF(x), входящую в формулу его вычисления, через dx. Это нетрудно сделать, проведя небольшие выкладки. Так, можно записать
, dF(x) , dF(x) = —т-^-dx, dx
гДе производная F(x) по х — плотность распределения вероятности — ДДя стандартизованной нормальной случайной величины вычисляется по формуле [там же]
240
Глава 4. Теория распределений
dP(x) _ 1 g_x2/2 dx
Сделав все необходимые подстановки, получаем удобную для вычислений на компьютере формулу
Pn(w) = —^=l[P(x + w)-P(x)]n le ^dx,
где Р(.) вычисляется, как показано выше.
4 Функция вычисления выборочного размаха нормально распределенной случайной величины находит основное применение при вычислении стьюдентизированного размаха, представленного в разделе «Распределение стьюдентизированного размаха» данной главы. См. также [ 135, с. 543].
Исходные коды и пример применения
#include <fstream.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
int n = 16:
double w = 23;
cout « "w = " « w « "\nn = " « n
« "\np = " « RangeNormal (w.n) << endl:
}
double RangeNormal (double w.int n)
//
// Вычисление функции распределения размаха выборки из
// нормальной совокупности.
// Обозначения:
// w - размах.
// п - численность выборки.
// Возвращаемое значение:
// вероятность того, что размах выборки не превысит w.
//
{
double s:
if (w > 8)
return 0.999999;
Одномерные распределения
241
s = RangeNormalIntegral (w.n) * n / SQRTMPI2;
if (s > 1)
return 1:
el se return s:
}
double RangeNormalIntegral (double w.int nl)
//
// Функция вычисления интеграла для определения функции
// распределения
// размаха выборки из нормальной совокупности.
// Обозначения:
//	w - размах.
// nl - численность выборки.
// Возвращаемое значение:
// значение интеграла.
// Примечания:
// 1. Функция представляет собой специальную версию метода
Simpson.
// 2. Все константы вынесены за знак интеграла.
//
{
int п =	= 200:	//	Число интервалов интегрирования
doublе	а = -15.b = 15.	//	Пределы интегрирования
	si = 0.S2 = 0.	'/	Рабочая переменная
	х1.х2.	//	Текущее значение переменной
	h:	//	Удвоенный шаг интегрирования
h = 2 * (Ь - а) / п;
xl = а + h;
х2 = а + h / 2;
for (register int i = 1; i < n - 1; i += 2, xl += h. x2 += h) {
si += RangeNormalDensity (xl.w.nl);
s2 += RangeNormalDensity (x2.w,nl);
}
return h * (RangeNormalDensity (a.w.nl) + RangeNormalDensity (b.w.nl) +
si * 2 + (s2 + RangeNormalDensity (x2,w,nl)) * 4) / 6: }
double RangeNormalDensity (double x,double w.int n)
//
// Функция вычисления плотности распределения размаха
// выборки из нормальной совокупности.
// Обозначения:
// х - переменная интегрирования.
И w - размах.
242
Глава 4. Теория распределений
// п - численность выборки.
// Возвращаемое значение:
// значение плотности вероятности.
// {
double s = PowerOf (NormalDistributionl (х + w) -
NormalDistributionl (x),n - 1) * NormalDensIty (x);
//////////////////////////////// // Компенсация ошибок округления if (s < 0.000000000001)
return 0.000000000001;
el se return s;
}
Распределение стьюдентизированного размаха
Пусть из нормальной совокупности извлекается выборка численностью п и по данной выборке вычисляется выборочный размах w. Затем из той же нормальной совокупности или из другой нормальной совокупности с тем же стандартным отклонением извлекается выборка численностью/ (f— число «степеней свободы»), и по данной выборке вычисляется выборочное стандартное отклонение s. Тогда отношение w/s называется стьюдентизированным размахом (размахом Стьюдента), и его распределение на заданном уровне значимости зависит только от величин пи/. Вычисления производятся по формуле [151, с. 144]
Pn>f Г — < q 1 = J[г(//2) ]*2 -(//2)+1 f	qx) dx ,
t5 J о
где Pn(.) — функция, определенная в предыдущем параграфе.
Функция RangeStudent представляет собой специальную версию метода Simpson, снабженную всеми необходимыми эмпирическими настройками, включая пороговые ограничения на величины параметров, что необходимо при вычислениях с конечной точностью во избежание ошибок типа переполнения и выхода за границы области определения. Для повышения точности вычислений в вызовах используются самые точные версии методов, что несколько замедляет работу функции. Это тот случай, когда обычный выбор программиста между высокой скоростью вычисления и приемлемой точностью сделан в пользу последней. Если численность выборки, использованной для вычисления дисперсии, равна 1, возникает чис
Одномерные распределения
243
ленная неустойчивость и/или потеря значимости, что заставило нас сделать кусочную аппроксимацию «трудных» участков элементарными функциями. Аппроксимация выполнена с помощью электронных таблиц Microsoft Excel и имеет точность, сопоставимую с точностью решения, полученного прямым интегрированием. Обсуждение проблемы и таблицы см. также в [205, с. 286], [140, с. 163], [120, с. 30].
Исходные коды и пример применения
#include <fstream.h>
#include <math.h>
#include "megastat.h"
void main (void)
{ int n = 60.
f = 1;
double q = 73.97;
cout « "q = " « q « "\nn = " « n « "\nf = " « f « "\np = " << RangeStudent (q.n.f) « endl;
}
double RangeStudent (double q.int nl.int f) //
// Функция вычисления вероятности стьюдентизированного размаха
// выборки из нормальной совокупности.
// Обозначения:
// q - стьюдентизированный размах.
// п - численность выборки для определения размаха.
// f - численность выборки для определения дисперсии.
// Возвращаемое значение:
// вероятность того, что размах выборки не превысит q.
//
{
int nl = 800;	// Число интервалов интегрирования
double а = 0.000000000001. // Пределы интегрирования b = 40.000000000001, si = 0,s2 = 0.	//	Рабочая переменная
х1,х2,	//	Текущее значение переменной
h.	//	Удвоенный шаг интегрирования
с[] =	//	Пороговые значения
{8.929,13.44,16.36.18.49.20.15.21.51.22.64.23.62,24.48, 25.24,25.92,26.54.27.10,27.62,28.10,28.54,28.96,29.35,29.71}.
d[] =	// Коэффициенты регрессии
{0.89326883,1.34139749,1.63270350,1.84506031,2.01134877,
244
Глава 4. Теория распределений
2.14668101.2.25920652.2.35710800.2.44305420.2.51938913, 2.58709453.2.64917496,2.70595180.2.75694765.2.80477208.
2.84883799.2.89057797,2.92956265.2.96534101};
/////////////////////////////////////////////////
II Аппроксимация для больших значений q при f = 1
if (f == 1)
{
if (n < 20)
{
///////////////////////////
// Аппроксимация гиперболой
if (q > c[n - 2])
return 1.0 - d[n - 2] / q;
}
el se
{
/////////////////////////////////
// Аппроксимация сложной функцией
if (q > 39.91)
return 1.0 - (2.3673883676 * log (loglO (n)) +
2.3285514134) / q;
}
}
h = 2 * (b - a) / nl;
xl = a + h;
x2 = a + h / 2:
for (register int i = 1; i < nl - 1; i += 2. xl += h. x2 += h)
{
si += RangeStudentDensity (xl.q.n.f);
s2 += RangeStudentDensity (x2,q,n.f);
}
return h * (RangeStudentDensity (a.q.n.f) +
RangeStudentDensity (b.q.n.f) +
2 * si + 4 * (s2 + RangeStudentDensity (x2,q.n.f))) / 6:
}
double RangeStudentDensity (double x.double q.int n.int f)
//
// Функция вычисления плотности вероятности
// стьюдентизированного размаха
// выборки из нормальной совокупности.
// Обозначения:
//	х	-	переменная интегрирования.
//	q	-	стьюдентизированный	размах.
//	п	-	численность выборки	для определения	размаха.
//	f	-	численность выборки	для определения	дисперсии.
// Возвращаемое значение:
// значение плотности вероятности.
Одномерные распределения
245
{ double s,	// Вспомогательные
// переменные fl = log (RangeNormal (q * x,n)), f2 = 0.5 * f;
/////////////////////////////////////////////////
// Логарифмирование формулы плотности вероятности
s = MLN2 + f2 * (log (f) - M_LN2 - x * x) + (f - 1) * log (x) -log (Gammal (f2)) + fl:
return exp (s): }
Распределение критерия Дункана
Функция распределения статистики критерия Дункана построена на основе таблиц стьюдентизированного размаха, как это показано в [151, с. 105].
Функция DuncanDistribution имеет низкое быстродействие, вызванное низким быстродействием вызываемого из нее метода RangeStudent, причем быстродействие резко снижается с повышением значений параметров распределения вследствие рекурсивной природы данной функции. Низкое быстродействие не позволяет рекомендовать использование функции в диалоговых программных системах, однако при пакетной обработке данных результаты работы вполне приемлемые. Повышения быстродействия можно добиться только оптимизацией вычисления стьюдентизированного размаха.
Обсуждение см. также в [140, с. 157].
Исходные коды и пример применения
#include <fstream.h>
#include <math.h>
#include "megastat.h"
void main (void) {
int n = 50.
f = 20:
double q = 5.394:
cout « "q = " « q « "\nn = " « n « "\nf = " « f « "\np = " « DuncanDistribution (q.n.f) « endl:
246
Глава 4. Теория распределений
double DuncanDistribution (double q,int n.int f) //
// Функция вычисления функции распределения статистики Дункана.
// Обозначения:
// q - значение статистики критерия Дункана.
// n.f - параметры распределения.
// Возвращаемое значение:
// p-значение статистики.
//
{
double s = RangeStudent (q,2,f). // Рабочие переменные si;
if (п == 2) return s;
si = DuncanDistribution (q.n - l.f):
if (s > si)
return s;
el se
return si:
}
Распределение размаха варьирования
Критические значения размаха варьирования вычислены по таблицам [155, с. 72] путем аппроксимации табличных значений с точностью, достаточной для практического применения. Особенностью функции является необходимость задания уровня значимости только из стандартной линейки: 0,005; 0,001; 0,025; 0,05; 0,1. Кроме того, численность выборки не может быть менее 3 и не может превышать 1000.
Исходные коды
int RangeOfVarDistribution (double n.double p.double
*low,double *high)
//
// Функция вычисляет критические значения статистики метода
// размаха варьирования.
// Обозначения:
// п - численность выборки.
// р - уровень значимости, выбранный из стандартной
// линейки.
// *low - нижнее критическое значение.
// *high - верхнее критическое значение.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -2 при ошибке в фактических параметрах.
Одномерные распределения
247
if (n < 3 || n > 1000) return -2;
/////////////////////////////////////////////////////////////// //
// Аппроксимация квадратичным полиномом от логарифма
// численности выборки n = loglO (п);
if (р == 0.005)
{
*1OW = floor ((-0.019612414308 * п * п + 1.606721508300 * п +
0.885941911160) * 100) / 100;	-Д
♦high = ceil ((-0.677416078497 * n * n + 4.679517241630 * n -0.070543440621) * 100) / 100;
return 0;
}
else if (p == 0.01) {
♦low = floor ((-0.032035793369 * n * n + 1.664968323848 * n + 0.886031984429) * 100) / 100;
♦high = ceil ((-0.626961819643 * n * n + 4.421692091895 * n + 0.067932224692) * 100) / 100;
return 0;
}
else if (p == 0.025)
{
♦low = floor ((-0.053784700844 * n * n + 1.765234519405 * n + 0.883987588228) * 100) / 100;
♦high = ceil ((-0.553993288546 * n * n + 4.056192960361 * n + 0.254892548764) * 100) I 100;
return 0;
}
else if (p == 0.05)
{
♦low = floor ((-0.073993702151 * n * n + 1.861130284455 * n + 0.882056162419) * 100) / 100;
♦high = ceil ((-0.492813571184 * n * n + 3.757754660084 * n +
0.397804472068) * 100) / 100;
return 0;
}
else if (p == 0.1) {
♦low = floor ((-0.101066702208 * n * n + 1.981145123894 * n + 0.880596808029) * 100) / 100;
♦high = ceil ((-0.422913738752 * n * n + 3 431109025149 * n + 0.542227716536) * 100) / 100;
return 0;
}
el se
return -2;
}
248
Глава 4. Теория распределений
Дискретные распределения
Подобно непрерывным распределениям, основные дискретные распределения также взаимосвязаны, что иногда позволяет просто вычислять одни распределения через другие, сокращая затраты ресурсов. Особенностью дискретных распределений являются целочисленные значения параметров распределений.
Биномиальное распределение, распределение критерия знаков
Функция биномиального распределения определяется формулой [63, с. 42]
i=0
При х = яир= 1/2 получается распределение критических значений критерия знаков [135, с. 95], [180, т. 2, с. 121]. P-значение критерия знаков выводится в результате подстановки данных параметр ров в показанную выше формулу. Следовательно, критическое значение вычисляется как наименьшее целое значение К, для которого выполняется соотношение [140, с. 218]
1 Л п\ — У-------->а>
где п — число степеней свободы, а — уровень значимости, взятый из стандартной линейки.
См. также обсуждение в [151, с. 362], [213, с. 17].
Исходные коды
int SignDistribution (int n.double p) //
11 Функция вычисления критического значения критерия знаков.
// Обозначения:
// п - численность выборки.
// р - уровень значимости.
// Возвращаемое значение:
// критическое значение критерия знаков.
И
{
int i = -1:	// Возвращаемое значение
double s
0: // Рабочая переменная
Одномерные распределения
249
do
{
s += exp (LogFactorial (n) - LogFactorial (++i) -LogFactorial (n - i) - n * log (2));
} while (s <= p):
if (s == p)
return i:
el se
return (i - 1);
}
Гипергеометрическое распределение, распределение критерия медианы
Гипергеометрическое распределение определяется формулой [63, с. 44]
»=о
Для вычисления распределения критических значений критерия медианы следует взять х = Мt — число наблюдений первой выборки, превосходящих медиану объединенной совокупности, А = пх — численность первой выборки, В = п2 — численность второй выборки, п -	и2)/2. Таким образом, критическое значение вычисля-
ется, как и в предыдущем разделе, как наименьшее целое значение К, для которого выполняется соотношение [180, т. 2, с. 126]
к
X i=o
П1+Л2
где п — число степеней свободы, а — уровень значимости, взятый из стандартной линейки. Подробное обсуждение см. в [32 ,с. 77].
Исходные коды
int MedianDistribution (int nl.int n2,double p) //
// Функция вычисления критического значения критерия медианы.
// Обозначения:
// nl - численность первой выборки,
// п2 - численность второй выборки,
// р - уровень значимости.
// Возвращаемое значение:
// критическое значение критерия медианы.
//
250
Глава 4. Теория распределений
{
int i = -1.	// Возвращаемое значение
n = nl + п2: // Рабочая переменная
double s = 0;	// Рабочая переменная
do
{
s += exp (LogFactorial (nl) - LogFactorial (++i) -LogFactorial (nl - i) + LogFactorial (n2) -LogFactorial (n / 2 - i) - LogFactorial ((n2 - nl) / 2
+ i) - LogFactorial (n) + LogFactorial (n / 2) * 2):
} while (s <= p);
return i;
}
Распределения типа Колмогорова—Смирнова
В параграфе приводятся формулы и функции, предназначенные для вычисления распределений типа Колмогорова—Смирнова. Основным типом рассматриваемого семейства распределений является Л-распределение. Вычисление его критического значения производится по точной формуле [140, с. 235]
К(А)=
0,Л<0.
Бесконечная последовательность быстро сходится, и для получения критического значения достаточно ограниченного числа ее членов. Мы взяли 31 член для улучшения точности при малых значениях Л, хотя для многих задач можно ограничиться значительно меньшим числом, например И.
Формулы вычисления предельного распределения Колмогорова-Смирнова с учетом асимптотических свойств, использующие меньшее число членов разложения, приведены в [174, с. 110].
Исходные коды
double LambdaDistribution (double у) //
// Функция вычисления распределения Колмогорова для простой // гипотезы.
// Обозначения:
// у - функция распределения.
// Возвращаемое значение:
Одномерные распределения
251
// уровень значимости.
//
{
double а = 0: // Возвращаемое значение
if (у <= 0)
return 0:
for (register int к = -15;
if (Parity (к))
a += exp (-2 * к * к * el se
a -= exp (-2 * к * к *
к <= 15: k++)
у * у);
у * У):
return а;
}
Как было отмечено при описании критерия согласия Колмогорова, статистика критерия для случая сложной гипотезы зависит от типа теоретического распределения и числа параметров распределения, вычисляемых по эмпирической выборке. Приближенная формула для рассматриваемого случая приводится в [156, с. 136].
Ниже показана аппроксимация для случая проверки нормальности, причем предполагается, что оба параметра нормального распределения вычисляются по выборке. На основе данных [ 187, с. 328] вычисление модифицированной статистики производится по формуле
P„(Vn-0,01 + 0,85/Vn).
Аппроксимация модифицированной статистики выполнена с помощью 4-слойной нейронной сети прямого распространения. Применение нейронных сетей в задачах аппроксимации зависимостей предложено в [144, ч. 1, с. 26]. В этом случае говорят, что нейронная сеть выполняет роль предиктора, в противоположность тому, что в главе 9 нейронная сеть выполняет роль классификатора — вместо заранее известного класса, которому принадлежит объект обучающей выборки, нейронной сети предъявляется известное действительное число.
Представленная методика может быть использована и для построения критических значений модифицированной статистики критерия Колмогорова в случае проверки экспоненциальности по табличным данным, а также для построения критических значений модифицированной статистики критерия а>п [187, с. 328] для проверки нормальности и экспоненциальности. Вычисление статистики
252
Глава 4. Теория распределений
показанной ниже функцией производится для сложной гипотезы для случая нормального распределения, причем оба параметра распределения вычисляются по выборке, а возвращаемые значения действительны в интервале входного параметра от 0,85 до 0,99, так как этот интервал был использован при обучении нейронной сети.
Исходные коды и пример применения
#include <fstream.h>
finclude <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
double p:
cout « "p = ": cin » p;
cout « endl « KolmogorovDistribution (p) « endl:
}
double KolmogorovDistribution (double p)
//
// Функция вычисления распределения модифицированной статистики // Колмогорова.
// Обозначения:
// р - доверительный уровень.
// Возвращаемое значение:
// функция распределения.
И
{
register int i.j.m,	// Счетчик цикла
il » 0:	// Счетчик
int al = 4,	И Число слоев нейронной сети
ak[] = {1,7.7.!}.	// Вектор размеров слоев
i2	= SpecialVectorSum (ak.al)://	Счетчик
double	dv[7],dvl[7],	//	Рабочие	массивы
out.	//	Возвращаемое значение
y[] =	//	Синапсы	и смещения
{-9.569977.1.623841.-4.617375.1.107604.1.117771.-0.292249. -0.551078.-6.084196.0.1032.-0.155393.-0.264672.-3.568227.
-1.115464,-0.294712.-0.781665.-1.383647,-1.057088.-1.003334, -0.939507.-0.89708,0.809497.1.08774.-0.635299,-0.077337.0.091707.
-0.388659.-0.057653.-0.149816.2.058079.-0.60375.0.051302,
-0.935535.-1.115495,-0.514461,0.187052,-0.395154.-0.152575.
-0.520102.0.266812,-1.05053.-0.031599.-0.295273.-4.469841.
Одномерные распределения
253
0.798921.0.701824.2.019915.2.008559.1.400117.-0.478454, 0.182765.-0.161796.-0.129722.0.036638,-0.157487.0.021738, 0.358042,7.893243.0.428812.3.903452.3.340814.
2.304325.-5.833338.-0.268809.9.752849.-7.516172, -0.007198.8.284651.-1.463197.-3.159512.4.268715, -1.869945,1.224727,-5.002196.-1.8682.2.439419, 3.024104,0.109497};
НИИПНИ И Вход сети dv[0] = р;
/////////////////////////////////// // Преобразование для скрытых слоев for (1 =0; i <al -2; i++)
{
///////////////////////////////////////////
11 Унножение матрицы синапсов на выход слоя
for (j = 0; j < ak[i + 1J; j++)
for (m = 0, dvl[j] = 0: m < ak[i]; m++) dvl[j] += y[il++] * dv[m];
////////////////////// // Нелинейные элементы for (j = 0; j < ak[i + 1]; j++) {
dv[j] = dvl[j] - y[i2++]:	// Смещение
dv[j] /= (fabs (dv[j]) + 4.0); // Рациональный сигмоид }
}
И! I HI IИIИ
II Выход сети
for (j = 0, out =0; j < ak[al - 2]: j++) out += y[il++] * dv[j];
return out; }
Распределение co2
При n —» о© предельное распределение статистики па? вычисляется по формуле [32, с. 83]. Однако сложность формулы заставила нас аппроксимировать табличные значения [там же, с. 348] полиномом 6-й степени, как это сделано в показанной ниже функции. Как свидетельствует опыт расчетов, точность такой аппроксимации удовлетворительна для практического применения.
Исходные коды
double OmegaSquareDistribution (double x)
254
Глава 4, Теория распределений
//
// Функция вычисления распределения онега-квадрат для простой // гипотезы.
// Обозначения:
// х - функция распределения.
// Возвращаемое значение:
// уровень значимости.
//
{
double al[] = {0.0.889907.-165.141530.8917.211192.
-143399.597088.1009989.743591.-2699591.836609}, а2[] = {-0.204809.8.41686.-25.949245,42.970626.
-39.294718.18.621934.-3.563246}:
if (х <= 0.000001)
return 0;
else if (0.000001 < x && x <= 0.1)
return Horner (al,6.x);
else if (0.1 < x && x <= 1.49)
return Horner (a2,6,x):
el se
return 1:
}
Распределения Вилкоксона—Манна—Уитни
В расчетах критериев Вилкоксона (глава 2) применяется подход к вычислению статистик критериев, основанный на нормальной аппроксимации и хорошо работающий даже при небольших выборках. Некоторые авторы предлагают подход, основанный на использовании точных критических значений статистик критериев. Для решения задачи возможно применение показанных ниже рекуррентны х алгор и т -мов. Функции компактны, поэтому покажем их полностью. Они могут быть применены как в практических расчетах, так и для составления статистических таблиц, в том числе в интервалах, не за-табулированных в источниках.
Точное вычисление критических значений Т-статистики Вилкоксон на производится по рекуррентным формулам [151, с. 325]:
f(n,а) = f(n - 1,а) + f(n - 1,а - п),
f(n,O) = 1,
/(п,-Л) = 0,Л>0,
f(n,a) - f(n,n(n+ 1) / 2), а > п(п + 1)/2.
Одномерные распределения
255
Исходные коды
double WiIcoxonTDistribution (int n,double a) //
// Функция вычисления критического значения Т-статистики
// Вилкоксона.
// Обозначения:
// п - численность каждой из выборок.
// а - статистика критерия.
// Возвращаемое значение:
// Уровень значимости нулевой гипотезы.
//
{
return WTDistribution (п.а) / TwoDegree (п);
}
double WTDistribution (int n,double a)
//
// Вспомогательная функция для вычисления критического
// значения Т-статистики Вилкоксона.
// Обозначения:
// п - численность каждой из выборок.
// а - статистика критерия.
// Возвращаемое значение:
// результат рекурсии.
//
{
int nn = n * (n + 1) /2:
if (п < 0)
return 1:
if (а < 0)
return 0:
if (а == 0)
return 1:
if (a > nn)
return WTDistribution (n.nn):
el se
return WTDistribution (n - 1. a) + WTDistribution (n - 1, a -n): }
Точное вычисление критических значений /7-статистики Манна-
Уитни производится по рекуррентным формулам [151, с. 331]:
f(n,m,u) = f(n - 1,т,и - т) + f(n,m - l,w),
f(n,m-x) = 0, х > О,
/(К,772,0) = 1,
256
Глава 4. Теория распределений
/(h,0,w) = 1,
Исходные коды
double MannWhitneyDistribution (int n.int m.double u) //
// Функция вычисления критического значения U-статистики
// Манна-Уитни.
// Обозначения:
// п - численность первой из двух выборок.
// m - численность второй из двух выборок.
// и - сунна положительных разностей рангов, вычисленная
// по выборкам.
// Возвращаемое значение:
// критическое значение.
//
{
return UDistribution (n.m.u) *
exp (LogFactorial (m) + LogFactorial (n) - LogFactorial (m + n)):
}
double UDistribution (int n.int m,double u)
//
// Вспомогательная функция для вычисления критического значения // U-статистики Манна-Уитни.
// Обозначения:
// п - численность первой из двух выборок.
// m - численность второй из двух выборок,
// и - сумна положительных разностей рангов, вычисленная
// по выборкам.
// Возвращаемое значение:
// результат рекурсии.
//
{
if (п < 0)
return 0:
if (m < 0)
return 0;
if (u < 0)
return 0;
if (u == 0)
return 1:
if (m == 0)
return 1:
Одномерные распределения
257
Р(у = г)
return UDistribution (n - l.m.u - m) + UDistribution (n.m -l.u);
}
Благодаря простой связи статистики ^-критерия Вилкоксона со статистикой £/Манна— Уитни [187, с. 122]
W = I/+ и (и + 1)/2,
где п — численность второй из сравниваемых выборок, отпадает необходимость применять и точные таблицы распределения ^-критерия.
Распределение критерия серий и обратное к нему
Следуя [32, с. 91], обозначим через / общее число серий в данной последовательности. Случайная величина у принимает значения г = 2, 3, ...» 2т + 1 (при т < п) или г = 2, 3, ...» 2т (при т = п) с вероятностями
ork-i rk-i ,r = 2k,
1	n—1 m—i л—1 y._।
Cm т+и
Для расчетов с большими значениями численностей выборок функцию InverseSerialDistribution желательно модернизировать так, чтобы при вычислении не получались слишком большие промежуточные величины. Это можно сделать путем логарифмирования формул с последующим потенцированием. Логарифмирование позволит заменить произведение факториалов суммой их логарифмов. Вычисление логарифмов факториалов производится (для основания е) функцией LogFactorial. Попутно можно несколько снизить объем вычислений за счет упрощения формул.
Подробное обсуждение и таблицы см. также в [151, с. 373].
Исходные коды
void SerialDistribution (int m.int n,double p.int *low,int *high)
//
// Функция вычисляет критические значения критерия серий.
// Обозначения:
// m - численность элементов первой группы.
9—2002
258
Глава 4. Теория распределений
// п - численность элементов второй группы.
// р - доверительный уровень.
// *low - нижнее критическое значение.
// *high - верхнее критическое значение.
// Возвращаемое значение:
// нет.
И
{
int c.d. // Интервалы локализации корня
у:	// Середина интервала локализации
double t: // Вспомогательная переменная
с » 2:
d » 150:
do
{
t = р - InverseSerialDistribution (т.п.с):
у = (с + d) / 2:
t *= р - InverseSerialDistribution (т.п.у);
if (t == 0) break;
else if (t > 0)
c = y:
else d = y:
} while (abs (c - d) > 1);
*low  y:
c = 2:
d = 150:
p » 1 - p:
do
t = p - InverseSerialDistribution (m.n.c);
у = (c + d) / 2:
t *= p - InverseSerialDistribution (rn.n.y):
if (t =» 0) break;
else if (t > 0)
c = y:
el se d = y:
} while (abs (c - d) > 1);
if (y < *low)
{
*high » *low;
*low » y;
}
Одномерные распределения
259
el se
*high = у;
}
double InverseSerialDistribution (int m.int n.int u) //
// Функция вычисления уровня значиности критерия серий.
// Обозначения:
// го - численность элементов первой группы.
// п - численность элементов второй группы.
// и - значение критерия серий.
// Возвращаемое значение:
// уровень значимости.
//
{
int к;	// Параметр суммирования
double s = 0; // Накапливаемое значение
for (register int j = 2; j <= u; j++)
{
if (Parity (j))
{
k = j / 2:
s += 2 * Combination (m - l.k - 1) * Combination (n - l.k - 1);
}
el se
{
k = (j + 1) / 2:
s += Combination (m - l.k) * Combination (n - l.k - 1) + Combination (m - l.k - 1) * Combination (n - l.k);
return s / Combination (m + n.m); }
Распределение критерия Q Розенбаума
Значение функции QDistribution определено только при И < пх < 26 и 11 < п2 < 26 для р = 0,95 и р = 0,99. Для других значений параметров действует правило [57, с. 75,151 ] равенства критического значения числу 8 для pQ = 0,95 и числу 10 для pQ = 0,99 при 26 < и, < 50 и/или 26 <п2 < 50, а также при \пх - и2| < 10, 50 < и, < 100 и/или 50 < п2 < 100, а также при \пх - и2| < 20, пх > 100 и/или п2 > 100, а также при 0,5 < и, / п2 < 2.
Исходные коды
int QDistribution (int nl.int n2,double p.int *q)
260
Глава 4. Теория распределений
//
// Функция вычисляет критическое значение критерия Q Розенбаума.
// Обозначения:
// nl. п2 - размерности сравниваемых выборок.
//	р - доверительный уровень.
//	*q - критическое значение статистики.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -2 при ошибке в параметрах.
//
{
int а95[16][16] = {6.6.6.7.7.8.7.7.7.7.8.8.8.8.8.8.
6.6.6.7.7.7.7.7.7.7.7.8.8.8.8.8,
6.6.6.6.6.7.7.7.7.7.7.7.7.8.8.8.
7.7.6.6.6.7.7.7.7.7.7.7.7.8.8.8.
7.7.6.6.6,6.7.7.7.7.7.7.7.8.8.8,
8.7.7,7.6.6.7.7.7.7.7.7.7.8.8.8.
7.7.7.7.7.7.7.7.7.7.7.7.7.8.8.8.
7.7.7.7.7.7.7.7.7.7.7.7.7.8.8.8.
7.7.7.7,7.7.7.7.7,7.7.7.7,8,8.8.
7.7.7.7.7.7.7,7.7.7.7.7.7.8.7.8.
8.7,7,7,7.7.7,7.7.7.7,7.7.7.7,7,
8.7.7.7.7.7.7.7.7.7,7.7.7.7.7.7.
8.8.7.7.7.7.7.7.7.7.7.7.7.7.7.7.
8.8.8.8.8.8.8.8.8.8.7.7,7.7.7.7.
8.8.8.8.8.8,8.8.8.7.7.7.7.7.7,7.
8.8.8.8.8.8.8.8.8.8.7.7.7.7.7.7}.
а99[16][16] = { 9. 9, 9, 9. 9. 9.10.10,10.10.11.11.11.12.12.12. 9. 9. 9. 9. 9. 9. 9.10.10.10.10.11,11.11.11.12. 9. 9.	9.	9.	9,	9.	9,	9.10,10,10,10.10,11.11.11.
9, 9.	9.	9,	9,	9.	9.	9,	9.10.10,10,10.10.10.11.
9, 9.	9.	9.	9.	9.	9.	9.	9, 9. 9,10,10,10.10.10,
9. 9,	9.	9.	9,	9,	9.	9.	9. 9. 9. 9,10,10.10.10.
10, 9, 9. 9.	9.	9,	9,	9.	9.	9.	9.	9,	9,10.10,10,
10,10. 9. 9,	9,	9.	9.	9,	9,	9.	9.	9,	9,	9,10,10,
10,10,10, 9, 9, 9, 9, 9, 9. 9, 9, 9. 9, 9, 9.10, 10,10,10.10.	9,	9.	9,	9.	9,	9.	9.	9,	9.	9. 9. 9.
11.10.10.10.	9,	9,	9.	9,	9,	9.	9.	9,	9,	9. 9. 9,
11,11,10,10,10,	9,	9.	9,	9,	9.	9.	9.	9,	9. 9, 9,
11.11,10.10.10,10. 9. 9,	9.	9.	9.	9.	9.	9,	9.	9,
12,11,11.10,10.10.10. 9,	9	,9,	9.	9.	9,	9,	9.	9,
12,11,11,10,10,10.10.10,	9.	9.	9.	9,	9.	9,	9.	9,
12,12,11.11,10,10,10,10,10,	9 ,9 .9,	9,	9	,9.	9}:
if (nl < 11 || n2 < 11 || nl > 26 || n2 > 26 || (р != 0.95 && р != 0.99))
return -3;
if (р == 0.95)
*q = a95[nl - 11][п2 - И]; el se
Одномерные распределения
261
*q = a99[nl - 11][п2 - 11]:
return 0:
}
Генерация одномерных распределений
Для тестирования разработанных и запрограммированных алгоритмов важно уметь генерировать случайные выборки с заданным законом распределения. Методика этого процесса подробно описана в [ 140, с. 248] и сводится к генерации псевдослучайной выборки, имеющей равномерное распределение в интервале [0,1], а затем, путем применения требуемой обратной функции распределения, и псевдослучайной выборки с заданным законом распределения.
Псевдослучайные числа, имеющие равномерное распределение, наиболее просто генерируются с помощью стандартной функции rand, входящей в библиотеку, поставляемую с компилятором C/C++ [94, с. 251], [25, с. 595], хотя в многочисленных источниках встречается критика данной функции. Впрочем, ничто не мешает воспользоваться качественными алгоритмами, подробно рассмотренными в [156, с. 72], [184, с. 76].
Путем деления каждого псевдослучайного числа равномерной выборки на константу RAND_MAX получаем выборку с требуемым равномерным распределением.
В примере показана генерация выборки псевдослучайных чисел объема п, распределенной по стандартному нормальному закону. Генерация выборки, распределенной по закону N (д,с^), производится по выборке, распределенной по стандартному нормальному закону N (0,1), с помощью формулы [140, с. 255]
гд. = jU + о xit i = 1,2,..., п,
где д — заданное среднее,
— заданное среднее квадратичное отклонение, квадратный корень из дисперсии,
хь i = 1,2,..., п, — выборка, сгенерированная по закону N (0,1).
Другой алгоритм генерации случайной величины из нормально распределенной совокупности описан в [156, с. 77]. Основные пробле-мы рассмотрены в [104, с. 78], [211].
zoz
Глава 4. Теория распределений
Для контроля того, что получено именно то, что требовалось, мы проверили нормальность распределения с помощью простейших методов, представленных в главе 2.
Пример применения
#include <fstream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <math.h>
#include "megastat.h"
void main (void) { register int i:	//	Счетчик цикла
int n.	//	Численность тестового массива
k;	//	Число классовых интервалов
double y[1000],	//	Тестовый массив вариант
*f.	//	Массив частот распределения
*b.	//	Массив середин классовых интервалов
m = 2.5.	и	Среднее
s = 1.1.	H	Среднее квадратичное
e.me:	//	Рабочие переменные
/////////////////////////////////////////////////// // Число вариант, классовых интервалов и память для // массива частот и середин классовых интервалов n = sizeof (у) / sizeof (у[0]);
k = Sturgess (п);
f = new doublе[к];
b = new double[k];
////////////////////////////////////////////
// Генерация случайной величины, равномерно // распределенной в интервале [0.1] for (i = 0: i < n; i++)
{
y[i] = rand ():
y[i] /= RANDMAX;
}
///////////////////////////////////////////
// Генерация случайной величины, нормально // распределенной с параметрами [0.1] for (i = 0: i < n; i++)
y[i] = InverseNormalDistribution (y[ij):
/////////////////////////////////////////// II Генерация случайной величины, нормально
Многомерные распределения
263
// распределенной с параметрами [m,s*s] for (1=0; 1 < n; i++)
y[i] = m + s * y[1J:
Allocate (y.n.f.b.k);
cout « "Середины классовых интервалов и частоты\п";
for (i = 0; i < k; i++)
cout « setw (10) « b[i] « "\t" « f[i] « endl;
///////////////////////////////////////////
// Контроль нормальности ;	упрощенный	методой
SampleMean (y.n.&e.&me); cout « "Среднее	" «	setw (10)	<< e « " +- " « me
« endl; Variance (у,n.&e.&me); cout « "Дисперсия " «	setw (10)	« e « "	" « me
« endl; Kurtosis (y,n.&e.&me); cout « "Эксцесс	" «	setw (10)	« e « "	" « me
« endl;
Skewness (y,nt&e,&me);
cout « "Асимметрия " « setw (10) « e « " +- " « me « endl;
delete [] f; delete [] b;
}
Многомерные распределения
Нами не ставится цель подробно рассмотреть многомерные аналоги всех основных одномерных распределений (кроме нормального), поэтому укажем только их наименования и источники:
•	нормальное распределение — многомерное нормальное распределение [63, с. 58];
•	В-распределение — распределение Дирихле [там же, с. 57];
•	Z2 -распределение — распределение Уишарта [там же, с. 65];
•	t-распределение — многомерное t-распределение [там же, с. 67], в случае анализа многомерных совокупностей — ^-распределение Хотеллинга [167, с. 710].
Многомерное
нормальное распределение
В анализе данных находит применение многомерное нормальное (^компонентное гауссово) распределение. В случае ^-мерного
264
Глава 4. Теория распределений
нормального распределения плотность распределения совокупности определяется формулой [186, с. 312]
(2д)"'2|С|1/2е
где С — дисперсионно-ковариационная матрица, тп — вектор математического ожидания.
Дисперсионно-ковариационная матрица в случае многомерного распределения является параметром, аналогичным дисперсии в одномерном случае [206, с. 81]. Иногда многомерное распределение понимается в том смысле, что каждая переменная, составляющая многомерную совокупность, имеет нормальное распределение при фиксированных остальных переменных [97, с. 82], но это определение не совсем точное, так как авторы указанных источников имеют в виду маргинальное (то есть компонентное) распределение одной случайной величины, составляющей многомерное распределение [ 190, с. 176]. Они учитывают дисперсии, но не учитывают ковариации. Подробное обсуждение дано в [158, с. 105], [ У87, с. 76], [190, с. 177], [229, с. 140]. Датчик многомерных нормально распределенных случайных чисел представлен в [ 177, с. 78]. Двумерное нормальное распределение анализируется в [206, с. 97], где даны примеры его применения, и в [190, с. 173].
Генерация многомерных распределений
Рассмотрим генерацию многомерного распределения на примере многомерного нормального распределения. Получение многомерной нормальной выборки Y размера k х п по закону распределения где т — заданный вектор средних, С — заданная ковариационная матрица размера k х k, исходя из распределения Л/(0,1), немного сложнее, чем в одномерном случае. Здесь вычисление производится по формуле [140, с. 256]
У = Ц+LX,
где L — матрица размера k х k, вычисляемая из условия LLT = С. Последнее вычисление может быть легко выполнено, например, с помощью разложения Холецкого [189, с. 20], производимого функцией Choleski.
Теоретические и эмпирические распределения
265
Теоретические и эмпирические распределения
Теоретические вероятности эмпирических распределений необходимо уметь вычислять, например, для проверки соответствия эмпирического распределения какому-либо заданному типу распределения. В качестве примера мы рассмотрим вычисление теоретических вероятностей эмпирического распределения в предположении, что данный эмпирический ряд имеет нормальное распределение [84, с. 73], [70, с. 132].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
register int i;
double x[] = {60,65,70.75.80.85.90}. // Середины классов
f[7] . е[] = {2.30.34.62.74.8.4}.	// Теоретические частоты // Численности // эмпирического ряда
m = 75, s = 6:	// Выборочное среднее // Выборочное среднее // квадратичное // отклонение
int n = 7,	// Численность // вариационного ряда
nn = VectorSum (e,n);	// Объем эмпирического ряда
///////////////////////////////////////////////////
// Эмпирические частоты эмпирического распределения
// (для непрерывного распределения численности делятся
// на объем эмпирического ряда и величину классового интервала) for (i = 0:i < n; i++)
eCi] /= nn *(x[l] - x[0]):
//////////////////////////////////////////////////// // Теоретические частоты эмпирического распределения FrequencyNormal (x.f.n.m.s);
cout « "Середины классов, теоретические, эмпирические" «"частоты\п":
266
Глава 4. Теория распределений
for (i = 0:1 < n; i++)
cout « setw (10) « x[i]
« setw (10) « f[i]
« setw (10) « e[i] « endl:
}
void FrequencyNormal (double *x,double *f.int n,double m,double s) //
// Функция вычисляет теоретические частоты эмпирического
// распределения. Распределение нормальное.
// Обозначения:
// х - массив середин классовых интервалов.
// f - массив теоретических частот.
// п - численность каждой выборки.
// m - выборочное среднее арифметическое значение.
// s - выборочное среднее квадратичное значение.
// Возвращаемое значение:
// нет.
//
{
double t.	// Нормированное отклонение
г = 1.0 / sqrt (М_Р1 * 2) / S: // Вспомогательная
// переменная
for (register int i = 0; i < n; i++)
{
t = (x[i] - m) / s:
f[i] = r / exp (t * t / 2);
}
}
В [206; 84] приводится большое количество практических примеров использования теоретических частот эмпирических распределений, в [161] дана сводка типов распределений с подробными формулами, в [ 111, с. 66] даны подробные примеры вычисления теоретических частот эмпирических распределений для различных законов распределения. Мы ограничились рассмотрением нормального распределения, но вычисление частот других типов распределений принципиально, по крайней мере с точки зрения программиста, не отличается от показанного.
Дальнейшие исследования и программные ресурсы
• Систематизация вычислений непрерывных распределений путем применения там, где это возможно, универсальных функций численного интегрирования.
дальнейшие исследования и программные ресурсы	267
•	Повышение точности аппроксимационных решений, а также применение нейросетевых методов для аппроксимации одномерных и многомерных распределений.
•	Вычисление плотности распределения вероятностей у = р (х) нормального, % , Стьюдента и других распределений Пирсона как аналитического или численного решения дифференциального уравнения [135, с. 457]
du х + а
-Z- —-----------у ,
dx b0 + Ь{х + Ь2х2
где a, b0, bitb2 — действительные числа, в зависимости от значений которых получается то или иное распределение.
Для расчета, помимо представленных в данной главе алгоритмов, можно применять фирменные статистические калькуляторы1, например Probability Calculator (NCSS Statistical Software, www.ncss.com), StatMate (GraphPad Software, Inc., www.graphpad.com), ESBPDF Analysis (ESB Consultancy, www.esbconsult.com.au) или StaTable (Cytel Software Corp., www.cytel.com). Проблема, однако, не решается так просто — перечисленные программы иногда дают различные значения для одних и тех же параметров.
1 Так называются программы, предназначенные для вычисления статистических распределений и заменяющие собой их таблицы.
Глава 5. Корреляционный анализ
В практических наблюдениях часто бывают случаи, когда зависимости не имеют функционального характера — равномерному изменению одного признака соответствует изменение величины другого признака в среднем. Такой вид соотношений называется корреляционной зависимостью, или корреляцией [там же, с. 151], [22, с. 676]. Корреляционным анализом называется совокупность методов обнаружения корреляционной зависимости между случайными величинами или признаками [135, с. 294]. В [91, с. 374] считается, что исследование взаимной зависимости приводит к теории корреляции, тогда как изучение зависимости ведет к теории регрессии. Выделяется также случай функциональной зависимости между величинами, измерения которых, возможно, подвержены ошибкам наблюдений или измерений [там же, с. 373]. При этом под функциональной связью понимается такой род соотношения между двумя признаками, когда любому значению одного признака всегда соответствует определенное одно и то же значение другого [89, с. 150]. Наличие статистической корреляционной зависимости не влечет зависимости причинной [89, с. 153]. Исследование причинной зависимости — не предмет статистики, и именно поэтому статистическое моделирование не является моделированием математическим. Ниже рассмотрены методы исследования корреляции для признаков, когда оба признака измерены в одной и той же шкале — количественной, порядковой, номинальной, — а также когда признаки измерены в различных шкалах (например, один признак — в дихотомической шкале, другой — в количественной).
Корреляция количественных признаков
В данном разделе рассмотрены методы исследования количественных признаков: коэффициент корреляционного отношения Пирсо-1 на, применяемый для измерения тесноты связи при прямолиней
Корреляция количественных признаков
269
ной корреляции [89, с. 154], и коэффициент корреляции Фехнера [111, с. 237]. Коэффициенты ранговой корреляции, которые исследуют корреляцию порядковых признаков (рангов), хотя и полученных из признаков количественных (путем применения операции присвоения рангов), помещены в раздел «Корреляция порядковых признаков» данной главу.
Полученные в результате применения линейных методов корреляционного анализа выводы могут подтвердить или опровергнуть гипотезу о существовании линейной зависимости между рядами, но не связи другого типа [44, с. 179]. Так, отсутствие линейной корреляционной связи не означает отсутствие связи вообще. Например, для рядов с зависимостью одного ряда от другого, близкой к квад-ратичной зависимости, линейная корреляция может быть мала или 5 вообще отсутствовать. Вывод в этом случае такой: чем ближе вычисленная величина корреляционного отношения к 0, тем слабее сила линейной связи между рядами, чем ближе вычисленная величина к значению +1 (полная положительная корреляция) или к значению -1 (полная отрицательная корреляция), тем сильнее сила линейной связи. Для измерения тесноты криволинейной связи применяется корреляционное отношение, нами в данной книге не рассматриваемое, поэтому мы отсылаем читателя к какому-нибудь хорошему источнику, например [89, с. 166].
Коэффициент корреляционного отношения Пирсона
Коэффициент корреляционного отношения Пирсона (коэффициент корреляции, выборочный коэффициент корреляции, коэффициент корреляции Бравайса—Пирсона) измеряет силу линейной корреляционной связи количественных признаков. Коэффициент корреляции вычисляется по известной формуле [140, с. 170]
1=1
1 i=l	I i=l
где все обозначения стандартные.
Использование коэффициента корреляции в качестве меры связи оправдано лишь тогда, когда совместное распределение пары при
270
Глава 5. Корреляционный анализ
знаков нормально или приближенно нормально. Частой ошибкой в публикациях является игнорирование этого требования
Метод широко применяется для сравнительной оценки корреляции нескольких рядов между собой. Теоретическое обоснование методики и подробно разобранные примеры ее применения даны в [53, с. 106], [79, с. 19], [84, с. 144,413], [26, с. 192], [229, с. 67]. Вычислен ние коэффициента корреляции может быть выполнено также через ковариацию [ 18, с. 96,443], как и сделано в представленной функции.
Исходные коды
double Pearson (double х[],double y[],int n) //
// Функция вычисляет значение коэффициента корреляции Пирсона.
// Обозначения:
// х - первая сравниваемая выборка.
// у - вторая сравниваемая выборка.
// п - численность каждой выборки.
// Возвращаемое значение:
// значение коэффициента корреляции.
//
{
double s = Cov (x.x.n) * Cov (y.y.n);
if (!s)
return 0,-
el se
return Cov (x.y.n) / sqrt (s):
}
При исследовании многомерной совокупности случайных величин из коэффициентов корреляции, вычисленных попарно между случайными величинами, составляется квадратная симметрическая корреляционная матрица с единицами на главной диагонали [135, с. 296], которая служит основным элементом при построении многих алгоритмов многомерной статистики, например в факторном анализе. I Доверительный интервал выборочной оценки коэффициента корреляции р двумерной нормальной генеральной совокупности вычисляется как [140, с. 171]
ре tanh z(r)-
;tanh z(r) + ^«
J	V/Г-з j
где n — объем выборки,
Mi+p)/2 — квантиль нормального распределения,
Корреляция количественных признаков
271
р — стандартное значение доверительного уровня, z(r) — 2-преобразование выборочного коэффициента корреляции г.
Исходные коды и пример применения
^-include <fstream.h>
^include <math.h>
^include "megastat.h"
void main (void)
Snt n = 50;
double г » 0.35, p « 0.95, Low,High;
Confidencelnterval (Arth (r).n.p.&Low.&High);
cout « "Confidence interval is [" « Low «	« High «
"]\n";
}
void Confidencelnterval (double z.int n,double p,double
*Low,double *High)
//
// Функция вычисляет доверительный интервал коэффициента
// корреляции.
// Обозначения:
//	z	-	преобразование Фишера,
//	п	-	численность каждой выборки,
//	р	-	доверительный уровень,
// *Low	-	нижняя граница доверительного интервала.
// *High - верхняя граница доверительного интервала.
// Возвращаемое значение:
// нет.
//
{
double b - InverseNormalDistribution ((1 + р) / 2) / sqrt (п - 3);
*Low = tanh (z - b);
*High » tanh (z + b);
СП
Коэффициент корреляции Фехнера
Кратко опишем коэффициент корреляции Фехнера (фехнеровский Коэффициент корреляции), хотя нам не кажется плодотворной Идея сводить количественную шкалу к номинальной, что фактически
272
Глава 5. Корреляционный анализ
Корреляция количественных признаков 273
происходит при вычислении данного коэффициента. В расчетах, однако, участвуют только количественные признаки (по ним вычисляются средние арифметические), поэтому метод представлен в разделе, посвященном количественным признакам. Вычисления призводятся по формуле [111, с. 237]
С-Н 'F~ С+н’
где С — число совпадений знаков отклонений вариант от соответствующих средних,
Н — число несовпадающих знаков.
Очевидно, вычисления можно упростить, учитывая, что Н = п - С, что и сделано в показанной ниже функции.
Случай применения коэффициента корреляции Фехнера рассмотрен на примере обработки результатов лингвистических исследований [204, с. 344].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
int n = 12:
double a[] = {3.10.3.17.3.76.3.61.3.27.3.61.
3.80.3.65.3.34.3.65.3.45.4.05}, b[] = {3.65.3.11.3.57.3.61.3.44,3.71.
3.61.3.98.3.36.3.89.3.45.3.79}:
cout « "Fechner value is " « Fechner (a.b.n) « endl: }
double Fechner (double a[], double b[].int n)
//
// Функция вычисляет коэффициент корреляции Фехнера.
// Обозначения:
//	а, b - двунерная выборка,
// п - число наблюдений.
// Возвращаемое значение:
// Значение коэффициента корреляции Фехнера.
И
{
register int i;	// Счетчики цикла
double ха = VectorSum (a.n) I n, // Среднее первого ряда xb = VectorSum (b.n) / n, // Среднее второго ряда с = 0:	// Число совпадений знаков
for (i = 0: i < n; i++)
if (SignNull (a[i] - xa) == SignNull (b[i] - xb)) C++:
return 2.0 * c / n - 1:
}
Ковариация
5
Второй смешанный момент называется ковариацией. Данный показатель мало похож на коэффициент, характеризующий корреляцию, так как он не является безразмерным. Его значение не ограничено сверху числом 1. В данной книге этот показатель приводится для полноты изложения. Ковариация между двумя выборками случайных величин практически вычисляется как показано в [205, с. 78]:
1	”
Соу(Х,У) =—Х(х, -х)(& -у),
1 i=l
где х„ yt, i =1,2,..., п, — компоненты векторов X и Y, п — численности выборок X и К
Ковариация выборки с самой собой будет называться дисперсией (см. главу 1). Данный факт иногда применяется при вычислении дисперсии.
Исходные коды и пример применения
double Cov (double х[].double уЕ].int n) //
// Функция вычисляет значение ковариации.
// Обозначения:
// х - первая сравниваемая выборка.
// у - вторая сравниваемая выборка,
// п - численность каждой выборки.
// Возвращаемое значение:
// значение ковариации.
И
{
register int i: // Счетчик цикла
double xm, // Среднее значение х
274
Глава 5 Корреляционный анализ
ут, s = 0:
// Среднее значение у
// Вспомогательная переменная
xm » VectorSum (х.п) / п;
ут « VectorSum (у.п) / п;
for (i = 0: i < n: 1++)
s += (x[i] - xm) * (y[i] - ym);
return s / (n - 1);
Если X есть р-мерный вектор, его удобно представить в виде матрицы, состоящей из р столбцов длиной п элементов. Матрицей дисперсий-ковариаций такой многомерной совокупности будет
5	[63, с. 32]
Var(Xt) Cov(XpX2) ... Cov(XpXp)
Cov(X2,Xj) Var(X2) ... Cov(X2,Xp)
Cov^.X,) Cov(Xp,X2) ... Var(X )
Вычисление дисперсионно-ковариационной матрицы по данной формуле легко реализуемо, но не очень эффективно. Поэтому практически дисперсионно-ковариационную матрицу лучше вычислять, используя матричную запись [180, т. 2, с.’208]
где х — вектор средних длиной п.
Пример рассматриваемого подхода показан в главе 2 при составлении функции Hotelling. Ковариация применяется также в корреляционном, факторном, кластерном и других методах анализа данных. Обсуждение см. в [18, с. 96,443].
Корреляция порядковых признаков
В данном разделе рассмотрены методы исследования корреляции признаков, измеренных в порядковой шкале либо приведенных к порядковой шкале.
Корреляция порядковых признаков
275
Показатель ранговой корреляции Спирмэна
Показатель ранговой корреляции Спирмэна (показатель корреляции рангов Спирмэна, коэффициент корреляции рангов [111, с. 238], коэффициент корреляции Спирмэна [120, с. 61], коэффициент ранговой корреляции р, Spearman rank correlation) применяется в случае, если изучается линейная связь между рядами, представленными в количественной или порядковой шкале [187, с. 298]. Практически при анализе количественных признаков применять показатель Спирмэна вместо коэффициента корреляционного отношения Пирсона не следует, так как при его вычислении происходит понижение ко-личественной шкалы до порядковой. Поэтому наиболее широ- 5 кое применение показатель Спирмэна нашел при анализе корреляции порядковых признаков. Расчет ведется по формуле [84, с. 135, 151, с. 400,41]
Ps ~ 1
6(5р+Вх + Ву) п3-п
1=1
где rit s„ i =1,2,..., п, — массивы рангов,
п — число пар вариант исследуемых рядов,
В*, Ву — поправки на объединение рангов в соответствующих рядах, вычисляемые по формуле
здесь т — число групп объединенных рангов в ряду,
i =1,2,..., т, — число рангов в г-й группе.
В [91, с. 638], [135, с. 295], [52, с. 261], [26, с. 224], [151, с. 400] для вычисления показателя Спирмэна, где он назван ранговым коэффициентом корреляции, и в [89, с. 173], где в числе прочих наименований фигурирует ранговый коэффициент, не используются поправки на объединение рангов. Тот же подход принят в [101, с. 570]. Вывод формулы для расчета показателя ранговой корреляции непосредственно из формулы коэффициента корреляционного отношения Пирсона дан в [28, вып.2, с. 133], [70, с. 340].
Исходные коды и пример применения
#lnclude <fstream.h>
276
Глава 5. Корреляционный анализ
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{ int Code.
n = 13:
double x[] = {52.53.63,72.56.34.33.44.53.64,64,54.67}. y[] = {64.66,57,62,61,63.71,70,65,70.72,68.60}, ro:
Code » Spearman (x.y.n.&ro);
if (!Code)
cout « "Ro « " << ro « endl:
else (Code == -1)
cout « "Мало памяти\п":
int Spearman (double x[],double y[],int n.double *criterion) //
// Функция вычисляет значение показателя ранговой корреляции // Спириэна.
// Обозначения:
//	х - первая сравниваемая выборка.
//	у - вторая сравниваемая выборка,
//	п - численность каждой выборки.
// *criterion - вычисленное значение показателя.
// Возвращаемое значение:
//	0 при нормальном окончании счета.
//	-1 при недостатке памяти,
//	-2 при невозможности рассчитать достоверность.
//
{
register int i;	//	Счетчик
int *ix,*iy;	//	Вспомогательные переменные
double *spx,*spy,	//	Копии исходных массивов
*хх,*уу,	//	Массивы рангов
bx.by,	//	Поправки на объединение	рангов
s = 0:
if ((spx = new double[n]) == 0)
return -1:
if ((spy = new double[n]) == 0)
{
delete [] spx:
return -1:
}
Корреляция порядковых признаков
if ((xx = new double[n]) == 0)
delete [] spx: delete [] spy: return -1:
}
if ((yy = new doublefn]) == 0) {
delete [] spx: delete [] spy: delete [] xx: return -1:
}
if ((ix = new int[n]) e= 0) {
delete [] spx: delete [] spy; delete [] xx: delete [] yy: return -1;
}
if ((iy = new int[n]) == 0)
delete [] spx: delete [] spy: delete [] xx; delete [] yy: delete [] ix:
return -1: }
/////////////////////////////////////// // Работаем с копиями исходных массивов ArrayToArray (x.spx.n): ArrayToArray (y.spy.n);
//////////////////////////// // Сортировка по возрастанию SortArrayUp (spx.n,ix.1): SortArrayUp (spy,n,iy.1):
bx s Rank (spx.xx.n) / 12: by = Rank (spy.yy.n) / 12;
////////////////////////// // Ранги исходных массивов UnSortArray (xx.spx.n.ix): UnSortArray (yy.spy,n,iy):
delete [] xx: delete [] yy: delete [] ix: delete [] iy;
//////////////////////////////////////////// // Сумма квадратов попарных разностей рангов for (i = 0: i < n; i++)
s +- (spx[i] - spy[i]) * (spx[ij - spy[i]):
delete [] spx: delete [] spy:
Criterion = 1 - 6 * (s + bx + by) / n / (n * n - 1);
return 0; }
278
Глава 5. Корреляционный анализ
Коэффициент ранговой корреляции Кендалла
Коэффициент ранговой корреляции т Кендалла (коэффициент корреляции рангов, ранговый коэффициент корреляции, коэффициент корреляции Кендэла [120, с. 63], Kendall rank correlation) предназначен для вычисления силы корреляционной связи между двумя рядами при тех же условиях, что и рассмотренный выше показатель Спирмэна. Коэффициент Кендалла считается более строгой оценкой по сравнению с показателем ранговой корреляции Спирмэна.
Все основные положения и замечания, данные при описании показателя Спирмэна, справедливы и в отношении коэффициента Кендалла. Расчет ведется по формуле [41], [32, с. 97], [84, с. 138], [151, с. 396]
т =	5г., ST = £ £ sgn(r? - s,) t
к 2 dl 2 ’)
где r„ st, i =1,2,..., n, — массивы рангов анализируемых рядов, п — число пар вариант исследуемых рядов,
B# Ву — поправки на объединение рангов в соответствующих рядах, вычисляемые по формуле [180, т. 2, с. 140]
здесь т — число групп объединенных рангов в ряду, nt, i =1,2,..., ттг, — число рангов в i-й группе.
Поправки на объединение рангов, как можно заметить, вычисляются иначе, чем это сделано для других алгоритмов (например, для вычисления показателя Спирмэна и критерия Вилкоксона—Манна—Уитни), поэтому для вычисления поправок для коэффициента Кендалла применяется особая процедура ранжирования. Как и в предыдущем случае, некоторые авторы [32, с. 97] не используют поправки на объединение рангов. Проблема совпадающих рангов, возникающая в ранговых методах, обсуждается в [70, с. 346].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
Корреляция порядковых признаков
279
#include <math.h>
#include "megastat.h"
void main (void)
{
int Code, n = 13;
double x[] = {1.2,3.5,3.5,5,6,7.8.5.8.5,10,11.12.13}. y[] = {10.12,1.3.5,13,11,5.6,7.8,3.5.9,2}, tau;
Code = Kendall (x.y,n.&tau);
if (’.Code)
cout << "Tau = " << tau << endl;
el se
cout « "Мало паияти\п";
}
int Kendall (double x[],double y[],int n,double *criterion) //
// Функция вычисляет значение коэффициента ранговой корреляции // Кендалла.
// Обозначения:
//	х	-	первая сравниваемая выборка.
//	у	-	вторая сравниваемая выборка.
//	п	—	численность каждой выборки.
// *criterion	-	вычисленное значение коэффициента,
//	*t	-	его достоверность.
// Возвращаемое значение:
//	0 при нормальном окончании счета,
// -1 при недостатке памяти.
//
{
register int i.j;	//	Счетчики
int *ix.*iy;	//	Вспомогательные переменные
double *spx,*spy.	//	Копии исходных массивов
*xx.*yy.	//	Массивы рангов
bx.by.	//	Поправки на объединение рангов
s - 0;
if ((spx - new double[n]) == 0) return -1:
if ((spy = new double[n]) == 0) {
delete [] spx;
return -1;
}
280
Глава 5. Корреляционный анализ
if ((хх - new doublefn]) =e 0) {
delete [] spx; delete [] spy: return -1;
}
if ((yy = new double[n]) == 0) {
delete [] spx: delete [] spy: delete [] xx;
return -1;
}
if ((ix = new intfn]) == 0) {
delete [] spx: delete [] spy: delete [] xx; delete [] yy; return -1;
}
if ((iy e new int[n]) == 0)
{
delete [] spx; delete [] spy: delete [] xx: delete [] yy; delete [] ix:
return -1; }
/////////////////////////////////////// // Работаем с копиями исходных массивов ArrayToArray (x.spx.n);
ArrayToArray (y.spy.n);
/////////////////////////
// Сортировка по убыванию SortArrayDown (spx.n,ix,1): SortArrayDown (spy,n,iy,1):
///////////////// // Массивы рангов bx « Rank (spx.xx,n); by « Rank (spy.yy,n);
////////////////////////// // Ранги исходных массивов UnSortArray (xx,spx,n,ix); UnSortArray (yy.spy.n.iy);
/////////////////////////////////////////////////////// // Совместная сортировка по возрастанию первого массива SortArrayCommon (spx,spy,n);
delete [] ix; delete [] spx; delete [] iy: delete [] yy; delete [] xx;
for (i = 0; i < n - 1; i++) for (j = i + 1; j < n; j++) if (spy[i] < spyEJJ)
Корреляция номинальных признаков
281
S++;
else if (spy[i] > spy[j]) s—:
delete [] spy:
★criterion = s / sqrt ((n * (n - 1) / 2 - bx) * (n * (n - 1) / 2 - by)):
return 0: }
Корреляция номинальных признаков
В данном разделе представлены методы исследования корреляции признаков, измеренных в номинальной шкале либо приведенных к номинальной шкале.
Ниже показан полихорический коэффициент сопряженности Чупрова, предназначенный для исследования корреляции в таблицах сопряженности, которые могут быть построены как из номинальных, так и из порядковых признаков. В последнем случае, однако, происходит понижение порядковой шкалы до номинальной, поэтому для исследований корреляции порядковых признаков лучше применять методы, представленные в разделе «Корреляция порядковых признаков» данной главы. Рассмотрены также показатели подобия (Жаккарда, Сокала и Миченера, Рассела и Рао, Бравайса, Юла), предназначенные для оценки связи между дихотомическими признаками. Данные показатели находят широкое применение в кластерном анализе, где они именуются также мерами сходства типа корреляции.
Из непредставленных нами упомянем коэффициент корреляции (р [174, с. 164] и тетрахорический коэффициент корреляции [там же, с. 170]. В составленных функциях построение таблицы ассоциативности для мер типа корреляции можно было бы для удобства производить до вызова самих функций, как это сделано при вычислении коэффициента сопряженности Чупрова, а функциям оставить только роль вычисления показателей по готовой таблице ассоциативности. Более того, можно легко составить общую функцию, производящую вычисление как таблицы ассоциативности размера 2x2, так и таблицы сопряженности любого размера.
282
Глава 5. Корреляционный анализ
Таблица 2x2 (при ислледовании показателей подобия называемая таблицей ассоциативности) строится по тому же принципу, что и таблица сопряженности для номинальных признаков, рассмотренная в разделе «Точный метод Фишера—Ирвина» из. главы 2 (О указывает на отсутствие переменной, 1 — на наличие). Например, в ячейку а записано число пар элементов массивов 1 и 2, одновременно имеющих признак, равный 1, в ячейку с записано число пар элементов массивов 1 и 2, в которых значение элемента массива 1 равно 1, а значение элемента массива 2 равно 0 и т. д. Впрочем, при вычислении представленных ниже показателей путаница между b и с не ведет к каким-либо непрятностям. Таблица сопряженности типа гхс строится аналогично таблице 2 х 2 с учетом того, что признаки могут варьироваться на большем числе градаций.
Полихорический коэффициент сопряженности Чупрова
Полихорический коэффициент сопряженности Чупрова предназначен для исследования корреляции в таблице сопряженности типа гхс. Вычисления производятся по формуле [84, с. 162]
г_у у Л*| V(r-l)(c-l)	££ т.
i =1,2,..., c,j =1,2,..., г, — элементы таблицы сопряженности, n„ i =1,2,..., с, — суммы строк таблицы сопряженности, туг,, j =1,2,..., г, — суммы столбцов таблицы сопряженности, с — число столбцов таблицы сопряженности, г — число строк таблицы сопряженности.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
iinclude "megastat.h"
void main (void) {
register int i.j;
int r » 3,
Корреляция номинальных признаков
283
с = 3 Code;
double а[] = {2.12,14.27,74,47,9.25,4}, t;
Code = Chuprov (a,r,c,&t);
cout << "Return code is " « Code << endl;
if (ICode)
cout « "Chuprov value is ” « t « endl;
el se
cout « "Not enough memoryXn";
}
int Chuprov (double a[], int r, int c.double *t) //
// Функция вычисляет полихорический коэффициент сопряженности // Чупрова.
// Обозначения:
//	а	-	таблица сопряженности.
//	г	-	число строк таблицы,
//	с	-	число столбцов таблицы.
//	*t	-	коэффициент сопряженности.
// Возвращаемое значение:
//	0 при нормальном окончании расчета,
// -1 при недостатке памяти для вычислений.
//
{
register int i.j; //	Счетчики цикла
int m = 0;	//	Индекс массива
double е.	//	Рабочая переменная
*sr.	//	Суммы столбцов
*sc;	//	Суммы строк
*t = 0;
if ((sr = new doublefr]) == 0) return -1;
if ((sc = new double[c]) == 0) {
delete [] sr;
return -1;
}
/////////////////////////////
// Вспомогательные вычисления
for (i = 0; i < r; i++)
for (j = 0. sr[i] = 0; j < c; j++)
284
Глава 5. Корреляционный анализ
sr[i] += a[m++]:
for (i = 0: i < с; i++)
for (j « 0, sc[i] - 0. m - 1; j < r: j++, m += c) sc[i] += a[m]:
/////////////////////////////////// // Вычисление значения коэффициента for (1 = 0: i < с: i++)
{
for (j « 0, m = i, e e 0: j < c: j++. m += r) e +e a[m] * a[m] / sr[j]:
*t += e / sc[i ]; }
delete [] sr; delete [] sc;
*t = (*t - 1) / sqrt ((r - 1) * (c - D);
return 0;
}
Коэффициент Жаккара
Показатель подобия Жаккара (коэффициент Жаккара) вычисляется по формуле [148, с 161]
J = а / (а + b + с),
где а,Ь,с — значения в клетках таблицы 2x2.
Коэффициент Жаккара обсуждается также в [154, с. 141].
Исходные коды
double Jaccard (double х[],double yfl.int n) //
// Функция вычисляет показатель подобия Жаккара.
// Обозначения:
// х - первая сравниваемая выборка.
// у - вторая сравниваемая выборка, // п — численность каждой выборки.
// Возвращаемое значение:
// значение метрики.
//
{
register int	i;	H	Счетчик цикла
double s.		//	Знаменаталь формулы
pll =	O.plO = 0.	//	Клетки а и с таблицы "2x2
pOl =	O.pOO = 0;	//	Клетки b и d таблицы "2x2
Корреляция номинальных признаков
285
//////////////////////////////////////
// Построение таблицы ассоциативности
for (i=0: i < n: i++)
if (x[i] == 1 && y[i] == 1)
pll += 1:
else if (x[i] == 1 && y[i] == 0)
plO += 1:
else if (x[i] == 0 && y[i] == 1)
pOl += 1:
el se
pOO += 1:
////////////////////////////////////////////
// Вычисление и контроль знаменателя формулы
s = pll + plO + pOl:
if (!s)	с
return 0;
el se
return pll / s:
}
Простой коэффициент встречаемости
Показатель подобия Сокала и Миченера (простой коэффициент встречаемости) вычисляется по формуле [148, с 161]
J = (а + d) / (а + b + с + d),
где a, b,cyd — значения в клетках таблицы 2x2.
Коэффициент обсуждается также в [154, с. 141].
Исходные коды
double Sokal (double х[].double y[],int n) //
// Функция вычисляет показатель подобия Сокала и Миченера.
// Обозначения:
// х - первая сравниваемая выборка.
// у - вторая сравниваемая выборка.
// п - численность каждой выборки.
// Возвращаемое значение:
// значение метрики.
//
{
register int i;	// Счетчик цикла
double s,
pll = O.plO = 0,
pOl = O.pOO = 0:
for (i - 0: i < n: i++)
286
Глава 5. Корреляционный анализ
if (x[i] == 1 && уЕ1] == 1) pll += 1;
else if (x[i] == 1 && y[i] == 0)
plO += 1;
else if (x[ij == 0 && y[i] == 1)
pOl += 1:
el se
pOO += 1;
s = pll + plO + pOl + pOO:
if (s == 0)
return 0;
el se
return (pll + pOO) / s:
5	>
Показатель подобия Рассела и Рао
Показатель подобия Рассела и Рао вычисляется по формуле [154, с. 141]
J = a/(a+b + c + d),
где a, b,c,d - значения в клетках таблицы 2x2.
Исходные коды
double Rao (double х[].double уЕ].int n) //
// Функция вычисляет показатель подобия Рассела и Рао. // Обозначения:
// х - первая сравниваемая выборка.
// у - вторая сравниваемая выборка.
// п - численность каждой выборки.
// Возвращаемое значение:
// значение метрики.
//
{
register int i;	// Счетчик цикла
double s,
pll = O.plO » 0.
pOl = O.pOO = 0:
for (i = 0; i < n:
if (x[i] == 1 &&
pll += 1:
else if (x[i] == plO += 1;
i++)
y[i] == 1)
1 && y[i] == 0)
Корреляция номинальных признаков
287
else if (x[i] == 0 && y[i] -= 1)
pOl += 1:
el se
pOO += 1;
s - pll + plO + pOl + pOO;
if (s == 0) return 0;
el se
return pll / s;
}
Коэффициент сопряженности Бравайса
Специальная форма коэффициента корреляции — коэффициент со- 5 пряженности Бравайса ((^коэффициент Пирсона [191, с. 275]) — рассчитывается по формуле [26, с. 215]
_________ad-he__________ у](а + b)(a + c)(d + Z>)(J + с) ’
где a, b,c,d — значения в клетках таблицы 2x2.
Обсуждение дано также в [89, с. 174]. В [154, с. 143] рассматриваемый коэффициент назван показателем подобия Чупрова — у каждой нации есть свои изобретатели автомобиля, радио и самолета.
Исходные коды
double Bravais (double х[],double y[].int n) //
// Функция вычисляет коэффициент сопряженности Бравайса.
// Обозначения:
// х - первая сравниваемая выборка,
// у - вторая сравниваемая выборка,
// п - численность каждой выборки.
// Возвращаемое значение:
// значение метрики.
//
{
register int i:	// Счетчик цикла
double s,
pll = O.plO = 0,
pOl = O.pOO = 0;
for (i = 0: i < n; i++)
if (x[i] « 1 && y[i] == 1)
288
Глава 5 Корреляционный анализ
pll += 1:
else if (x[i] == 1 && y[i] == 0)
plO += 1;
else if (x[i] == 0 && y[i] == 1)
pOl += 1;
el se
pOO += 1;
s = (pll + plO) * (pll + pOl) * (plO + pOO) * (pOl + pOO);
if (s == 0)
return 0;
el se
return (pll * pOO - plO * pOl) / sqrt (s); }
Коэффициент ассоциации Юла
Ориентировочную оценку корреляционной связи в случае исследования таблиц сопряженности 2x2 может дать коэффициент ассоциации Юла. Вычисления производятся по формуле [91, с. 723]
ad-bc ad + bc
где обозначения те же, что и ранее.
Обсуждение см. в [26, с. 218], [154, с. 143].
Исходные коды
double Yule (double х[].double y[],int n) //
// Функция вычисляет коэффициент ассоциации Юла.
// Обозначения:
// х - первая сравниваемая выборка,
// у - вторая сравниваемая выборка,
// п - численность каждой выборки.
// Возвращаемое значение:
// значение метрики.
//
{
register int i:	// Счетчик цикла
double s.
pll = O.plO = 0.
pOl = O.pOO = 0;
for (i = 0; i < n;
if (x[i] == 1 &&
i++)
y[i] 1)
Корреляция номинальных признаков
289
pH += 1:
else if (x[i] == 1 && y[i] == 0)
plO += 1:
else if (x[i] == 0 && y[i] == 1)
pOl += 1;
el se
pOO += 1;
s = pll * pOO + plO * pOl:
if (s == 0)
return 0;
el se
return (pll * pOO - plO * pOl) / s;
}
Юл предложил коэффициент коллигации [91, с. 723], не имеющий 5 преимуществ перед показанным выше коэффициентом ассоциации:
ad - \lbc ^ad + yfbc
Хеммингово расстояние
Хеммингово расстояние (метрика Хемминга) менее других показателей похоже на коэффициент, характеризующий корреляцию, так как оно не является безразмерным, подобно ковариации. Его значение не ограничено сверху числом 1. Этот показатель приводится в данной книге для полноты изложения. Алгоритм вычисления хеммингова расстояния может быть представлен простой формулой [81, с. 67]:
Н = а + d,
где a,d — значения в клетках таблицы 2x2.
Локальная взвешенная метрика Хемминга (Хэмминга) представлена в [78, с. 194].
Исходные коды
double Hemming (double х[],double у[].int n) //
// Функция вычисляет хеммингово расстояние.
// Обозначения:
// х - первая сравниваемая выборка,
// у - вторая сравниваемая выборка,
10- 2002
290
Глава 5. Корреляционный анализ
// п - численность каждой выборки.
// Возвращаемое значение:
// значение метрики.
//
{
double s = 0: // Возвращаемое значение
for (register int i = 0; i < n; i++)
s += x[i] == y[i] ? 1 : 0;
return s;
}
Корреляция признаков, измеренных в различных шкалах
Настоящий раздел посвящен корреляции признаков, измеренных в различных шкалах. Рассмотрен коэффициент Гауэра, а также бисериальная корреляция, позволяющая исследовать корреляцию в некоторых частных случаях. Проблема исследования корреляции в таблицах данных, полученных измерением параметров, относящихся к различным шкалам, довольно часто возникает в практике, особенно в медико-биологических исследованиях.
Коэффициент Гауэра
Коэффициент Гауэра допускает одновременное использование признаков, измеренных в шкалах: количественной, порядковой и дихотомической. Вычисление элемента матрицы сходства, построенной на основе коэффициента Гауэра, производится по формуле [148, с. 163]:
s. =-Ad_, i = 1,2,..., nJ =1,2,..., п,
ix ы
где Sijk, i = 1, 2,..., nJ = 1, 2,..., n, k = 1, 2, ...,p, — вклад признака в сходство объектов,
Wyk, i = 1,2,..., n,j = 1,2,..., n, k = 1,2, ...,p, — весовая переменная признака, p — число признаков, характеризующих объект, п — число объектов.
Корреляция признаков, измеренных в различных шкалах
291
При этом:
•	для дихотомических признаков алгоритм подсчета вклада признака и взятия весовых переменных совпадает с коэффициентом Жаккара;
•	для порядковых признаков алгоритм вычисления вклада признака совпадает с хемминговым расстоянием, если последнее мысленно обобщить на порядковые переменные, а весовые переменные берутся равными 1 для каждого участвующего в расчете порядкового признака;
•	для количественных признаков
$tjk 1
где xik и xjk — значения k-й переменной для объектов i nj, Rk — размах k-ro признака, вычисленный по всем объектам, а весовые переменные берутся аналогично случаю порядковых признаков.
Пример использования коэффициента Гауэра для анализа медицинских данных рассмотрен в [13].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{ register int i.j;
int n = 4.
k = 10.
inf[] = {2.2.2.2.2.2.2.2.0.1},
m = 0, Code:
// Счетчики цикла
// Число объектов
// Число параметров
// Информация о типах
// параметров
// Счетчик элементов матрицы
// Код ошибки
double х[] = {1.0.0.1.0.0,0.0. 69.1, // Массив данных
1.1.0.1.0.0.0.0.167.2.
1,1.0.1,1.0.1.1.179.3.
1.0.0.0.1.1.1.1.158,3}, а[16];	// Матрица сходства
10*
292
Глава 5 Корреляционный анализ
Code = Gower (х,п.к,inf.а):
if (ICode)
{
cout « "Likeness matrixXn":
for (i = 0; i < n; i++) {
for (j = 0: j < n; j++, m++) cout « setw (12) « a[m];
cout << endl;
}
}
else if (Code == -1)
cout << "Not enough memoryXn":
el se
cout « "Cannot build Gower likeness matrixXn";
}
int Gower (double x[].int n.int k.int inf[],double a[]) //
// Функция вычисляет матрицу сходства с применением коэффициента // Гауэра.
// Обозначения:
// х - массив исходных данных (к векторов по п элементов // друг за другом), //	п - число объектов.
//	к - число признаков,
// inf - массив с информацией о шкале измерения каждого
// признака:
//	=0	для	количественной.
//	=1	для	порядковой,
//	= 2	для	дихотомической.
// а - вычисленная матрица сходства размером п х п.
// Возвращаемое значение:
//	0 при нормальном окончании расчета,
// -1 при недостатке памяти для вычислений,
// -2 при ошибке в вычислениях.
//
{
register int i. j. 1;	//	Счетчик цикла
int mr = 0,my,	//	Счетчики первого сравниваемого массива
mz.	//	Счетчик второго сравниваемого массива
ma = O.mt;	//	Счетчики верхнегоинижнего треугольников
double *r.	//	Вектор размахов
S,w;	//	Рабочие переменные, затем числитель
	//	и знаменатель
	//	элемента матрицы сходства
if (!(г = new double[k])) return -1;
Корреляция признаков, измеренных в различных шкалах
293
////////////////////////////////
// Формирование вектора размахов for (1=0: 1 < k; 1++)
{
for (j = О, ma = 1, w = x[i], s = x[ij; j < n; j++, ma += k) { if (x[ma] > w)
w = x[ma]:
if (x[ma] < s) s = x[ma]:
}
r[i] = w - s;
if (!inf[i] && !r[i])
5
delete [] г;	^КЯ
return -2;
}
}
////////////////////////////////
// Формирование матрицы сходства
for (j = 0; j < n - 1; j++, mr += k)
{
ma	=	j	*	n	+	j +	1:
mt	=	j	*	n	+	j +	n:
mz	=	j	*	к	+	k:
for (1	=	j	+	1, s	= 0. w = 0: 1 < n: 1++, mt+=n)
{
for (i =0. my = mr; i < к; 1++, mz++, my++)
///////////////////////////////
// Для количественных признаков if (!inf[ij)
{
s += 1.0 - fabs (x[mz] - x[my]) / r[i]; w++;
}
///////////////////////////
// Для порядковых признаков
else if (inf[i] == 1) {
if (x[mz] == xfmyj) { s++: w++:
} }
294
Глава 5. Корреляционный анализ
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
// Для дихотомических признаков el se
{
if (x[mz] =з 1 && x[my] == 1)
{
s++: w++: }
else if C(x[mz] == 1 && x[my] == 0) || (x[mz] == 0 && x[my] == D)
w++:
}
if C!w)
{
delete [] r;
return -2;
}
a[ma] = s / w;
a[mt] = a[ma++J:
}
}
/////////////////////////////
// Диагональ матрицы сходства
for (i = 0; i < n: i++)
a[i * (n + 1)] = 1:
delete [] r:
return 0:
}
Бисериальная корреляция в случае порядковых признаков
Бисериальный коэффициент предназначен для исследования корреляции в таблицах типа 2 х qy являющихся дихотомиями по некоторому качественному (номинальному) признаку и классификациями по номинальному [84, с. 166] либо порядковому [91, с. 411] признаку, который классифицируется по q классам и может быть упорядоченным либо неупорядоченным. В источниках указано на существенность предположения о двумерной нормальности исходного распределения, без указания, однако, на то, как это предположение может быть проверено. Бисериальная корреляция обсужда-| ется в [111, с. 249].
Корреляция признаков, измеренных в различных шкалах
295
Бисериальный коэффициент корреляции
формулы для расчета бисериального коэффициента корреляции г в случае классификации по порядковому признаку даны в [84, с. 166]. По [91, с. 414],
х.-хп. 1 Г =_!---1_,
\ п h
где — среднее по строке 1,
- — общее среднее по всей таблице,
sx — выборочное среднее квадратичное отклонение,
— численность строки 1,	5
п — общая численность всех выборок, zk — ордината плотности нормального распределения в точке k, где k суть решение уравнения
i-ед
Ошибка бисериального коэффициента корреляции определяется по формуле [84, с. 167]
Обсуждение и порядок вычислений см. также в [174, с. 163].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
include "megastat.h"
void main (void) {
register int i.j;
int c e 6;
double x[] = {16.17.18.20.25.33}, a[] = {583.666.525.383.214.40.563.980,868.814.439.81}.
r;
if (‘Biserial (x.a.c.&r))
296
Глава 5. Корреляционный анализ
cout « "Biserial value is ” « г « endl: el se
cout « "Not enough memoryXn";
}
int Biserial (double x[J.double a[], int c,double *t) //
// Функция вычисляет бисериальную корреляцию для порядковых // признаков.
// Обозначения:
//	х	-	середины классовых интервалов.
//	а	-	таблица сопряженности,
//	с	-	число столбцов таблицы,
//	*t	-	бисериальная корреляция.
// Возвращаемое значение:
//	0 при нормальной окончании расчета,
// -1 при недостатке памяти для вычислений. //
{
register int i:	// Счетчик цикла
double *е,	// Рабочий массив
nl = VectorSum (а,с).	// Численность 1-й строки
п = VectorSum (а,с * 2), // Общая численность xl,	// Среднее 1-й строки
хх = 0.	// Вспомогательная величина
sx = 0:	// Общая дисперсия
if ((е = new double[c]) == 0) return -1:
/////////////////////////////
// Вспомогательные вычисления
for (i = 0: i < с: i++)
e[i] = x[i] * a[i]:
xl = VectorSum (e.c) / nl:
for (i = 0: i < c: i++)
{
e[i] += x[i] * a[c + i]:
sx += (a[c + i] + a[i]) * x[i] * x[i];
xx += (a[c + i] + a[i]) * x[i]:
}
sx = sqrt ((sx - xx * xx / n) / (n -	D):
*t = fabs (InverseNormalDistribution	(nl / n))
*t = 0.39894 / exp (*t * *t / 2):	
///////////////////////////////
// Вычисление оценки корреляции
*t = (xl - VectorSum (e.c) / n) / sx * nl / n / *t:
Корреляция признаков, измеренных в различных шкалах 297
delete [] е:
return 0;
}
Бисериальный коэффициент по таблице Келли—Вуда
В [84, с. 168] рассматривается бисериальный коэффициент корреляции по таблице Келли—Вуда, обозначаемый так же, как и предыдущий из рассмотренных коэффициентов, и вычисляемый по формуле
I*!-*;!/*?
где р = njn — доля частот в строке, определяемой из условия р > q, q —р — доля частот в другой строке,
С — ордината в точке границы классов частот первой и второй строк, определяемая по таблице Келли—Вуда, остальные обозначения те же, что и раньше.
Как оказалось, таблица Келли—Вуда [84, с. 397] вполне удовлетворительно для практических расчетов аппроксимируется полиномами 6-го порядка. Мы даем вычисленные коэффициенты аппроксимации в теле функции, а для проверки эта аппроксимация может быть выполнена с помощью электронных таблиц Microsoft Excel.
При п < 100 коэффициент должен быть скорректирован по формуле [84, с. 169]
rk=rt 1+11о,25+^-Г1-^
1+^+0,25г2
где х — абсцисса в точке границы классов частот первой и второй строк в долях среднего квадратичного отклонения, определяемая по таблице Келли—Вуда, остальные обозначения те же.
Ошибка бисериального коэффициента корреляции находится по формуле [84, с. 170]
298
Глава 5. Корреляционный анализ
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
register int i.j;
int c = 7. Code;
k double x[] = {3.4.5.6.7.8.9}.
	a[] = {0.0.0.2,5.2.0.1.4.7.21.16.3.1}.
r;
Code = KellyWood (x.a.c.&r);
if (!Code)
cout « "Biserial value is " « r << endl; el se
cout « "Not enough memoryXn";
}
int KellyWood (double x[],double a[], int c.double *t) //
// Функция вычисляет бисериальную корреляцию
// по таблице Келли-Вуда.
// Обозначения:
//	х	-	середины классовых интервалов,
//	а	-	таблица сопряженности,
//	с	-	число столбцов таблицы.
//	*t	-	бисериальная корреляция.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -1 при недостатке памяти для вычислений. //
{
register int i;	// Счетчик цикла
double ах[] = {328.4743129110.	// Коэффициенты аппроксимации
-2900.5961519408,10552.8860824811, -20273.7171729728.21714.7515916749.
-12298.6906330287.2879.4131874144}.
ау[} = {-6.5578492838.60.1135820561.
-216.6989288679.417.1468658186.
-450.8952582758.258.2764594071.-61.3800505623}.
*е.	// Рабочий массив
nl = VectorSum (а,с),	// Численность 1-й строки
Корреляция признаков, измеренных в различных шкалах 299
п =	VectorSum (а.с * 2),//	Общая численность
xl.	//	Среднее 1-й строки
х2.	//	Среднее 2-й строки
хх	=	0,	//	Вспомогательная переменная
sx	=	0,	//	Общая дисперсия
р,	//	Доля 1-й строки
q,	//	Доля 2-й строки
z.xz;	//	ПараметрыпотаблицеКелли-Вуда
if ((е = new doublefc]) == 0) return -1:
///////////////////////////// // Вспомогательные вычисления for (i = 0: i < с: i++) e[i] = x[i] * a[i];
xl = VectorSum (e.c) / nl;
for (i =0; 1 < c: i++)
{
e[i] = x[i] * a[c + i]:
sx += (a[c + i] + a[i]) * x[i] * x[i];
xx += (a[c + i] + a[i]) * x[i]:
}
x2 = VectorSum (e.c) / (n - nl);
sx - sqrt ((sx - xx * xx / n) / (n - 1));
delete [] e;
p = nl / n; if (p < 0.5) { q = p: p = i - q;
}
el se
q = 1 - p;
xz - Horner (ax,6,p);
z - Horner (ay.6,p);
/////////////////////////////// // Вычисление оценки корреляции *t = fabs (xl - x2) * p * q / z / sx;
//////////////////////////////////////
11 Коэффициент с поправкой для малых n if (n <= 100)
*t *= (1 + (0.25 +p*q/2/z/z-(l-p*xz/z)* (1 + q * xz / z) + *t * *t / 4) / n);
return 0;
}
300
Глава 5 Корреляционный анализ
Бисериальная корреляция в случае номинальных признаков
Вычисление выборочной оценки бисериального коэффициента корреляции в случае классификации по номинальному признаку производится по формуле [91, с. 412]
где п — общая численность таблицы,
и, — численность таблицы в сечении г, г =1,2,..., q,
m J st — оценка в сечении г, i =1,2,..., q, получаемая по таблице нормального интеграла от относительной частоты первого из двух качественных признаков,
ту / sy — оценка, получаемая по таблице нормального интеграла от относительной частоты первого качественного признака по всей таблице.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
register int i.j;
int c = 6, Code;
double a[] = {50.88.155.379.18.63,43.62.110.300.14.144}.
r;
Code = Biserial (a.c.&r);
cout « "Return code is " « Code « endl;
if (iCode)
Корреляция признаков, измеренных в различных шкалах
301
cout « "Biserial value is " « г « endl: e! se
\cout « "Not enough memory\n";
} |
int’ Biserial (double a[], int c,double *t)
// I
// Функция вычисляет бисериальную корреляцию для // номинальных признаков.
// Обозначения:
//	а	-	таблица сопряженности,
//	с	-	число столбцов таблицы,
//	*t	-	бисериальная корреляция.
// Возвращаемое значение:
//	0	при нормальном окончании расчета.
// -1 при недостатке памяти для вычислений.
//
{
register int	i;	//	Счетчик цикла
double	е,	//	Рабочая переменная
*х.	//	Относительные частоты
*п.	//	Суммы столбцов
s =	VectorSum (а,с * 2): //	Общая сумма таблицы
if ((х = new double[c]) == 0) return -1;
if ((n = new double[c]) == 0)
{
delete [] x:
return -1:
}
/////////////////
// Суммы столбцов
for (i = 0: i < c: i++) n[i] = a[i] + a[c + ij;
//////////////////////// // Относительные частоты for (i = 0; i < c; i++) x[i] = a[i] / n[i]:
////////////////////////////////////////////////
// Оценки отношений средних к среднеквадратичным for (i = 0; i < с; i++)
x[i] « InverseNormalDistribution (x[ij):
e = InverseNormalDistribution (VectorSum (a,c) / s);
///////////////////////////// // Вспомогательные вычисления for (i « 0, *t = 0: i < c: i++)
302
Глава 5. Корреляционный анал!
*t += n[i] * x[i] * x[i]:
*t /= s:
///////////////////////////////// // Оценка коэффициента корреляции *t = sqrt ((*t - e * e) / (*t + 1)):
delete [] x; delete [] n:
return 0; }
Точечно-бисериальная корреляция
В случае, если одна переменная дихотомизирована, а другая измерена в количественной шкале, вычисляется точечно-бисериальный коэффициент корреляции (точечный двухсерийный коэффициент корреляции) [174, с. 168] по формуле
где х ~ среднее вариант количественной выборки, соответствующих событиям верхнего уровня (уровня 1) дихотомической выборки, х — среднее количественной выборки,
sx — среднее квадратичное количественной выборки,
пр — число событий в верхней группе (с уровнем 1),
nq — число событий в нижней группе (с уровнем 0).
В составленной нами функции предполагается, что дихотомическая переменная может принимать только значения 1 (верхний уровень) и 0 (нижний уровень).
Точечно-бисериальная корреляция является специальным случаем корреляционного отношения Пирсона [там же] и подробно обсуждается в [91, с. 416].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#inclide "megastat.h"
void main (void)
корреляция признаков, измеренных в различных шкалах
303
{
egister int	i.j;	//	Счетчики
ht п = 7,		//	Число пар
] Code;		//	Код ошибки
фиЫе a[] =	{0.0,1.1,0,1,1}.	//	Дихотомическая выборка
x[] =	{1,2,4.5.1.4,6}.	//	Количественная выборка
r;		//	Коэффициент корреляции
Code = Point (a.x.n.&r);
if (’Code)
cout « “Point biserial value is H « r « endl;
else
cout « "Error\n";
}
int Point (double a[],double x[],int n,double *t) //
// Функция вычисляет точечно-бисериальную корреляцию.
// Обозначения:
//	а	-	дихотомический массив,
//	х	-	непрерывный массив,
//	п	-	численность каждой выборки.
//	*t	-	точечно-бисериальная корреляция.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -2 при ошибке в вычислениях.
//
{ register int i, // Счетчик цикла
пр = 0; // Число событий в верхней группе
double s = 0;	// Рабочая переменная
5
///////////////////////////////////////////////// // Получение дополнительной информации о массивах for (i = 0; i < n; i++)
if (a[ij)
{
np++;
s += x[i];
}
///////////////////////////////////////////////// // Если равно нулю число событий нижней группы if (пр == п)
return -2;

/////////////////////////////////////////// // Значение точечно-бисериальной корреляции
304
Глава 5. Корреляционный анали;
*t = (s / пр - VectorSum (x.n) / п) / sqrt (Cov (х.х.п) / пр (п - пр));
return 0:
}
Множественные корреляции
Предположим, что некоторая величина зависит не от одного, как рассмотрено выше, а от ряда внешних факторов. В этом случае говорят о множественной корреляции [231, с. 351].
Методы данного раздела применимы для признаков, измеренных в количественной шкале (коэффициент множественной корреляции и канонический корреляционный анализ), и для ранжированных количественных или порядковых признаков (коэффициент конкордации).
Коэффициент множественной корреляции
Оценка тесноты связи между переменными в случае множественной регрессии вводится коэффициентом множественной корреляции R, квадрат которого определяется формулой [22, с. 691]
где Yi — значения переменной, взятые из корреляционной таблицы, yi — то же, вычисленное по регрессионной формуле, остальные обозначения стандартные.
Отметим, что величина достоверности аппроксимации Я2, выводимая программой Microsoft Graph, не то же самое, что коэффициент множественной корреляции, и вычисляется по другой формуле, данной в справочной системе упомянутой программы.
Мы не приводим функции вычисления коэффициента множественной корреляции в силу достаточной элементарности алгоритма.
В [135, с. 296] вводится множественный коэффициент корреляции, отличающийся от описанного здесь коэффициента множественной корреляции. Множественный коэффициент корреляции служит
Множественные корреляции	305
мерой линейной корреляции между Хх и совокупностью остальных величин Х2,..., Хп и вычисляется как обычный коэффициент корре-л^хии между Xi и множественной регрессией по Х2,...,Хп.
Частный случай вычисления коэффициента множественной корреляции рассмотрен в [89, с. 169], множественная детерминация (квадрат коэффициента множественной корреляции) изучена в [140, с. 137]. Обсуждение см. в [120, с. 38], [139, с. 35].
Канонический корреляционный анализ
Представление математических объектов называется каноническим, если две различные записи соответствуют двум различным объектам. Иначе говоря, если каждому объекту одного множества соответствует один и только один элемент другого множества, и данное соответствие взаимно однозначно, представление называется каноническим. О представлении объектов в математике см. [74, с. 85]. Канонический корреляционный анализ выполняется между двумя совокупностями (группами) выборок и предназначен для определения линейной функции от первых р компонент и линейной функции от остальных q компонент так, чтобы коэффициент корреляции между этими линейными функциями принял наибольшее возможное значение [190, с. 585]. Численности групп (количество выборок в первой и второй группах, р и q) могут различаться, однако необходимым требованием является равное количество вариант во всех выборках, составляющих обе группы. Матрица взаимной корреляции R двух групп выборок имеет вид
где — матрица взаимной корреляции р переменных 1-й группы, размер р х р,
R22 — матрица взаимной корреляции q переменных 2-й группы, размер q х q,
R[2— матрица взаимной корреляции переменных 1-й и 2-й групп, размер р х q.
Решение сводится к обобщенной проблеме собственных значений
где Л — вектор q собственных значений.
306
Глава 5. Корреляционный анал^
Так называемые канонические корреляции представляют собой квадратные корни из собственных значений. Представленной далее функцией выводятся: значения критерия X (массив длиной И) и соответствующие степени свободы (массив длиной q), а также коэффициенты правой (массив размером q х q) и левой (массив размером q^p) сторон.
Методику канонического корреляционного анализа см. в [174, с. 69], [139, с. 194], [108, с. 214]. Практический пример дан в [78, с. 179].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
5 #include <math.h>
#include "megastat.h"
void main (void)
{
register int i.j: // Счетчики
int Code.	//	Код ошибки
ml = O.m2 = 0. //	Счетчики элементов	массивов
p = 4,	//	Число рядов первой	группы
q = 3,	//	Число рядов второй	группы
п = 23:	//	Число вариант
double datl[] =	// Первая группа выборок
{191.195.181.183.176.208.189.197.188.192.179.183,174.190.188.
163,195.196.181.175.192.174.176,
155,149,148,153,144.157.150,159,152,150,158,147,150,159.151,
137,155,153,145.140.154.143.139.
65.	70,	71,	82. 67,	81,	75,	90, 76,	78.	99.	65,	71,	91.	98.
59.	85.	80.	77. 70.	69,	79,	70,						
19.	20,	19,	18, 18,	22,	21.	20. 19.	20.	18.	18,	19.	19.	20.
18.	20,	21.	20. 19,	20,	20.	20}.						
dat2[] =	// Вторая группа выборок
{179.201.185.188.171.192.190.189,197.187.186.174.185.195.187.
161.183,173.182.165.185.178.176.
145.152,149,149.142.152.149,152,159.151.148.147.152.157.158,
130,158.148.146.137,152.147.143,
70.	69, 75, 86, 71. 77. 72. 82, 84. 72. 89. 70, 65, 99. 87.
63.	81. 74. 70. 81. 63. 73. 69}.
*	z,	//	Канонические	корреляции
*	s,	//	Коэффициенты	правой стороны
*	г,	//	Коэффициенты	левой стороны
*	х.	//	Значения критерия хи-квадрат
Множественные корреляции
307
*t;	// Степени свободы
Z =	new	double[q];
S =	new	double[q * q]
г =	new	double[q * p]
X =	new	double[q];
t =	new	doubleEq]:
if (!(Code = CanonicalCorrelationAnalysis (datl,dat2.p.q.n,z.s.r.x.t)))
for (i - 0; i < q: i++) {
cout « "r = " « z[i] « " chi square = " « x[i] « " nu - " « t[i]
« - p = - « chiSquareDistribution (t[i].x[i])
« "ХпКоэффициенты левой стороныХп";
for (j = 0; j < p; j++,ml++)
cout << r[ml] « " ";
cout « "ХпКоэффициенты правой стороныХп";
for (j - 0; j < q: J++,m2++)
cout « s[m2] « " cout « endl;
}
else if (Code == -1)
cout << "Мало памятиХп":
el se
cout « "Потеря значимости при вычисленииХп";
delete [] z; delete [] s; delete [] r; delete [] x; delete [] t; }
int CanonicalCorrelationAnalysis (double yl[],double y2[],int p.int q.int n,double 1[],double t[],double rE],double xi[],double u[]) //
// Функция выполняет канонический корреляционный анализ между
// двумя группами выборок.
// Обозначения:
//	yl	-	массив - первая группа - размером п х р.
//	у2	-	массив - вторая группа - размером п х q,
//	р	-	число рядов в первой группе.
//	q	-	число рядов во второй группе.
//	п	-	число вариант в ряду группы,
//	1	-	вектор вычисляемых канонических корреляций	длиной	q.
//	t	-	массив вычисляемых коэффициентов правой стороны	длиной
// q х q.
// г - массив вычисляемых коэффициентов левой стороны длиной
// q х р.
// xi - массив значений критерия хи-квадрат длиной q,
// и - массив степеней свободы для критерия хи-квадрат длиной q.
// Возвращаемое значение:
308
Глава 5. Корреляционный анализ
//	0 при нормальном окончании расчета,
// -1 при недостатке памяти для рабочих массивов,
// -2 при ошибке в вычислениях.
//
{
register int i.j.il; //	Счетчик цикла
int ml,m2.m3;	//	Вспомогательные	переменные
double *a,*rll,	//	Вспомогательный	массив
save;	//	Вспомогательная	переменная
if ((rll = new double[n]) == 0) return -1;
if ((a = new doublefn]) == 0) {
delete [] rll;
return -1;
}
/////////////////////////////////////////////
// Матрица взаимных корреляций между группами
for (i = 0. ml = 0; i < p; i++)
{
for (il =0; il < n; il++) rll[il] = yl[ml++j;
for (j = 0, m2=0, m3 = i; j < q: j++. m3 += p) {
for (il = 0; il < n; il++) a[il] = y2[m2++J;
r[m3] e Pearson (rll.a.n);
}
}
delete [] rll; delete [] a;
//////////////////////////////////////////////
// Матрица взаимных корреляций в первой группе
if ((rll = new double[Maximum0f (p.q) * MaximumOf (p.q)]) == 0) return -1;
if (LikenessForCorrelation (yl.rll.n.p.0) ! = 0) {
delete [] rll;
return -1;
}
if (! (a = new double[Maximum0f (p.q) * MaximumOf (p.q)])) {
delete [] rll;
return -1;
}
Множественные корреляции
309
if ((m2 = InverseMatrlx (rll.a.p)) != 0) {
delete [] rll; delete [] a;
return m2;
}
/////////////////////////////////////////////// // Матрица взаимных корреляций во второй группе if (LikenessForCorrelation (y2.t.n,q.O) != 0)
{
delete [] rll; delete [] a;
return -1;
}
MatrixMultiplyMatrix (a.r.rll.p.p.q);
MatrixTMultiplyMatrix (r.rll,a.q.p.q):
if ((m2 = Eigen (a,t.q.O.000001,&ml)) 1= 0) {
delete [] rll; delete [] a;
return m2;
}
///////////////////////////////////////////////// // Упорядочивание собственных значений и векторов for (i = 0; i < q; i++)
{
1Ei] - a[i * (q + 1)];
if (l[i] <= 0 && l[i] >= 1)
return -2;
el se
1[i] = sqrt (l[i]): }
delete [] a;
for (i = 0; i < q; i++)
{
m2 = i;
save = 1[i];
for (j = i + 1; j < q; j++)
if (save < 1EjJ)
{
m2 = j;
save = 1[j];
}
Col Interchange (l.l.i,m2):
Col Interchange (t,q,i,m2); }
310
Глава 5. Корреляционный анализ
for (1=0: i < q: i++)
{
for (j » 1, save = 1: j < q: j++)
save *= (1.0 - 1[j]):
xi[i] - -(n - (p + q + 1) / 2) * log (save):
u[i] = (p - 1) * (q - 1):
}
/////////////////////////////////////////
// Вычисление коэффициентов левой стороны MatrixMultiplyMatrix (rll.t.r.p.q.q);
for (i = 0: i < p: i++)
for (j = 0, ml = i: j < q; j++, ml += p) r[ml] /= l[j]:
delete [] rll:
return 0;
}
Коэффициент конкордации
Коэффициент конкордации предназначен для исследования, хорошо ли согласуются друг с другом k ранжировок выборки из п членов. Такая задача, например, возникает при решении вопроса о том, насколько хорошо согласуются друг с другом ранжировки массива данных размера пу проведенные k экспертами. Вычисления производятся по формуле [70, с. 342]
где xtJ, i = 1,2,..., nJ =1,2,..., k, — массив ранговых оценок,
п — размер каждого массива, k — число массивов.
Исследование ранговой корреляции с помощью коэффициента конкордации рассмотрено в [32, с. 97].
Исходные коды и пример применения
tfinclude <fstream.h>
#include <iomanip.h>
finclude <math.h>
Множественные корреляции
311
^include "megastat.h"
void main (void)
{
int n = 12, // Численность каждой выборки k = 6:	// Число выборок
double х[] = // Массив выборок
{11.	4. 3, 6.	1,	5. 7, 8.10.	2.12. 9.
8,	7. 4. 5.	3.	2, 6. 9,12,	1.11.10.
9,	8. 5. 6.	1,	7. 2.11.12.	3.10. 4.
11.	3. 2. 8.	1.	4, 5.10, 9,	6,12. 7,
8.	7, 1. 9.	4.	6, 2.11.12.	3.10, 5.
9.	6. 4.11,	3,	7. 1. 5.10.	2.12. 8}
w; // Значение коэффициента конкордации
w = Concord (x.n.k);
cout « "W = " « w « ". p = "
« FDistribution (n - l.(n -
/ (1.0 - w))
« endl;
}
1) * (k - 1) / 2,(k - 1) * w
double Concord (double x[].int n.int k) //
// Функция вычисляет значение коэффициента конкордации. // Обозначения:
// х - массив выборок (выборки друг за другом),
//	п - численность каждой выборки.
//	к - число выборок.
// Возвращаемое значение:
// значение коэффициента конкордации.
//
{
register int	i.j;	//	Счетчики цикла
int 1:	//	Счетчик массива
double	г = k	*	(n + 1) / 2, //	Среднее значение
s,	//	Сумма по столбцам
si = 0;	//	Рабочая переменная
for (i = 0; i < n: i++) {
for (j = 0,s = 0.1 = i: j < k: j++. 1 += n)
s += x[l J;
si +» (s - r) * (s - r);
}
return si * 12 / к / к / n / (n * n - 1): }
312
Глава 5. Корреляционный анализ
Критерии некоррелированности
Рассмотрим применение коэффициентов корреляции для проверки независимости признаков (некоррелированности, значимости связи) [187, с. 301]. Гипотеза о независимости признаков отвергается на выбранном уровне значимости, если вычисленное по опытным данным значение коэффициента корреляции превосходит (по модулю) критическое. Практические вычисления, однако, производятся несколько иначе.
Коэффициент корреляции
Коэффициент корреляции может применяться для проверки гипотезы значимости связи следующим образом. В случае нормального распределения исходных данных величина выборочного коэффициента корреляции считается значимо отличной от нуля, если выполняется неравенство [135, с. 295]
р2 >[l+(n-2)/t’]-',
где ta — критическое значение ^-распределения с (п - 2) степенями свободы.
Обсуждение дано в [140, с. 167], где немного в иной записи приводится та же самая формула.
Статистика у/ц-1 р имеет г-распределение [ 101, с. 568] с плотностью
Для больших выборок статистика ^п-\р распределена приближена но по стандартному нормальному закону N(fi, 1) [там же, с. 569].
Показатель ранговой корреляции
В качестве критериев некоррелированности могут применяться и другие коэффициенты корреляции, например показатель ранговойI
Критерии некоррелированности
313
корреляции Спирмэна. При этом вычисление производится по формуле [158, с. 211]

где критические значения статистики tp для стандартных уровней значимости даны в [там же, с. 212], [52, с. 264], а для больших выборок (п > 50) распределены по Стьюденту [там же, с. 265] с числом степеней свободы (п - 2).
В [ 187, с. 302] указано, что для больших выборок статистика yjn-\.ps распределена приближенно по стандартному нормальному закону Х(0,1). Обсуждение см. также в [151, с. 400]. Пример применения показателя ранговой корреляции в качестве критерия независимости признаков рассмотрен в [28, вып. 2, с. 134].
Коэффициент ранговой корреляции
Для коэффициента ранговой корреляции Кендалла в случае больших выборок статистика
19п(п +1)
V2(2w + 5)T
распределена приближенно по стандартному нормальному закону [там же].
Бисериальный коэффициент корреляции
Ошибка бисериального коэффициента корреляции [84, с. 167] имеет ^-распределение с числом степеней свободы (и - 2).
Точечно-бисериальный коэффициент корреляции
Точечно-бисериальный коэффициент корреляции может приме-пяться для проверки гипотезы значимости связи следующим образом. Величина выборочного точечно-бисериального коэффициента Корреляции считается отличной от нуля на уровне значимости а, если выполняется неравенство [174, с. 168]
314
Глава 5. Корреляционный анализ

п-2
1-гД
*ta’
где ta — критическое значение t-распределения с (и - 2) степенями свободы.
Коэффициент множественной корреляции
Пусть имеется случайная выборка объема п из (р + 1)-мерного нормального распределения. Коэффициент множественной корреляции отличается от нуля на уровне значимости «, если выполняется неравенство [120, с. 39]
I
yv + pF
где F — значение обратной функции F-распределения для числа степеней свободы р и (п - р - 1) и доверительного уровня (1 - а).
Коэффициент конкордации
Величина (k-X)-—--1 — Vv
имеет F-распределение с числом степеней
свободы (п - 1) и ((п - 1)(& - 1) - 2). Высокий уровень выдаваемого функцией FDistribution значения свидетельствует о высокой
степени согласования между ранжировками.
Пример применения методики дан выше при описании коэффициента конкордации.
Дальнейшие исследования и программные ресурсы
•	Построение доверительных интервалов для показателя Спирмэна и коэффициента Кендалла.
•	Более подробное изучение связи признаков, измеренных в различных шкалах в [187, с. 308], [196], [197].
•	Исследование частной корреляции в [24, с. 191].
Дальнейшие исследования и программные ресурсы
315
Для расчета с помощью представленных в главе алгоритмов можно применить не только программы, составленные нами, но и множество имеющихся на рынке программного обеспечения программ. Помимо стандартных электронных таблиц, корреляционный анализ стандартно с той или иной степенью полноты входит в большинство универсальных программ анализа данных.
Глава 6. Методы снижения размерности
Изложенные в главах 8 и 9 методы распознавания образов имеют дело с основными элементами анализа как с объектами распознавания (классификаций), в оцифрованном виде представленными своими параметрами. В настоящей главе мы рассмотрим некоторые методы снижения размерности, позволяющие обоснованно сократить длину вектора параметров до приемлемых величин.
Следует отличать методы снижения размерности от методов сжа-6 тия информации, например архивирования, предназначенных для максимального уменьшения объема образов при их хранении и транспортировании по сетям передачи данных. Методы снижения размерности призваны найти компромисс между максимальным уменьшением объема, занимаемого информацией об образе, и сохранением его способности быть идентифицированным (узнанным) и классифицированным, причем само сжатие (снижение размерности) производится, прежде всего, с целью облегчения решения указанных двух вычислительных задач. Например, в задаче идентификации личности по отпечатку пальца на основе графического образа отпечатка может формироваться последовательность длиной до 2500 бит [186, с. 46], хотя исходное изображение имеет гораздо больший объем.
Проблеме снижения размерности вектора параметров распознаваемых образов посвящена глава книги [там же, с. 261], причем авторы рассматривают ряд методов выбора признаков:
•	метод минимизации энтропии,
•	разложение по системе ортогональных функций, представленное разложением в ряд Фурье и разложением Карунена—Лоэва,
•	другие методы.
Метод минимизации энтропии
Метод предложен в [186, с. 281], где показано, что снижения размерности пространства параметров можно добиться, используя линейное преобразование
Метод минимизации энтропии
317
У = Ах,
где х — исходный вектор параметров объекта, размерность вектора равна и,
у — новый вектор меньшей размерности тп < и, А — матрица преобразования.
Матрица А составлена из т ортонормированных собственных векторов, соответствующих наименьшим собственным значениЯхМ ковариационной матрицы С, построенной на основе некоторой совокупности обучающих образов — объектов, принадлежащих исследуемому пространству. Предполагается, что при последующей классификации объектов ковариационные матрицы выделенных классов будут равными. Метод выводится из условия минимизации энтропии (меры неопределенности) и по технике вычислений, а также по ограничениям применения сильно напоминает линейный дискриминантный анализ Фишера.
Применяемый нами для вычисления собственных значений и собственных векторов метод Якоби годится только для векторов параметров умеренных размерностей, что вызвано прежде всего не численной неустойчивостью или большим временем вычислений, а возможной потерей точности наименьших собственных значений. Поэтому в случае больших размерностей вектора параметров следует применять более пригодный для большой задачи метод решения проблемы собственных значений, а лучше обратиться к методу снижения размерности путем использования преобразования Карунена—Лоэва (см. раздел «Преобразование Карунена—Лоэва» данной главы).
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void) ( register int i.j;	//	Счетчики
int n = 4.	//	Число объектов
P = 3.	//	Число параметров до сжатия
s = 2,	H	Число параметров после сжатия
Code.	//	Код ошибки
m;	//	Рабочая переменная
double e[] =	//	Значения параметров объектов
318
Глава 6. Методы снижения размерности
{О,1,1,1. // Параметр 1
0,0,0,1.	//	Параметр 2
0.0,1.0}, // Параметр 3
*а:	//	Матрица преобразования
а = new double [р * р]:
Code = Той (е.п.р,s,а):
if C'Code)
cout « "Matrix in transposal view:\n";
for (i =0. m = 0: i < p; i++)
{
for (j = 0: j < s: j++. m++)
cout « setw (10) « a[m]:
cout « endl:
}
}
el se cout « "Error code is " « Code « endl:
delete [] a: }
int Tou (double e[].int n.int p.int s.double a[])
11
II Функция вычисляет матрицу преобразования для сжатия образов // методом минимизации энтропии.
// Обозначения:
// е - матрица размером п х р значений параметров объектов // (параметр 1 для всех объектов, затем параметр 2 для // всех объектов и т.д.).
// п - число объектов,
// р - число параметров до сжатия, // s - число параметров после сжатия.
// а - искомая матрица преобразования, размером s х р.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -1 при недостатке памяти для вычислений.
// -2 при ошибке в вычислениях.
И { register int i.j.k: // Счетчики цикла
int m = 0,ml = 0,m2. // Счетчики
Code = 0:	// Код ошибки
double *с.	//	Ковариационная матрица
*Ь.	//	Полная матрица преобразования
*х,*у,	//	Рабочие массивы
buf:	//	Рабочая переменная
if ((с = new double [р * р]) == 0)
Метод минимизации энтропии
319
return -1;
if ((х = new double [MaximumOf(n.p)]) == 0) {
delete [] c: return -1;
}
if ((У = new double [n]) == 0) {
delete [] c: delete [] x;
return -1;
}
if ((b = new double [p * pj) == 0) {
delete [] c; delete [] x; delete [] y: return -1:
}
/////////////////////////
// Ковариационная матрица for (i = 0: i < p: 1++)
{
for (к = 0; к < n; k++) x[k] = e[ml++];
for (j = 0. m2 = 0: j < p: j++) {
for (к = 0; к < n; k++) y[k] = e[m2++];
///////////////////////////////////// // Деление и умножение для приведения // функции Cov к авторскому варианту c[m++] = Cov (x.y.n) / n * (п - 1);
} }
/////////////////////////////////
// Собственные значения и вектора
Code = Jacobi (с.р.0.000001.&m2.b);
if (!Code)
{
//////////////////////////////////////
// Упорядочивание собственных векторов
// в порядке возрастания собственных значений for (i = 0: i < р; i++)
x[i] = c[i * (p + 1)1:
for (i =0; i < p; i++) {
m2 = i;
buf = x[i]:
for (j = i + 1; j < p; j++) if (buf >= x[j])
320
Глава 6. Методы снижения размерности
{
m2 = j:
buf = х[j];
}
Col Interchange (x,1,1.m2);
Col Interchange (b.p.i,m2); }
///////////////////////////////////
// Выводимая матрица преобразования for (1 = 0. ml = 0; 1 < s; i++)
for (j = 0. m « 1; j < p; j++. m += s) a[m] = b[ml++J;
}
delete [] c; delete [] x; delete [] y; delete [] b;
return Code;
6	}
Преобразование Карунена—Лоэва
Рассмотрим разложение действительной прямоугольной матрицы А размером тп строк на п столбцов, тп > п, по сингулярным числам (подробнее см. раздел «Разложение по сингулярным числам» главы 13). Пусть U — матрица размером тп х и, сформированная из п ортонормированных собственных векторов, соответствующих наибольшим из тп собственных значений матрицы ААТ. Оставим в матрице U только 5 собственных векторов, соответствующих наибольч шим сингулярным числам, s < п. Получим матрицу Us размером тп х s. Теперь сформируем вектор-столбец у размером s такой, что
y=U]x,
где UJ — часть матрицы U, в которой оставлено только $ столбцов, соответствующих наибольшим собственным векторам, х — вектор-столбец длиной тп.
Последнее выражение называют преобразованием Карунена—Лоэва [www-ccrma.stanford.edu/~bosse/proj7node29.html] либо дискретным разложением Карунена—Лоэва [186, с. 297]. Иногда его сравнивают с анализом главных компонент или более широко — с факторным анализом [42, с. 254], рассмотренным в одноименной главе данной книги, однако от факторного анализа преобразование Карунена— Лоэва отличается тем, что в результате его применения не происхо! дит выявления связи между объектами или параметрами.
Преобразование Карунена—Лоэва
321
В нашем случае т — это число параметров, п — число объектов, которые можно было бы назвать обучающими данными, составляющими матрицу А1. Идея метода состоит в том, что вместо использования для распознавания векторов х размером т применяются вектора у размером s < т. Это значительно сокращает требуемый объем вычислений. Матрица Us, применяемая для преобразования, вычисляется только один раз на основании набора исходных данных — матрицы А, после чего вектора х преобразуются и дают на выходе вектора у. Параметры, составляющие вектора г/, не могут применяться для иных целей, кроме целей распознавания, так как фактически представляют собой суперпозиции параметров (именно поэтому рассматриваемый метод называется как преобразованием, так и разложением Карунена—Лоэва — разложением по ортогональным функциям), составляющих векторах, и самостоятельного смысла не имеют. Вычисление матрицы преобразований на основе g некоторой «обучающей» выборки позволило некоторым авторам отнести преобразование Карунена—Лоэва к методам распознавания образов с обучением, однако это не так. Преобразование Карунена— Лоэва является методом сжатия информации.
Укажем примеры применения преобразования Карунена—Лоэва для сжатия распознаваемых образов в различных областях: распознавание транспортных средств [202, с. 216], сжатие акустических сигналов [Bosse Lincoln, «Ап Experimental High Fidelity Perceptual Audio Coder», Project in MUS420 Win97, www-ccrma.stanford.edu/~bosse/ proj/proj.html, Центр компьютерных исследований в музыке и акустике Стэнфордского университета], распознавание трехмерных изображений [S.Golman, A.Zhdanov, «3D object recognition using Karhunen-Loeve expansion», Lab report, www.cs.technion.ac.il/ labs/isl/projects_done/object_recognition/main.html, Лаборатория интеллектуальных систем Израильского технологического института Technion].
Для решения задачи нами применяется функция MatrixMulti-plyMatrix, а для вычисления матрицы преобразования — функция SingularValueDecomposition, реализующая разложение по сингулярным числам и гарантирующая ортонормированность полученных собственных векторов. Пример применения не приводится — решение строится аналогично методу, рассмотреннному в разделе «Метод минимизации энтропии» данной главы.
1 В [ 186, с. 297] в качестве ААТ применяется корреляционная матрица, и задача естественно сводится к выделению ее наибольших собственных значений.
112002
322
Глава 6.
Методы
снижения размерности
Сжатие с помощью трехслойной нейронной сети
Авторами [214] предложен алгоритм сжатия с помощью трехслойной нейронной сети, у которой число элементов входного и выход-
ного слоев одинаково, причем вектор входа в точности равен векто-
ру выхода, а число элементов скрытого слоя значительно меньше, как показано на рис. 6.1. На элементах скрытого слоя возникает пред-
ставление каждого вектора данных, которое намного короче длины оригинала. Сжатый (с помощью слоев 1 и 2) образ может подвергаться экономичной передаче по локальным и глобальным компьютерным сетям. Сжатый образ может быть подвергнут и распоз
наванию, однако новые параметры, составляющие вектор, как
в предыдущих случаях, никакого смысла сами по себе не несут. Вос-
становление образа производится с
помощью второй части
сети
(слои 2 и 3). Единственное отличие от обычной процедуры решения состоит в том, что перед подачей на вход некоторого образа ог
должен быть нормализован (как и в случае распознавания образов),
а после выхода денормализован с использованием сохраненных коэффициентов.
Рис. 6.1. Архитектура нейронной сети для сжатия образов
Дальнейшие исследования
323
Процедуру вычисления коэффициентов нормализации входных данных выполняет функция NormalizeMatrix. Нормализацию и денормализацию можно сделать функцией MatrixMultiplyMatrix.
Для обучения нейронной сети рассмотренной архитектуры может применяться алгоритм, приведенный в главе 9.
Дальнейшие исследования
•	Фрактальное сжатие образов. Материалы по алгоритмам сжатия данных, включая фрактальное сжатие изображений, представлены на сайте www.rasip.fer.hr/research/compress/algorithms/index.htmL
•	Лингвистический анализ изображений, см. также [83].
6
и*
Глава 7. Факторный анализ
Основным объектом исследования методами факторного анализа является корреляционная матрица, построенная с использованием коэффициента корреляционного отношения Пирсона (для количественных признаков). Предлагается также использование других коэффициентов типа корреляции, предназначенных для порядковых, качественных и смешанных признаков, но опыта в этой области пока недостаточно. Некоторые авторы [126], [135, с. 606] предлагают использовать для факторного анализа дисперсионноковариационную матрицу. Основным требованием к построенной 7 матрице является ее положительная полуопределенность. Напомним, что эрмитова матрица называется положительно полуопреде-ленной, если все ее главные миноры неотрицательны. Из данного свойства как раз и следует неотрицательность всех собственных значений. Более подробно положительная полуопеределенность рассмотрена в главе 13.
Методами факторного анализа решаются три основных вида задач:
•	отыскание скрытых, но предполагаемых закономерностей, которые определяются воздействием внутренних или внешних причин на изучаемый процесс;
•	выявление и изучение статистической связи признаков с факторами или главными компонентами;
•	сжатие информации путем описания процесса при помощи общих факторов или главных компонент, число которых меньше количества первоначально взятых признаков (параметров), однако с той или иной степенью точности обеспечивающих воспроизведение корреляционной матрицы.
Следует пояснить, что в факторном анализе понимается под сжатием информации. Дело в том, что корреляционная матрица получа-1 ется путем обработки исходного массива данных. Предполагается,] что та же самая корреляционная матрица может быть получена с использованием тех же объектов, но описанных меньшим числом параметров. Таким образом, якобы присходит уменьшение размерности задачи, хотя на самом деле это не так. Это не сжатие инфор-
Глава 7. Факторный анализ
325
мации в общепринятом смысле — восстановить исходные данные по корреляционной матрице нельзя.
Коэффициенты корреляции, составляющие корреляционную матрицу, по умолчанию вычисляются между параметрами (признаками, тестами), а не между объектами (индивидуумами, лицами), поэтому размерность корреляционной матрицы равна числу параметров. Это так называемая техника R. Однако может быть, например, изучена корреляция между объектами (точнее, их состояниями, описываемыми векторами параметров). Эта методика называется техникой Q. Проведение факторного анализа техникой Q1 обосновано тем, что состояния объектов могут иметь общую побудительную причину (причины), которая (которые) как раз и может быть выявлена с помощью факторного анализа. Существует также техника Р, предполагающая анализ исследований, выполненных на одном и том же индивидууме в различные промежутки времени («объекты» — один и тот же индивидуум в различные промежутки времени), причем изучаются корреляции между состояниями индивидуума. Аналог техники Q для последнего случая составляет предмет исследования техники О.
Применение техники R (Р) или техники Q (О) или выбор техники R (Q) или Р(О) могут быть осуществлены программистом с помощью одних и тех же алгоритмов в пределах одной программы путем простых манипуляций с исходными данными.
Мы рассмотрим три метода факторного анализа: метод главных факторов (если корреляционная матрица не редуцируется — он же метод главных компонент), метод максимального правдоподобия, а также центроидный метод. Иначе метод главных компонент называют просто компонентным анализом. В основе всех методов факторного анализа лежит предположение, что изучаемая зависимость носит линейный характер, хотя высказываются мнения о том, что использование такого предположения ничем не обосновано [147]. Основное требование к исходным данным — это то, что они должны подчиняться многомерному нормальному распределению [126, с. 19]. По крайней мере, должно быть сделано допущение о многомерном нормальном распределении совокупности, однако в [там же, с. 139] высказывается предположение, что из рассмотренных методов факторного анализа центроидный метод весьма устойчив к колебаниям распределения.
Авторы [ 148, с. 179] относят обратный факторный анализ, или факторизацию Q-типа, к методам кластерного анализа.
326
Глава 7. Факторный анализ
Редуцированием корреляционной матрицы называется процесс за-( мены единиц на главной диагонали корреляционной матрицы некоторыми величинами, называемыми общностями. По определению [208], общность — сумма квадратов факторных нагрузок. По [147] общность данной переменной — та часть ее дисперсии, которая обусловлена общими факторами. Это вытекает из предположения, что полная дисперсия складывается из общей дисперсии, обусловленной общими для всех переменных факторами, а также специфичной дисперсии, обусловленной факторами, специфичными только для данной переменной, и дисперсии, обусловленной ошибкой. Мы рассматриваем только методы, оперирующие общностями, не превышающими единицу.
Получение матрицы факторного отображения в принципе является целью факторного анализа. Ее строки представляют собой координаты концов векторов, соответствующих т переменным в г-мерном факторном пространстве. Близость концов этих векторов дает пред-4 7 ставление о взаимной зависимости переменных. Каждый вектор в сжатой, концентрированной форме несет информацию о процессе. Близость этих векторов дает представление о взаимной зависимости переменных. Дополнительно, если число выделенных факторои больше единицы, обычно производится вращение матрицы факторного отображения с целью получения так называемой простой структуры. Мы применяем программу вращения популярным методом VARIMAX [174, с. 90,255], который используется и в других разделах анализа данных.
Для наглядности результаты можно изобразить графически, что, однако, проблематично для трех и более выделенных факторов. Поэтому обычно дают изображение r-мерного факторного простран! ства в двумерных срезах.
В процессе решения задачи факторного анализа нужно быть готовым к тому, что иногда решение получить не удается1. Это вызвано] сложностью решаемой проблемы собственных значений корреляционной матрицы. Например, корреляционная матрица может оказаться вырожденной, что может быть вызвано совпадением или полной линейной корреляцией параметров. Для матриц высокого порядка может произойти потеря значимости в процессе вычислений. Поэтому теоретически нельзя исключить ситуацию, когда методы факторного анализа, к сожалению, окажутся неприменимы, по
1 Замечание данного абзаца в большей степени относится к методу максимума правдоподобия, в схеме которого фигурирует матрица, обратная корреляционной.
Метод главных факторов
327
крайней мере до тех пор, пока исходные данные не удастся «исправить». Исправлены данные могут быть следующим образом. Выявите линейно зависимые параметры с помощью, например, метода корреляционных плеяд (возможно применение и других методов) и оставьте в исходных данных только один из группы линейно зависимых параметров.
Применяемый для определения собственных значений метод Якоби дает решение и в случае вырожденности корреляционной матрицы. При этом часть собственных значений, равная разности порядка матрицы и ее ранга, будет нулевой в вычислительном смысле, что делает метод главных факторов более устойчивым к «нехорошим» данным, чем метод максимума правдоподобия. Однако метод главных факторов уступает методу максимума правдоподобия в том, что он не позволяет получить точной оценки общности и добиться таким образом полной воспроизводимости корреляционной матрицы.
Метод главных факторов
Рассмотрим подробнее метод главных компонент — вариант метода главных факторов, а затем сам метод главных факторов.
Основная модель метода главных компонент записывается в матричном виде следующим образом:
Z = AP,
где Z — матрица стандартизованных исходных данных,
А — факторное отображение,
Р — матрица значений факторов.
Матрица Z имеет размер т х и, матрица А имеет размер т х г, матрица Р имеет размер г х и, где
т — количество переменных (векторов данных),
п — количество индивидуумов (элементов одного вектора), г — количество выделенных факторов.
Как видно из приведенного выше выражения, модель компонентного анализа содержит только общие для имеющихся векторов факторы.
Матрица стандартизованных исходных данных определяется из матрицы исходных данных Y (ее размер т х и) по формуле
328
Глава 7. Факторный анализ
г_ _ % У?, i _ j, 2.mJ = jt 2,.... п,	I
где у1} — элемент матрицы исходных данных,
— среднее значение,
s — стандартное отклонение.
Для вычисления корреляционной матрицы — основного элемента факторного анализа — имеет место простое соотношение
—ZZ’=R, п-1
где R — корреляционная матрица; она имеет размер т х т, ' — символ транспонирования.
7 На главной диагонали матрицы R стоят значения, равные 1. Эти значения называются общностями и обозначаются как №, являясь мерой полной дисперсии переменной. Для метода главных факторов, рассматриваемого ниже, общности отличны от 1 и вычисляются определенным образом.
Неизвестными являются матрицы Л и Р. Матрица Л может быть найдена из основной теоремы факторного анализа
R = ACA\
где С — корреляционная матрица, отражающая связь между факторами.
Если С = I, то говорят об ортогональных факторах, если С * I, говорят о косоугольных факторах. Здесь I — единичная матрица.
Для матрицы С справедливо соотношение
—РР'=С-п-1
Нами рассматривается только случай ортогональных факторов, для которых
R = ЛЛ'.
Модель классического факторного анализа содержит ряд общих фак-| торов и по одному характерному фактору на каждую переменную.
Метод главных факторов
329
Первая из приведенных в разделе формул является основной моделью факторного анализа для метода главных компонент. Число главных компонент всегда меньше либо равно числу переменных.
Для метода главных факторов основная модель записывается в виде
Z = FP+,
где F — полная факторная матрица,
Р+ — матрица значений факторов, включая значения характерных факторов.
Матрица Z имеет размер тпхп, матрица F имеет размер тп х (г + ти), матрица Р* имеет размер (г + тп) х п. Матрица F может быть представлена в виде суммы двух матриц
F = А + U,
где Л — матрица нагрузок общих факторов, U — матрица нагрузок характерных факторов.
Очевидно, что матрицы А и U имеют размерность матрицы F. Матрица А (а именно ее часть размером тп х г, остальная же ее часть размером тп х тп является нулевой) понимается как матрица факторного отображения.
Полная дисперсия переменной складывается из общности h*, значение которой меньше либо равно 1 и означает часть полной дисперсии переменной, приходящейся на главные факторы, и характерности, обозначаемой как «,2, приходящейся на характерные факторы. Следовательно,
ц2=1-^-
Часть (размером тп х г) матрицы U является нулевой, остальная ее часть (размером тп х тп) представляет собой диагональную матрицу с квадратными корнями из характерностей на главной диагонали, которые уже вычислены из общностей. Таким образом, может быть определена матрица [/, а следовательно, и матрица F, если известна матрица А.
Используя введенную выше основную теорему для случая ортогональных факторов, можно записать
R = FF'.
330
Глава 7. Факторный анализ
Развернув выражение, получим:
R = Rh + U2,
где R — корреляционная матрица с единицами на главной диагонали, Rh — корреляционная матрица с общностями на главной диагонали, определяемая выражением
Rh = AA',
U2 означает UU'.
Исходные коды и пример применения
#include <fstream.h>
#include <iomaniр.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
char *ReduceName[] =	{"нет редукции (главные компоненты)\п“, "способ наибольшей корреляцииХп", "коэффициент множественной корреляцииХп". "средние коэффициенты корреляцииХп ", "метод триадХп"}:
register int i.j.il;	// Счетчики
int Code, Commonality = 4, n = 17. k = 12. m. Factor = 4;	// Код ошибки // Код оценки общности // Число объектов // Число параметров // Вычисленное количество факторов // Заданное пользователем число факторов
double z[] = {	// Исходные данные
9.1.9.2.6.6.6.5.8.6,4.7.7.9,4.9.4.0.5.1.4.0.5.3,6.0.8.5.4.2.8.0.10.9, 33.29.29,27,27.17,23,27.32,21,27,24.20,30.21.26,24, 0.44.1.54.0.82.0.63.0.78,0.15,0.42,0.43,0.7.0.51,0.3,0.43,0.41.1,0.5,1.1.1.2. 23.58.43.36.34.19.23.26.54.51,24.34,34.40.57.50.45.
0.48.0.96.0.59.0.51,0.62.0.5,0.4,0.63,0.58,0.43,0.4.0.47.0.37,0.9.0.37,0.85.1.1, 25,36.31,29,27.63.21,38,46,40,38,37.31,34,42.41,41,
0.03,0.08,0.06,0.05,0.07,0.024,0.05,0.05.0.02,0.03,0.02,0.04,0.04.0.1,0.053,0.1,0.05, 2.3,3,3,3,3.3,3,2,3.2,3,3,4.6,5.2.
1.55.1.2.3.4,3.8.1.6,7.0.1.4,1.0,1.05,2.3,3.5.6.0,1.1,0.98,1.6.2.3,5.9, 0.78.0.62,1.08,1.92,0.61,1.6.1.0.1.44.1.44.4.8,2.0.4.4.1.28.0.96,0.68,0.72.1.04, 9.2.7.4.12.12.6.6.72,16.0.15.6.11.2,8.4,9.4.9.6,8.8.9.2.11.6.10,13.6.11.2, 80.90.81.78.88.88,82.78.127.87.83.80,95.81.89.81.63}.
Метод главных факторов
331
*datal, *data2, *t. *s. buf:	// Корреляционная матрица // Редуцированная корреляционная матрица // Матрица факторного отображения // Дисперсии // Рабочая переменная
datal = new double [k	* к]:
data2 = new double [k	* к]:
t = new double [k * k]: s = new double EkJ:	
////////////////////////////////////
// Вычисление корреляционной матрицы
if (!LikenessForCorrelation (z.datal.n.k.O))
{
cout « "Корреляционная матрица\п";
for (i = O.il = 0; i < k: i++) { for (j = 0: j < k: j++.il++) cout << setw (10) « datalfil]: cout « endl:
}
//////////////////////////////////
// Редукция корреляционной матрицы
if (!(Code = Reduction (datal,data2,k,Commonality))) {
cout << "Метод оценки общности: " « ReduceName[Communality]:
if (Commonality != 0) {
cout << "Оценки общности:\n";
for (i = O.il = 0; i < k; i++,il += k + 1)
cout « (i + 1) « " = " « data2[il] « endl: }
///////////////////
// Факторный анализ
if (!(Code = PrincipalFactor (data2,k.t.&m)))
{
cout « "Число выделенных факторов " « m « endl:
/////////////////////////////////////////////////// // Коррекция числа факторов по желанию пользователя if (0 < Factor && Factor < m)
{
m = Factor:
cout « "Заданное число факторов " « m « endl: }
//////////////////////////////////////// // Оценка выделенной факторами дисперсии
332
Глава 7. Факторный анализ
PercentOfVariance (data2.k.t.s.m): cout « "Выделенные дисперсии:\n"; for (i = O.buf =0: i < m; i++) {
buf += s[i] ; cout « setw (3) « (i + 1) « " = "
« setw (8) « s[i] « "X. всего = " « buf « "X\n"l }
///////////////////////////////// // Матрица факторного отображения cout « "Матрица факторного отображенияХп": for (i = 0; i < k; i++)
for (j = 0.11 = i; j < m; j++,il += k) cout « setw (14) << t[il];
cout « endl; }
////////////////////
□к	// Варимакс-вращение
7	if (m > 2)
F {
cout « "Повернутая матрица факторного " « "отображенияХп";
if (IVarimax (t.k.m)) { for (i = 0; i < k; i++) {
for (j = O.il = i; j < m: j++.il += k) cout « setw (14) « t[il];
cout « endl; }
} el se cout « "Мало памятиХп";
} } else if (Code == -1) cout << "Мало памятиХп"; el se
cout « "Ошибка при вычисленииХп";
}
else if (Code == -1) cout « "Мало памятиХп";
el se
cout « "Ошибка при редукцииХп";
} el se cout « "Мало памятиХп";
delete [] datal; delete [] data2; delete [] t; delete [] s; }
Метод главных факторов
333
int PrincipalFactor (double z[],int k.double r[],int *m) //
// Функция производит факторный анализ методом главных факторов. // Обозначения:
//	z - корреляционная матрица,
//	к - порядок корреляционной матрицы,
// г - матрица факторного отображения размером не менее к * к.
// *т - число факторов.
// Возвращаемое значение:
//	0 при нормальном окончании счета,
// -1 при недостатке памяти для рабочих массивов.
// -2 при ошибке в вычислениях.
//
{
register int	i.j:	//	Счетчики
int ml,m2,Code;	//	Вспомогательная	переменная
double *zl,	//	Рабочая копия	корреляционной матрицы
save;	//	Буфер
*m = 0:
if ((zl = new double[k * k]) == 0) return -1;
///////////////////////////////////////
// Рабочая копия корреляционной матрицы ArrayToArray (z.zl.k * k);
////////////////////////////
// Решение проблемы факторов
if ((Code = Jacobi (zl.k.O.000001,&ml,r)) != 0)
{
delete [] zl;
return Code:
}
/////////////////////////////////////////////////
// Упорядочивание собственных значений и векторов
for (i = 1; i < k: i++)
zl[i] = zl[i * (k + 1)]; // Первый столбец -// собственные значения
for (i =0; i < k: i++) {
Code = i:
save = zl[i];
for (j = i +1: j < k: j++) if (save < zl[jj)
{
Code = j: save = zl[j]; }
334
Глава 7. Факторный анализ
Col Interchange (zl.1,1.Code);
Col Interchange (r.k,i.Code);
}
/////////////////////////////
// Отбор собственных значений
for (i = 0, ml = 0: i < k; 1++)
if (zl[i] < 0) break;
el se
{
(*m)++:
//////////////////////////////////////////// // Вычисление матрицы факторного отображения save = sqrt Czl[i]);
for (j = 0: j < k: j++. ml++) r[ml] *= save:
}
delete [] zl:
return 0:
}
Проблема общности
Для метода главных факторов имеет место проблема общности, то-есть на главной диагонали корреляционной матрицы, в отличие от метода главных компонент, необходимо проставить значения общностей, чтобы получить корреляционную матрицу Rh. Процесс оценки общностей в методе главных факторов называется редукцией корреляционной матрицы. Без редукции, то есть с единицами на главной диагонали корреляционной матрицы, мы получаем широко известный компонентный анализ (метод главных компонент). Были опробованы четыре способа оценки общностей:
•	способ наибольшей корреляции;
•	коэффициент множественной корреляции, при этом общности вычисляются с помощью выражения
где в знаменателе стоит диагональный элемент матрицы, обратной к матрице^. Этот метод, однако, осложняется тем фактом, что, как показывает наш опыт расчетов, полученная в результате редукции]
Метод главных факторов
335
корреляционная матрица обычно не является матрицей Грама. Замена же диагональных членов оценками общностей считается допустимой, только если сохраняются свойства матрицы Грама;
• средние по столбцу корреляционной матрицы коэффициенты корреляции;
• метод триад.
Пример применения
int Reduction (double z[], double r[],int k.int Mode) //
// Функция производит редукцию корреляционной матрицы.
// Обозначения:
//	z - корреляционная матрица,
//	г - редуцированная корреляционная матрица,
// к - размерность корреляционной матрицы,
// Mode - метод вычисления общностей:
//	=	0	-	анализ главных компонент,
//	=	1	-	способ наибольшей корреляции,
//	= 2 - коэффициент множественной корреляции,
//	=	3	-	средние коэффициенты корреляции,
//	=	4	-	метод триад.
И Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -1 при недостатке памяти,
// -2 при ошибке в параметрах, например к >= 3 для метода триад.
//
{
register int i.j;	//	Счетчики
int m,ml,kl,k2;	//	Счетчики одномерного массива
double *t,	//	Вспомогательный	массив
s.sl,s2;	//	Вспомогательные	переменные
if (Ct = new doublefk * k]) == 0) return -1;
///////////////////////////////
// Копия корреляционной матрицы
ArrayToArray (z.r.k * k):
////////////////////////
// Определение общностей
switch (Mode)
{
case 0:
//////////////////////////////////////////
// Нет редукции - анализ главных компонент break;
336
Глава 7. Факторный анализ
case 1:
///////////////////////////////
// Способ наибольшей корреляции
for (i = 0, m = 0, ml = 0: i < k; 1++) {
for (j = 0; j < к; j++, m++)
t[j] = i == j ? 0 : fabs (z[mj);
r[ml] = MaximumOf (t,k);
ml += к + 1;
}
break;
case 2:
///////////////////////////////////////
// Коэффициент множественной корреляции
if (InverseMatrix (r.t.k) == 0)
for (i = 0, m = 0; i < k; i++,m+= к + 1)
if (t [m] != 0 || t[m] != 1) r[m] = 1 - 1 / t[m];
break;
case 3:
//////////////////////////////////
11 Средние коэффициенты корреляции
for (i = 0, m = 0. ml = 0; i < k; i++,ml += k + 1) {
for (j = 0. r[ml] =0; j < k; j++, m++) r[ml] += i == j ? 0 : fabs (z[m]);
r[ml] /= k - 1;
}
break;
default:
//////////////
// Метод триад
if (k < 3)
{
delete [] t;
return -2;
}
for (i = 0, m = 0. ml = 0; i < k; i++,ml += k + 1) {
//////////////////////////////////
// Поиск двух наксинумов в столбце
for (j = 0; j < k; j++) t[j] = fabs (z[m++J);
t[i] = 0;
si = MaximumOf (t,k.&kl);
t[kl] = 0;
s2 = MaximumOf (t,k,&k2);
///////////////////////////////////////////// // Корреляция между максимальными параметрами s = fabs (z[kl + k2 * k]);
Метод главных факторов
337
if (s != 0) r[ml] = si * s2 / S;
}
}
delete [] t:
return 0:
}
Проблема факторов
Матрица факторного отображения определяется для компонентного анализа или для метода главных факторов методом множителей Лагранжа (максимизация функции, связанная с дополнительными условиями) из решения проблемы собственных значений матрицы R или Rh. Для простоты записи значок h далее опускаем, имея в виду R или Rh в зависимости от применяемой разновидности метода факторного анализа.
Факторы пропорциональны собственным векторам матрицы R. Стандартная проблема собственных значений матрицы R записывается в виде:
(Я-Л/) = 0,
где Л/, I = 1,2,..., т — Z-e собственное значение матрицы R,
ар I =1, 2, .... т — соответствующий Z-му собственному значению собственный вектор,
I — номер собственного значения.
Задача упрощается тем, что матрица R является действительной и симметрической, поэтому для решения проблемы собственных значений применимы эффективные устойчивые алгоритмы.
Измерение факторов
Оценка значений факторов (так называемое измерение факторов) не является необходимой для интерпретации результатов процедурой. Остановимся на ней для полноты изложения.
Способ измерения главных компонент основан на применении основной модели факторного анализа:
Z = АР.
338
Глава 7. Факторный анализ
Умножив обе части равенства на А', а затем на (А'А)", получим
Р = A+Z,
где А+ — матрица, определяемая по формуле
А+ =(А'А)~А'.
Способ измерения главных факторов основан на иных теоретических предпосылках — множественном регрессионном анализе — и нами не рассматривается.
Анализу главных компонент уделено внимание в [ 183, с. 260]. С методикой применения метода главных компонент и метода главных факторов в рамках стандартных пакетов программ можно ознакомиться по [78, с. 162].
Метод максимума правдоподобия
В методе максимума правдоподобия (максимального правдоподобия) оценка общностей до непосредственного применения алгоритма факторного анализа не производится. Общности находятся в результате вычислений из условия полной воспроизводимости корреляционной матрицы. В этом заключается основное преимущество метода максимума правдоподобия перед методом главных факторов. Соответственно, бессмысленно применение различных критериев выделения значащих факторов, описанных в ряде источников и якобы основанных на сопоставлении оценки воспроизведенной корреляционной матрицы и исходной корреляционной матрицы. При любом количестве выделенных факторов корреляционная матрица воспроизводится полностью, с точностью до ошибки вычислений.
Программой выдаются оценки общностей, вычисленные из условия полной воспроизводимости корреляционной матрицы. Если задать число факторов равным числу параметров, то оценки общности будут совпадать с общностями нередуцированной корреляционной матрицы, то есть будут равны единице. Максимальное число удерживаемых факторов можно приблизительно установить из анализа процента дисперсии, выдаваемой программой для каждого фактора. Основной недостаток метода — неустойчивость к «нехорошим» данным, например к данным, содержащим совпадающие или линейно зависимые вектора. С точки зрения многомерной статистики
Метод максимума правдоподобия
339
(в широком смысле) проблема заключается в том, что в данном случае, даже если исходные данные показывают многомерное нормальное распределение, оно будет вырожденным [63, с. 60]. С точки зрения факторного анализа (в узком смысле) будет вырожденной матрица характерностей. Вряд ли можно избежать численной неустойчивости в данном случае. Если же это произошло, воспользуйтесь методом главных факторов либо одним из способов выделения и последующего исключения из рассмотрения линейно зависимых параметров.
Описание метода и примеры применения см. в [208, с. 237], [209].
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include "megastat.h"
void main (void)
{
register int i.j.il: // Счетчики
int Code,	//	Код ошибки
n = 17,	H	Число объектов
k = 12,	H	Число параметров
m.	//	Вычисленное количество факторов
Factor = 4:	//	Заданное пользователем число факторов
double z[] = {	// Исходные данные
9.1,9.2.6.6.6.5.8.6.4.7,7.9.4.9,4.0.5.1.4.0.5.3.6.0.8.5.4.2.8.0,10.9, 33,29,29.27.27,17.23,27,32,21.27.24,20,30,21,26,24,
0.44,1.54.0.82,0.63,0.78.0.15.0.42,0.43.0.7,0.51,0.3.0.43.0.41,1.0.5.1.1,1.2. 23.58.43.36,34.19.23.26,54.51.24.34,34.40,57.50.45.
0.48,0.96.0.59.0.51,0.62,0.5,0.4,0.63.0.58.0.43,0.4,0.47,0.37.0.9,0.37,0.85,1.1, 25.36.31.29.27.63,21,38.46,40.38,37.31,34.42,41.41.
0.03.0.08.0.06,0.05,0.07.0.024.0.05.0.05.0.02.0.03.0.02,0.04,0.04,0.1.0.053,0.1,0.05.
2.3.3.3,3,3.3,3,2,3,2.3,3,4,6,5.2.
1.55,1.2,3.4.3.8,1.6,7.0.1.4.1.0,1.05.2.3.3.5.6.0.1.1.0.98.1.6,2.3.5.9, 0.78.0.62,1.08.1.92.0.61.1.6.1.0.1.44.1.44,4.8.2.0,4.4.1.28.0.96,0.68,0.72.1.04. 9.2.7.4,12.12.6.6.72.16.0.15.6,11.2.8.4.9.4.9.6,8.8.9.2,11.6.10,13.6.11.2. 80.90,81.78.88.88,82.78.127.87,83,80.95,81,89,81.63},
*datal,	// Корреляционная матрица, затем
// редуцированная корреляционная матрица
*t.	//	Матрица факторного	отображения
*s,	//	Дисперсии
buf:	//	Рабочая переменная
datal = new double [k * k];
340
Глава 7. Факторный анализ
t = new double [k * k];
s = new double [k];
////////////////////////////////////
11 Вычисление корреляционной натрицы
if (ILikenessForCorrelation (z.datal.n.k.O))
{
cout « "Корреляционная натрица\п";
for (1=0,11=0; 1 < k; 1++)
{
for (j = 0; j < k; j++,il++) cout « setw (10) « datal[il];
cout « endl;
}
if (KCode = MaximumLikelihood (datal.k.t.s.Factor,&m)))
{
///////////////////////
II Вычисленные общности cout « "Оценки общности:\n"; for (1=0: 1 < k; 1++ ) cout « (1 + 1) « " = " « s[i] « endl;
//////////////////////////////////////// // Редуцированная корреляционная натрица for (1 = 0.11 = 0; 1 < k: 1++.11 += k + 1) datal[il] = s[1]:
//////////////////////////////////////// // Оценка выделенной факторами дисперсии PercentOfVariance (datal.k.t.s.m): cout << "Выделенные дисперсии:\n";
for (1 = 0. buf =0; 1 < m; 1++ )
{
buf += s[1];
cout « setw (3) « (1 + 1) « " = " « setw (8) « s[i] « "X, всего = " « buf « "X\n";
}
/////////////////////////////////
// Матрица факторного отображения
cout « "Матрица факторного отбраженияХп";
for (1=0; 1 < k; 1++)
{
for (j = 0,11 = 1; j < m; J++.11 += k) cout « setw (14) « t[il];
cout « endl;
}
////////////////////
// Варимакс-вращение
if (m > 2)
Метод максимума правдоподобия
341
{
if (’Varimax (t.k.m)) {
cout « "Повернутая матрица факторного "
« "отбраженияХп":
for (i =0: 1 < k; i++) {
for (j = 0,11 = i; j < m: j++, il += k) cout « setw (14) « t[il];
cout « endl:
} } el se
cout « "Мало панятиХп":
}
}
else if (Code == -1)
cout « "Мало панятиХп":
el se
cout « "Ошибка в вычисленияхХп":
}
el se
cout « "Мало панятиХп":
delete [] datal: delete [] t: delete [] s: }
int MaximumLikelihood (double z[],int k.double r[],double b[J.int mz,int *ms) //
// Функция производит факторный анализ нетодон наксинуна
// правдоподобия.
// Обозначения:
// z - нередуцированная корреляционная натрица, // к - разнер корреляционной патрицы.
//	г - натрица факторного отображения разнерон не ненее к * к,
//	b - вычисленный вектор общностей.
// mz - заданное число факторов.
// *ms - вычисленное число факторов.
// Принечание:
// если заданное число факторов велико, оно корректируется.
// Возвращаеное значение:
//	0 при норнальнон окончании счета,
// -1 при недостатке памяти для рабочих массивов,
// -2 при ошибке в вычислениях.
И
{
register int i: //	Счетчик цикла
int	m.	//	Число факторов
Code,	//	Код ошибки
ml:	//	Счетчик одномерного массива
342
Глава 7. Факторный анализ
double *a,*am,	// Факторная матрица
*d,*dm,	// Матрица характерностей и обратная ей
*t.	// Вспомогательная матрица
buf;	// Сумма для проверки сходимости
/////////////////////////////////
// Вычисление m главных компонент
if ((Code = Principal Factor (z,k,r.&m)) ’= 0) return Code;
if ((a = new doublefk * k]) == 0) return -1;
if ((am = new double[k * kJ) == 0)
{ delete [] a; return -1;
}
if ((d = new double[k * kJ) == 0)
{ delete [] a; delete [] am; return -1;
}
if ((dm = new double[k * k]) == 0)
{
delete [] a; delete [] d; delete [] am;
return -1;
}
if ((t = new double[k * k]) == 0)
{
delete [] a; delete [] d; delete [] dm; delete [] am; return -1;
}
///////////////////////////////
// Корректировка числа факторов
if (mz < m && mz > 0)
{
// Заданное количество факторов
*ms = mz; m = mz;
}
el se
// Вычисленное количество факторов
*ms = m;
FillUp (b,k.l);
//////////////////////////////////////////////
// Начало итераций - матрица главных компонент ArrayToArray (r.am.k * m);
do
Метод максимума правдоподобия
343
{
/////////////////////////////////////////
// Матрица А для следующего шага итераций
// Здесь а - матрица A(i - 1/2), как альтернативу
// можно применить функцию ArrayToArray
for (i = 0: i < k * m: i++) a[i] = am[i];
//////////////////////////////// // Определение матрицы общностей MatrixMultiplyMatrixT (a.a.d.k.m.k);
for (i = 0, ml = 0; i < k; i++, ml += k + 1) {
//////////////////////////////
// Вектор общностей для вывода b[i] = d[ml]:
/////////////////////////// // Матрица характерностей D d[ml] = 1 - d[ml];
}
//////////////////////////////////////////////////
// Определение обратной матрицы характерностей DM
if ((Code = InverseMatrix (d.dm.k)) ! = 0) {
delete [] d; delete [] t: delete [] dm: delete [] am;
delete [] a: return Code: }
/////////////////////////////////
// Определение матрицы J(i - 1/2)
// Здесь d - матрица J(i - 1/2)
MatrixTMultiplyMatrix (a,dm,t,m,k,k);
MatrixMultipiyMatrix (t.a,d,m,k,m):
///////////////////////////////////////////////////////// // Вращение матрицы J(i - 1/2) - определение матрицы J(i) // Здесь t - матрица вращения Q
// d - матрица J(i)
if ((Code = Jacobi (d.m.O.000001,&ml,t)) != 0) {
delete [] d; delete [] t; delete [] dm: delete [] am: delete [] a:
return Code;
}
///////////////////////////////////// // Определение факторной матрицы A(i)
344
Глава 7. Факторный анализ
MatrixMultiplyMatrix (a.t.r.k.m.m);
////////////////////////////////////
// Определение обратной матрицы J(1)
// Здесь t - обратная матрица J(i)
if ((Code = InverseMatrix (d.t.m)) != 0)
{
delete [] d; delete [] t; delete [] dm; delete [] am;
delete [] a:
return Code;
}
/////////////////////////////////
// Определение матрицы A(i + 1/2)
// Здесь am - матрица A(i + 1/2)
MatrixMultiplyMatrix (z.dm.am.k.k.k);
for (i = 0, ml = 0; i < k; i++, ml += k + 1)
am[ml] -= 1:
MatrixMultiplyMatrix (am.r.d.k.k.m);
MatrixMultiplyMatrix (d,t.am.k.m,m);
////////////////////////////
// Условие окончания расчета
for (i = 0, buf =0; i < k * m; i++)
buf += fabs (am[il - a[i]);
} while (buf < 0.001);
delete [] d; delete [] t; delete [] dm; delete [] am;
delete [] a;
return 0;
}
Центроидный метод
Браверманом [цит. по 208, с. 194] показано, что в методах главных факторов и главных компонент максимизируется квадратичный критерий. В центроидном методе (методе центра тяжести) максими! зируется модульный критерий. С точки зрения смысловой интерпретации эти критерии эквивалентны. Поэтому утверждения некоторых авторов о том, что центроидный метод является приближенным (очевидно, имеется в виду степень приближения к истине, ибо приближенными в математическом смысле являются все рассмотренные нами методы факторного анализа), что центроидный метод име j ет лишь историческое значение и т. п., не являются оправданными. Описание идеи метода и примеры применения даны в [208, с. 188],
Центроидный метод
345
[126, с. 38], [147, с. 67], причем в [126, с. 139] высказывается предположение об устойчивости центроидного метода (как непараметрического) к колебаниям распределения.
Схемы расчета, данные различными авторами, идентичны во всем, кроме так называемой операции отражения. Так, отражению (см. исходные коды) подвергаются переменные, имеющие наибольшее число отрицательных значений, или только одна из таких переменных [126, с. 43], либо первой одна из переменных, имеющая наибольшее число минусов [208, с. 196], а затем следующая переменная с наибольшим числом минусов и т. д., либо первой — переменная с номером столбца, имеющего максимальную отрицательную сумму [147, с. 76], затем все остальные переменные с отрицательными суммами столбца. Мы просчитали тестовые примеры, приведенные разными авторами, и оказалось, что результаты расчетов нашей программой практически совпадают с результатами, приводимыми авторами, причем мы использовали методику, предложенную в [126, с. 43].
Далее остановимся на методах определения требуемого числа выделяемых факторов. Тэрстоун [147, с. 82] дает формулу определения минимального числа переменных п, необходимых для однозначного определения т факторов. Из формулы Тэрстоуна следует, что
2п +1 - х/втГ+Т т =--------------
В [126, с. 44] приводится правило, ограничивающее число факторов (в тех же обозначениях):
(п + т) < (п - т)2.
Исходные коды и пример применения
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include '‘megastat.h"
void main (void)
{
register int i.j; // Счетчики цикла
int n = 6.
P = 3. m.
Code:
// Размерность корреляционной матрицы
// Число выделяемых факторов
// Счетчик одномерного массива
// Код ошибки
346
Глава 7. Факторный анализ
double а[] =	// Исходная корреляционная матрица
{1.000,0.299,0.400.0.297.0.116,0.232.
0.299,1.000.0.568.0.534,0.432.0.154.
0.400,0.568.1.000.0.487.0.436.0.071.
0.297.0.534.0.487.1.000.0.545.0.092.
0.116.0.432.0.436.0.545.1.000.0.016.
0.232.0.154.0.071.0.092.0.016.1.000}.
*с.	// Матрица факторного отбражения
s:	// Рабочая переменная
с = new double[n * р];
cout « "Original correlation matrix\n";
for (i = 0, m = 0; 1 < n; i++)
{
for (j = 0; j < n: j++. m++) cout « setw (10) « a[m]:
cout « endl;
}
Code = Thurstone (a.n.c.p);
cout « "Return code is " « Code « endl:
if (!Code)
{
cout « "Factor loading matrix\n";
for (i = 0. m = 0; 1 < p; i++)
{
for (j « 0; j < n: j++. m++)
cout « setw (10) « c[m]:
cout « endl:
}
cout « "Variances\n";
for (i = 0. m = 0; i < n; i++)
{
for (j = 0. m = i. s = 0; j < p; j++. m += n) s += c[m] * c[mj;
cout « setw (10) « s:
}
cout « endl:
}
delete [] c:
}
int Thurstone (double a[],int n.double c[],int p)
II
II Функция выполняет факторный анализ центроиднын методом.
// Обозначения:
// а - корреляционная матрица,
// п - порядок корреляционной матрицы.
// с - матрица факторного отображения размером не менее п х р.
Центроидный метод
347
// р - заданное число факторов.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -1 при недостатке памяти для вычислений.
И
register int i.j.k: // Счетчики цикла
int m, mg = 0. *sign. 1. Code = 0;	// Рабочий индекс // Счетчик матрицы факторного отбражения // Массив информации о перемене знаков // Счетчик отрицательных знаков столбца	
	И	Возвращаемое значение
double *r.	И	Редуцированнная корреляционная матрица
*rl.	И	Матрица остаточных корреляций
*b.	И	Массив сумм элементов столбцов
s:	//	Итоговая сумма
if ((г = new doublefn * nJ) == 0) return -1;
if ((rl = new doublefn * nJ) == 0) {
delete [] r:
return -1:
}
if ((b = new doublefn]) == 0)
{
delete [] r: delete [] rl: return -1;
}
if ((sign = new int[n]) == 0)
{
delete [] r; delete [] rl: delete [] b: return -1;
}
//////////////////////////////////// // Начальные значения массива знаков FillUp (sign.n.l);
//////////////////////////////////////// // Копия исходной корреляционной матрицы ArrayToArray (a.rl.n * п);
//////////////////////////
// Цикл выделения факторов
for (к = 0: к < р: к++)
{
///////////////////////////////////////// // Редукция матрицы остаточных корреляций if (Reduction (rl.r.n.l) != 0)
348
Глава 7. Факторный анализ
{
Code = -1;
break;
}
////////////////////////////////////
// Суммы столбцов матрицы корреляций
for (1 = 0, ш = 0; 1 < п; 1++)
for (j = 0, b[i] = 0; j < n; j++) b[i] += r[m++];
s = sqrt (VectorSum (b.n));
for (1=0; 1 < n; 1++)
{
/////////////////////////////// // Нагрузки на текущий центроид b[i] /= s * sign[i];
/////////////////////////////////////////////// // Заполнение матрицы факторного отображения c[mg++] = b[i];
}
////////////////////////////////
// Матрица остаточных корреляций
for (1 = 0, m = 0; 1 < п; 1++)
for (j = 0; j < n; j++) r[m++] -= b[i] * b[j];
llllllllllllllllllllllllllllllllllllllllllllll
II Анализ знаков матрицы остаточных корреляций
FillUp (sign.n.0);
for (1=0; 1 < n; 1++)
for (j = 1, m = 1 * n + 1: j < n; j++)
if (Sign (r[m++]) == -1) sign[j]++;
for (1=0; 1 < n; 1++)
sign[i] = sign[i] >= n / 2 ? -1 : 1;
/////////////////////////////////////
// Перемена знаков матрицы остаточных корреляций
for (1=0, m = 0; 1 < n; 1++)
for (j = 0; j < n; j++, m++)
rl[m] = (sign[i] == -1 && sign[j] != -1) ||
(sign[j] == -1 && signal J != -1) ? -r[m] : r[m]; }
delete [] r: delete [] rl; delete [] b: delete [] sign;
return Code;
}
Проблема вращения
349
Проблема вращения
Оси координат, соответствующие выделенным факторам, ортогональны, и их направления устанавливаются последовательно, по максимуму оставшейся дисперсии. Но полученные таким образом координатные оси большей частью содержательно не интерпретируются. Поэтому получают более предпочтительное положение системы координат путем вращения этой системы вокруг ее начала. Пространственная конфигурация векторов в результате применения этой процедуры остается неизменной. Целью вращения является нахождение одной из возможных систем координат для получения так называемой простой факторной структуры. Мы применяем популярный метод вращения VARIMAX [174, с. 90,255]. Применяемая в схеме метода операция нормализации обсуждается в разделе «Нейронная сеть прямого распространения» главы 9. Обратная операция называется денормализацией.
Подробное обсуждение проблемы см. в [ПО, с. 184], [126, с. 68],	(
[208, с. 326].
Исходные коды
int Varimax (double г[].int k.int m) //
// Функция производит варинакс-вращение матрицы факторного // отображения.
// Обозначения:
//	г - матрица факторного отображения размером к * т.
//	к - размерность корреляционной матрицы, к > 2.
// m - число факторов.
// Возвращаемое значение:
//	0 при нормальном окончании счета.
// -1 при недостатке памяти для рабочих массивов.
//
{
register int i.j.JI: // Счетчики цикла
int ml.m2,m3.m4:	//	Счетчик одномерного массива
double *x.	//	Вращаемая пара векторов
*y.	//	Повернутая пара векторов
*h.	//	Суммарная нагрузка
u, V.	//	Вспомогательные переменные
A.B.C.D. vc = O.vcl,	// Величина для проверки окончания процедуры	
num.	//	Числитель и знаменатель
cs[4]:	И	Матрица вращения
if ((h = new double[k])
0)
350
Глава 7. Факторный анализ
return -1;
//////////////////////////////////
// Нормализация факторных нагрузок
for (1 = 0; i < k: 1++)
for (j = 0. h[i] = 0, ml = i; j < m; j++, ml += k) h[i] += r[ml] * r[ml];
h[1] = sqrt (h[ij);
}
for (i = 0,ml = 0; i < m: i++)
for (j = 0; j < k; j++) r[ml++] /= h[jj;
If C(x = new double[k * 2]) == 0)
{ delete [] h; return -1:
}
if ((y = new double[k * 2]) == 0) {
delete [] x;
return -1;
}
do {
vcl = vc;
////////////////
// Цикл вращения
for (1 =0; i < m - 1; 1++) {
for (j = i + l,m3 = j * k,m4 = m3; j < m; j++) {
III III ШН
II Вектор x
for (jl = 0,ml = i * k,m2 = ml: jl < k; jl++) xC jl] = r[ml++];
///////////
// Вектор у
for (jl = k: jl < k + k; jl++) x[jl] = r[m3++]:
///////////////////////////////////// // Вычисление вспомогательных величин for (jl = 0.A = 0.B = 0.C = 0.D = 0; jl < k: jl++)
{
u = x[jl] * x[jl] - x[jl + k] * x[jl + k]:
v = 2 * x[jl] * x[jl + k]:
Проблема вращения
351
А += и;
В += v:
C+=u*u-v*v;
D += и * v;
}
//////////////////////////////////////
// Тангенс учетверенного угла вращения
num = 2 * (D - А * В / к):
и = num / (С - (А * А - В * В) / к):
/////////////////////////////////////////// // Выбор угла из условия наксинума критерия if (и > 0 && num < 0)
и = atan (и) - M PI;
else if (и < 0 && num > 0)
и = atan (и) + MPI;
el se
и = atan (и);
и /= 4;
////////////////////////////
// Если вращение имеет смысл
if (fabs (u) >= 0.000001)
{
//////////////////////////////
// Вычисление матрицы вращения
cs[0] = cos (и):
cs[1] = sin (и);
cs[2] = -cs[l]:
cs[3] = cs[0];
///////////////////////// // Вращение пары векторов MatrixMultiplyMatrix (x.cs,y.k,2,2):
//////////////////////
// Вектор x - на место
for (jl =0: jl < k: jl++)
r[m2++] = y[jl]:
//////////////////////
// Вектор у - на место
for (jl = k; jl < k + k: jl++) r[m4++] = y[jl];
}
}
}
///////////////////////////////////////////
II Проверка сходимости по варимакс-критерию
352
Глава 7. Факторный анализ
for (1 = 0,vc = O.ml =0: i < m: i++)
{
for (j = 0,u = 0,v =0; j < k; j++,ml++) {
A = r[ml] * r[ml];
u += A * A:
v += A:
}
vc += k * U - v * v;
}
} while (fabs (vcl - vc) > 0.000001):
delete [] x; delete [] y:
////////////////////////////////////
// Денорнализация факторных нагрузок
for (1 = O.ml =0: i < m: 1++)
for (j = 0: j < k; j++)
r[ml++] *= h[j];
delete [] h:
return 0:
}
Критерии максимального числа факторов
Существует несколько критериев оценки максимального числа удерживаемых факторов. Критерии, основанные на анализе определителей (детерминантов) исходной и воспроизведенной корреляционной матриц, не показывают стабильности. Критерии, основанные на величине собственных значений корреляционной матрицы, в конечном счете приводят к анализу процента дисперсии, выделенной факторами. Все общие факторы, число которых равно числу параметров, выделяют 100% дисперсии. Если сумма процентов дисперсии превышает величину 100%, то это означает: при вычислении собственных значений корреляционной матрицы были получены отрицательные собственные значения и, как следствие, комплексные! собственные вектора, что может означать некорректную редукцию исходной корреляционной матрицы.
Таким образом, максимальное число удерживаемых факторов можно приблизительно установить из анализа процента дисперсии, выдаваемой программой для каждого фактора (можно было бы выдать
Критерии максимального числа факторов
353
и собственные значения, как это делается в каноническом дискриминантном анализе). Резюмируя сказанное выше, мы рекомендуем такой порядок действий: сначала пользователь проводит «разведочный» факторный анализ без указания максимального числа факторов, затем по величине дисперсий приблизительно оценивает число факторов, задает их или поручает сделать это программе и проводит повторный анализ, используя его результаты как окончательные. Обсуждение см. в [95, с. 35, 208].
Исходные коды
void PercentOfVariance (double z[],int k.double r[],double s[],int ms)
II
II Функция вычисляет процент дисперсии, выделенной факторами.
// Обозначения:
//	z	-	корреляционная матрица.
//	к	-	размерность корреляционной матрицы,
// г - матрица факторного отображения.
//	s	-	вектор процентов дисперсии.
//	ms	-	число факторов.
// Примечание:
И функция применяется после успешного завершения факторного // анализа, поэтому ошибка типа нулевой суммарной дисперсии // не отслеживается.
// Возвращаемое значение:
// нет.
//
{
register	int i.j:	//	Счетчики
int m;	//	Счетчик одномерного массива
double sd =	0;	//	Суммарная	дисперсия
for (i =	0.	m =	0; i	< k: i++)
{
sd += z[m]:
m += k + 1:
)
for (i = 0. m = 0: i < ms; i++)
{
for (j = 0. s[i] = 0; j < k; j++. m++) s[i] +» r[m] * r[m];
s[i] /= sd / 100;
12-2002
354
Глава 7. Факторный анализ
Визуализация результатов факторного анализа
Пусть в эксперименте получены некоторые опытные данные, представляющие собой измерения трех параметров, обозначенных цифрами 1, 2 и 3. В результате проведенных расчетов были выделены два фактора (две главные компоненты), обозначенные буквами А и В
Рис. 7.1. Изученные параметры 1,2 и 3 в пространстве главных компонент, которым соответствуют фактор А и фактор В
Из рис. 7.1 видно, что вектора данных четко распадаются на две груп-пы: одну группу, включающую в себя параметр 1 и параметр 2, и другую группу, включающую в себя параметр 3. Таким образом, по результатам расчета можно выдвинуть гипотезы:
•	Параметр 1 и параметр 2 имеют сильную взаимную линейную корреляцию.
•	Параметр 3 слабо зависит от параметров 1 и 2 в рассматриваемых сериях эксперимента.
Практический вывод: в эксперименте достаточно измерять не три параметра, а только два: параметр 1 (или 2) и параметр 3. Это послужит снижению стоимости эксперимента практически без потери точности выводов.
Дальнейшие исследования и программные ресурсы
•	Нелинейный факторный анализ.
В табл. 7.1 приводятся адреса некоторых программных ресурсов по факторному анализу.
дальнейшие исследования и программные ресурсы 355
Таблица 7.1 Ресурсы по программным продуктам анализа данных. Факторный анализ
ресурс, адрес	Разработчик или поставщик	Содержание	
www.bmstu.ru /facult/iu/iu4 /rus/stat/book5 www.simstat.com www.exetersoft ware.com	Институт вычислительного моделирования СО РАН Provalis Research Exeter Software	FAMaster, восстановление пропущенных данных с помощью методов факторного анализа, бесплатная версия EASY FACTOR ANALYSIS, анализ главных факторов и главных компонент NTSYSpc, программа многомерного анализа данных, включая факторный анализ	
			7
12*
Глава 8. Распознавание образов без обучения
Эпиграфом данной главы мог бы быть известный афоризм «Не в совокупности ищи единства, но более — в единении разделения»». Для определенности условимся: вынесенное в название главы положение следует понимать в том смысле, что программная система на основании определенных выделенных самой системой критериев производит классификацию предъявляемых ей образов. При этом возможно задание некоторых наборов параметров, но разделение объектов по классам на основе этих наборов будет выполнено автоматически.
Классическими методами распознавания образов без обучения являются методы кластерного анализа (кластер-анализа). В после-8 днее время для решения задачи распознавания образов без обучения применяются также и нейронные сети, однако этот интересный раздел мы оставим пока за рамками нашего рассмотрения.
Номера, получаемые в результате расчета кластеров, смыслового значения не имеют. Эти номера нужны только для того, чтобы отличить один кластер от другого, поэтому при использовании результатов кластерного анализа в других методах, например в распознавании образов с обучением, порядок следования кластеров может быть любым удобным для исследователя.
Все рассмотренные далее методы могут быть использованы как для классификации объектов, так и для классификации признаков [79, с. 104]. Общие понятия классификации рассмотрены в [40, с. 129]. Основные понятия распознавания образов и ссылки на ряд исследовательских программ применительно к изображениям даны в [61].
Меры различия и меры сходства
Виды используемых в кластерном анализе мер сходства и различия перекликаются с философской дилеммой: «ищите сходство» или
Прутков К. Плоды раздумья. Мысли и афоризмы: Сочинения. — М.: Правдам 1986. - С. 100.
Меры различия и меры сходства
357
«ищите различие». Меры сходства для кластерного анализа могут быть следующих видов:
•	Мера сходства типа расстояния (функции расстояния), называемая также мерой различия. В этом случае объекты считаются тем более похожими, чем меньше расстояние между ними, поэтому некоторые авторы называют меры сходства типа расстояния мерами различия.
•	Мера сходства типа корреляции, называемая связью, является мерой, определяющей похожесть объектов. В этом случае объекты считаются тем более похожими, чем больше связь между ними. Меры могут быть легко приведены к предыдущему типу, как показано ниже.
• Информационная статистика.
Рассмотренными ниже мерами могут оперировать различные методы кластерного анализа, но программные реализации этих методов, в зависимости от меры сходства или меры различия, различны.
Меры различия и информационная статистика
Показанная ниже функция служит для построения матрицы мер сходства типа расстояния.
Исходные коды
int Likeness (double data[],double z[],double s[],int n.int k.int Mode) //
// Функция строит матрицу мер сходства типа расстояния.
// Обозначения:
// data - массив исходных данных об объектах (к векторов
//	друг за другом).
// z — вычисленный массив мер сходства размером п х п.
// s - заранее вычисленная обратная дисперсионно-ковариационная
// матрица (только для вычисления расстояния Махаланобиса).
// п - число классифицируемых объектов.
//к число параметров, описывающих каждый объект.
// Mode - вариант меры сходства:
//	= 0 - евклидово расстояние.
//	= 1 - манхеттенское расстояние.
//	= 2 - расстояние Махаланобиса,
//	= 3 - супремум-норма.
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
358
Глава 8. Распознавание образов без обучения
// -1 при недостатке памяти.
И
{
register int i,j,l: // Счетчики
int m.ml.m2:	// Счетчик одномерного массива
double *datl,*dat2; // Копии векторов данных
if ((datl = new double[k]) == 0) return -1;
if ((dat2 = new double[k]) == 0) {
delete [] datl;
return -1;
}
//////////////////////////////
// Построение матрицы сходства for (i = 0. m2 = 0: i < n; i++) for (j = 0: j < n: j++) {
//////////////////////////////////////////////////// // Копия делается в текущем цикле для восстановления // после разрушения datl функцией Mahalanobis for (1 = 0, m = i; 1 < k; 1++, m += n) datl[l] = data[m];
for (1 = 0, ml = j; 1 < k; 1++. ml += n) dat2[l] = data[ml];
switch (Mode) { case 0:
z[m2++] = Euclid (datl,dat2.k);
break:
case 1:
z[m2++] = CityBlock (datl,dat2.k): break: case 2:
z[m2++] = Mahalanobis (datl.dat2,s,k);
break:
default: z[m2++] = Sup (datl,dat2.k): }
}
delete [] datl; delete [] dat2:
return 0;
}
Меры различия и меры сходства
359
Используемые при этом метрики — евклидово расстояние, манхет-тенское расстояние, сюпремум-норма — описаны в главе 14. В главе 11 рассматривается расстояние Махалонобиса.
Перечисленные меры сходства выбраны нами не случайно. Они отражают все многообразие подходов к решению проблемы. Первая метрика используется традиционно, вторая метрика является наиболее известным представителем класса метрик Минковского. Расстояние Махаланобиса, по определению метрикой не являющееся, связано с помощью дисперсионно-ковариационной матрицы с корреляциями переменных (параметров), и широко применяется как в кластерном, так и в других методах анализа данных. Другие метрики, такие как метрика Брея—Кертиса, Канберровская метрика и т. д., подробно исследованы в [ 191, с. 278] и могут быть легко запрограммированы по образцу показанных нами функций.
Меры сходства используются нами для методов:
•	ближней связи (этот метод имеет вариант и для мер сходства);
•	средней связи Кинга;
•	Уорда;
•	^-средних Мак-Куина.
Меры сходства
Показанная ниже функция применяется для построения матрицы мер сходства (связей) типа корреляции. Функция не оптимальна. Как мы уже указывали при описании мер сходства в разделе «Корреляция номинальных признаков» главы 5, для исследования корреляции в таблицах сопряженности (последние 6 мер сходства) логичнее выделить из тела функций построение самих таблиц сопряженности, поручив это отдельной функции. Это улучшило бы структуризацию программы. О сокращении времени расчета в общем говорить не приходится, так как кластеризация производится с использованием только одной избранной исследователем меры сходства. В этом случае функция построения матрицы мер сходства уже не будет столь универсальной, как показанная ниже. Уменьшение объема программы, достигнутое выделением блока построения таблицы сопряженности из функций расчета мер сходства, с лихвой компенсируется необходимостью построения отдельной функции вычисления матрицы сходства для случая исследования номинальных переменных. В любом случае выбор остается за программистом.
360
Глава 8. Распознавание образов без обучения
Матрица мер сходства типа корреляции может быть построена с помощью показанной ниже функции LikenessForCorrelation с использованием обозначенных параметром Mode мер сходства, за исключением коэффициента Гауэра. Матрица мер сходства в случае применения коэффициента Гауэра строится функцией Gower. Впрочем, пользователь может и сам легко составить функцию построения матрицы мер сходства путем модификации той же функции LikenessForCorrelation в результате ее упрощения либо добавления новых, введенных им мер.
Исходные коды
int LikenessForCorrelation (double data[].double z[].int n.int k.int Mode) //
// Функция строит матрицу мер сходства типа корреляции.
// Обозначения:
// data - массив исходных данных (к векторов друг за другом).
// z - корреляционная или ковариационная матрица размером к * к.
// п - длина каждого из к векторов.
// Mode - вариант меры сходства:
//	= 0 -	коэффициент Пирсона.
//	= 1 -	дисперсия-ковариация.
//	= 2 -	показатель Спирмэна.
//	= 3 -	коэффициент Кендалла.
//	= 4 -	хеммингово расстояние.
//	= 5 -	показатель подобия Жаккарда.
//	= 6 -	простой коэффициент встречаемости.
//	= 7 -	показатель подобия Рассела и Рао.
//	= 8 -	показатель подобия Юла.
//	= 9 -	коэффициент сопряженности Бравайса
// Возвращаемое значение:
//	0 при нормальном окончании расчета.
// -1 при недостатке памяти.
//
{
register int i.j.l; // Счетчики цикла
int m,ml.m2;	// Счетчик одномерного массива
double criterion.t. // Вспомогательные величины *datl.*dat2; // Копии векторов данных
if ((datl = new double[n]) == 0) return -1:
if ((dat2 = new double[n]) == 0) {
delete [] datl;
return -1;
}
Меры различия и меры сходства
361
I
//////////////////////////////
// Построение матрицы сходства
for (i = 0, m = 0, m2 = 0: i < к; 1++) { for (1=0; 1 < п; 1++)
datl[l] = data[m++];
for (j = 0, ml = 0; j < к; j++) {
for (1 = 0: 1 < n; 1++) dat2[l] = data[ml++]; switch (Mode)
{
case 0:
criterion = Pearson (datl,dat2,n):
break:
case 1:
criterion = Cov (datl,dat2,n); break;
case 2:
if (Spearman (datl,dat2,n.&criterion,&t) == -1) {
delete [] datl: delete [] dat2;
return -1; }
break;
case 3:
if (Kendall (datl,dat2,n.&criterion,&t) == -1) {
delete [] datl; delete [] dat2;
return -1; }
break:
case 4:
criterion = Hemming (datl,dat2,k) / k; break;
case 5:
criterion = Jaccard (datl,dat2,k): break;
case 6:
criterion = Sokal (datl.dat2,k): break: case 7:
criterion = Rao (datl.dat2,k): break;
case 8:
criterion = Yule (datl,dat2.k): break: default:
criterion = Bravais (datl,dat2.k): }
z[m2++] = criterion:
362
Глава 8. Распознавание образов без обучения
}
delete [] datl; delete [] dat2;
return 0:
}
Связями могут быть: коэффициент корреляции, коэффициенты ассоциативности (ассоциации) и т. д. Из этих связей для количе-) ственных признаков предназначены: коэффициент корреляционного отношения Пирсона, дисперсия-ковариация. Для порядковых признаков предназначены: показатель ранговой корреляции Спирмэна, коэффициент ранговой корреляции Кендалла. Отметим, что данные показатели с помощью простого преобразования могут быть приведены к мерам сходства типа расстояния соответственно с помощью формул [82, с. 92]
dij =1-ps, dij = 1-т.
В этом случае они будут называться расстоянием Спирмэна и расстоянием Кендалла. Мы не применяем данное преобразование, однако оно может быть легко запрограммировано подобно формулам предыдущего раздела.
Для дихотомических признаков и признаков, размещенных в таблицах сопряженности, предназначены: хеммингово расстояние, показатель Жаккарда, простой коэффициент встречаемости, показатель Рассела и Рао, коэффициент ассоциации Юла, коэффициент сопряженности Бравайса. Как и в предыдущем случае, рассмотренные показатели подобия можно преобразовать (кроме хеммингова расстояния), отняв вычисленное значение от единицы. В этом случае рассмотренные меры называют расстояниями [82, с. 93].
Для смешанных признаков предназначен коэффициент Гауэра, представленный в разделе «Корреляция признаков, измеренных в различных шкалах» главы 5. Перечисленные меры сходства используют методы:
•	ближней связи (этот метод имеет вариант и для мер различия);
•	корреляционных плеяд;
•	максимального корреляционного пути.
По умолчанию в последних двух методах обычно классифицируют] ся параметры (в первом классифицируются объекты), что обусловлено их традиционной авторской реализацией и назначением, однако путем простого транспонирования матрицы исходных данных
Кластерный анализ
363
и перемены местами чисел строк и столбцов можно легко изменить тип классификации на противоположный.
В комбинации с различными метриками, связями и мерами сходства других типов перечисленные алгоритмы дают большое число вариантов решения задачи классификации без обучения. Результаты классификации разными методами, как правило, принципиально не различаются, и выбор того или иного метода является делом вкуса исследователя и традиции школы.
Кластерный анализ
Методами кластерного анализа решается задача разбиения (классификации, кластеризации) множества объектов таким образом, чтобы все объекты, принадлежащие одному кластеру (классу, группе) были более похожи друг на друга, чем на объекты других кластеров. В отечественной литературе синонимом термина «кластерный анализ» является термин «таксономия». В иностранной литературе под таксономией традиционно понимается классификация видов животных и растений [186, с. 103].
Здесь рассматриваются следующие методы кластерного анализа:
•	Иерархические методы:
о метод ближней связи,
о метод средней связи Кинга,
о метод Уорда.
•	Итеративные методы группировки:
о метод ^-средних Мак-Куина.
•	Алгоритмы типа разрезания графа:
о метод корреляционных плеяд Терентьева, о вроцлавская таксономия.
Как уже указывалось, классифицируемы могут быть как параметры, так и объекты, поэтому по ходу изложения там, где идет речь о классификации объектов, вполне можно говорить о классификации параметров, и наоборот.
Существует специальная общая формула пересчета расстояния между классами Ланса и Уильямса [78, с. 155], [130, с. 69]:
dk(ij) = aidkt + ajdkj + bdij + c | dk - dkj |,
364
Глава 8. Распознавание образов без обучения
где ah cij, b, с — параметры, определяющие способ расчета расстояния между кластерами.
В зависимости от значения параметров, входящих в эту формулу, могут быть получены:
я, = dj = 1/2, b = 0, с = - 1/2 — метод ближней связи,
di = dj= 1/2, b = 0, с = 1/2 — метод дальней связи и т. д., см. [79, с. 39]. В [130, с. 69] и [82, с. 120] дана еще более общая, чем показанная выше, формула Жамбю, позволяющая получить разнообразные варианты кластеризации. В [130, с. 48] дана подробная классификация алгоритмов кластерного анализа, описаны десятки процедур и мер сходства и различия, а также приведена исчерпывающая библиография. Нами выбраны лишь несколько характерных процедур.
Метод ближней связи
Этот метод является самым простым для понимания из иерархических агломеративных методов кластерного анализа. Метод начи-_ нает процесс классификации с поиска и объединения двух наиболее похожих объектов в матрице сходства. На следующем этапе находятся два очередных наиболее похожих объекта, и процедура повторяется до полного исчерпания матрицы сходства.
В процессе кластеризации методом ближней связи явно прослеживается образование цепочек объектов. Таким образом, для выделения кластеров после окончания процесса кластеризации требуется задаться неко