ЗАДАЧА: Вычислить некоторые процентили по подгруппам наблюдений. АЛГОРИТМ: Такой же как и в 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".