Вычислить некоторые процентили по подгруппам наблюдений
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 | ЗАДАЧА: Вычислить некоторые процентили по подгруппам наблюдений. АЛГОРИТМ: Такой же как и в SPSS FREQUENCIES АВТОР: Том Дьерикс (Tom Dierickx) (tom@data-for-all.com) РЕДАКЦИЯ: 5 февраля 2003 г. Примечания: 1) Если вам нужно найти процентили для всего массива, без подгрупп, просто выполните команду "COMPUTE dumvar = 1." перед запуском синтаксиса и сохраните ваш файл, а после этого используйте переменную dumvar в качестве группирующей. 2) Если нужно осуществить группировку процентилей по нескольким переменным, можно сначала объединить несколько группирующих переменных в одну "суперпеременную" (опять же, сохранить её в файле), а затем - использовать её в качестве единственной группировки. Например, для данного массива можно было бы группировать автомобили по переменным accel, year и origin следующим образом: STRING cubeID (A9). COMPUTE cubeID = CONCAT(STRING(accel,F4.0),"-",STRING(year,F2.0),"-",STRING(origin,F1.0)). ***************************************************************************. *** ПРОСТО ИСПРАВЬТЕ ЭТИ УСТАНОВКИ КАК ВАМ НАДО, И ВПЕРЁД! ****************. ***************************************************************************. DEFINE @Path() "C:\\Program Files\\SPSS15\\" !ENDDEFINE. DEFINE @SavFile() "Cars.sav" !ENDDEFINE. DEFINE @VarX() mpg !ENDDEFINE. DEFINE @VarXQ() "mpg" !ENDDEFINE. DEFINE @GrpBy() cylinder !ENDDEFINE. ***************************************************************************. *** ШАГ 1: ЗАГРУЖАЕМ SAV-ФАЙЛ С НУЖНЫМИ ДАННЫМИ И СОРТИРУЕМ НАБЛЮДЕНИЯ ***. GET FILE= @Path + @SavFile. SORT CASES @GrpBy(A) @VarX(A). *** ШАГ 2: СОХРАНЯЕМ ДАННЫЕ ВО ВРЕМЕННОМ ФАЙЛЕ, ****. *** СОХРАНЯЯ ЛИШЬ ГРУППИРУЮЩУЮ ПЕРЕМЕННУЮ И НЕПРОПУЩЕННЫЕ ЗНАЧЕНИЯ ЦЕЛЕВОЙ ***. SELECT IF NOT(SYSMIS(@VarX)) AND NOT(MISSING(@VarX)). SAVE OUTFILE = "C:\\Temp\\" + @VarXQ + ".sav" /rename= (@GrpBy @VarX = grp_id value) /keep= grp_id value. GET FILE = "C:\\Temp\\" + @VarXQ + ".sav". *** ШАГ 3: НУМЕРУЕМ ЗАПИСИ ВНУТРИ КАЖДОЙ ГРУППЫ ***. IF ( ($CASENUM=1) OR (SYSMIS(LAG(grp_id)) AND NOT(SYSMIS(grp_id))) OR (grp_id <> LAG(grp_id)) ) recno=1. IF (MISSING(recno)) recno=LAG(recno) + 1. EXECUTE. *** ШАГ 4: СОХРАНЯЕМ ПЕРЕНУМЕРОВАННЫЕ ДАННЫЕ ***. SAVE OUTFILE= "C:\\Temp\\" + @VarXQ + ".sav". GET FILE= "C:\\Temp\\" + @VarXQ + ".sav". *** ШАГ 5: НАХОДИМ ЧИСЛО НАБЛЮДЕНИЙ ВНУТРИ КАЖДОЙ ГРУППЫ ***. AGGREGATE /OUTFILE= * /BREAK= grp_id /N= N. *** ШАГ 6: ОБЪЕДИНЯЕМ ПОЛУЧЕННЫЕ ЧАСТОТЫ И ПЕРЕНУМЕРОВАННЫЕ ДАННЫЕ ***. MATCH FILES /FILE= "C:\\Temp\\" + @VarXQ + ".sav" /TABLE= * /BY= grp_id. EXECUTE. *** ШАГ 7: ВЫЧИСЛЯЕМ ПРОЦЕНТИЛИ, ИСПОЛЬЗУЯ МЕТОД "p(n+1) С ИНТЕРПОЛЯЦИЕЙ" *****. *** (СМ. http://www.itl.nist.gov/div898/handbook/prc/section2/prc252.htm)***. DO REPEAT p= .10 .25 .50 .75 .90 /OBS= i_10 i_25 i_50 i_75 i_90 /k= k_10 k_25 k_50 k_75 k_90 /r= r_10 r_25 r_50 r_75 r_90 /ptile= p_10 p_25 p_50 p_75 p_90. COMPUTE OBS = p*(N+1). COMPUTE k = TRUNC(OBS). COMPUTE r = OBS - k. DO IF ((OBS <= 1) AND (recno = 1)). COMPUTE ptile = value. ELSE IF ((OBS >= N) AND (recno = N)). COMPUTE ptile = value. ELSE IF (lag(recno) = k). COMPUTE ptile = (1-r)*lag(value) + r*(value). END IF. END REPEAT . EXECUTE. *** ШАГ 7: "СЖИМАЕМ" ДАННЫЕ, ОСТАВЛЯЯ ТОЛЬКО ОБОБЩЁННЫЕ ЗНАЧЕНИЯ ***. AGGREGATE /OUTFILE= * /BREAK= grp_id /n = N /mean = MEAN(value) /min = MIN(value) /p_10 = MAX(p_10) /p_25 = MAX(p_25) /p_50 = MAX(p_50) /p_75 = MAX(p_75) /p_90 = MAX(p_90) /max = MAX(value). *** ШАГ 9: ДАДИМ ПОНЯТНЫЕ ОБОЗНАЧЕНИЯ ПЕРЕМЕННЫМ ***. VARIABLE LABELS n "Count: " + @varXQ. VARIABLE LABELS mean "Mean: " + @varXQ. VARIABLE LABELS min "Minimum: " + @varXQ. VARIABLE LABELS p_10 "10th percentile: " + @varXQ. VARIABLE LABELS p_25 "25th percentile: " + @varXQ. VARIABLE LABELS p_50 "Median: " + @varXQ. VARIABLE LABELS p_75 "75th percentile: " + @varXQ. VARIABLE LABELS p_90 "90th percentile: " + @varXQ. VARIABLE LABELS max "Maximum: " + @varXQ. *** ШАГ 10: ПРИЕХАЛИ! *** SAVE OUTFILE= "C:\\Temp\\" + @VarXQ + ".sav". |