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".