Проверка согласия для распределения Пуассона
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | **** КРИТЕРИЙ СОГЛАСИЯ ДЛЯ РАСПРЕДЕЛЕНИЯ ПУАССОНА **** * Пример данных *. DATA LIST FREE/ NUMBER(f8.0). BEGIN DATA 0 2 0 0 2 2 0 0 1 1 3 0 0 1 0 0 1 0 1 4 0 0 1 4 2 0 0 1 0 0 2 2 1 1 0 6 0 5 1 3 0 1 0 1 8 END DATA. VAR LABEL number 'Число иксодовых клещей/мышь'. * Проверка по критерию Колмогорова-Смирнова для одной выборки (низкая чувствительность * если вручную не ввести поправку Лиллефорса (Lilliefors correction) *. NPAR TESTS /K-S(POISSON)= number /MISSING ANALYSIS. * Обратите внимание на пустую категорию между 6 и 8; она должны быть заполнена, чтобы * ожидаемые значения были подсчитаны верно (данная часть приводится только * из образовательных соображений, она может быть удалена из практически используемого кода *. FREQUENCIES VARIABLES=number /ORDER= ANALYSIS . *** Заполняем пустые категории *** * Во-первых, сгруппируем наблюдения по частоте встречаемости вариат *. AGGREGATE /OUTFILE=* /BREAK=number /obs=N. EXEC. * Создадим вспомогательный файл со всевозможными значениями от 0 до максимального значения из файла данных *. PRESERVE. SET ERRORS=NONE RESULTS=NONE. MATRIX. GET number /VAR=number. COMPUTE max=CMAX(number). RELEASE number. COMPUTE number=MAKE(max+1,1,1). COMPUTE wgt=MAKE(max+1,1,0.0001). LOOP i=1 TO max+1. - COMPUTE number(i)=i-1. END LOOP. COMPUTE namevec={"number","wgt"}. SAVE {number,wgt} /OUTFILE='c:\\temp\\temp.sav' /NAMES=namevec. END MATRIX. * Объединим его с рабочим файлом для заполнения пустых категорий *. MATCH FILES /FILE=* /FILE='C:\\Temp\\temp.sav' /BY NUMBER. EXECUTE. IF MISSING(obs) obs=wgt. MATCH FILES /FILE=* /DROP=wgt. EXECUTE. WEIGHT BY obs. RESTORE. * Теперь пустоты заполнены как бы нулевой частотой *(на самом деле, пустая категория имеет малый вес (данные взвешены) - А.Б.) *. FREQUENCIES VARIABLES=number /ORDER= ANALYSIS . *** Критерий согласия хи-квадрат (с большей чувствительностью, чем проверка Колмогорова-Смирнова) *** * Рассчитаем среднее и количество наблюдений (N) *. COMPUTE const = 1 . EXECUTE . AGGREGATE /OUTFILE='C:\\temp\\aggr.sav' /BREAK=const /mean = MEAN(number) /N=N. WEIGHT OFF. PRESERVE. SET ERRORS=NONE. MATCH FILES /FILE=* /FILE='C:\\temp\\aggr.sav' /BY const. EXECUTE. RESTORE. DO IF MISSING(mean). - COMPUTE mean=LAG(mean). - COMPUTE n=LAG(n). END IF. EXECUTE. * Рассчитаем ожидаемые частоты *. DO IF $casenum=1. - COMPUTE expect=n*CDF.POISSON(number,mean) . END IF. DO IF $casenum GT 1. - COMPUTE expect=n*CDF.POISSON(number,mean)-n*CDF.POISSON(LAG(number),mean) . END IF. SORT CASES BY number(D). DO IF $casenum=1. - COMPUTE expect=n*(1-CDF.POISSON(number-1,mean)). END IF. EXEC. SORT CASES BY number(A). * Графическое сопоставление перед объединением категорий. * Хотя оно не является частью проверки, бывает полезно для визуализации отклонений от * распределения Пуассона. Должно производиться перед объединением категорий *. GRAPH /BAR(GROUPED)=VALUE( obs expect ) BY number . * Проверяем, какие категории имеют ожидаемые частоты, меньшие, чем 1. * Объединяем соответствующие категории. * (можно доработать для объединения категорий с ожидаемыми частотами, меньшими 5) *. COMPUTE id=$casenum. DO IF expect LT 1. - COMPUTE id=LAG(id). END IF. EXECUTE. AGGREGATE /OUTFILE=* /BREAK=id /observed = SUM(obs) /expected = SUM(expect). * Статистика проверки и её значимость *. STRING groups (A2). COMPUTE groups = STRING(id,F2.0) . EXECUTE . MATRIX. GET groups/VAR=groups. GET obs/VAR=observed. GET expect/VAR=expected. PRINT {obs,expect;MSUM(obs),MSUM(expect)} /FORMAT='F8.2' /TITLE='Наблюдаемые и ожидаемые частоты' /CLABELS='Набл.','Ожид.' /RNAMES=groups. COMPUTE k=NROW(obs). PRINT {k-2} /FORMAT='F8.0' /TITLE='Число степеней свободы (k-2)'. COMPUTE chi2=MSUM((obs-expect)&**2/expect). COMPUTE chisig=1-CHICDF(chi2,k-2). PRINT {chi2,chisig} /FORMAT='F8.4' /TITLE='ПРОВЕРКА ПО КРИТЕРИЮ СОГЛАСИЯ' /CLABELS='Хи^2','Знач.'. COMPUTE minexp=CMIN(expect). COMPUTE flag=0. LOOP i=1 TO k. - DO IF expect(i) LT 5. - COMPUTE flag=flag+1. - END IF. END LOOP. COMPUTE pflag=100*flag/k. DO IF flag GT 0. - PRINT pflag /FORMAT='F8.1' /TITLE='ВНИМАНИЕ: ОЖИДАЕМЫЕ<5 ПО КРАЙНЕЙ МЕРЕ, В ОДНОЙ ЯЧЕЙКЕ. % таких ячеек:' /RLABEL=' '. - PRINT minexp /FORMAT='F8.1' /TITLE='Минимальная ожидаема частота:' /RLABEL='Ожид.='. END IF. END MATRIX. |