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
* ВОПРОС в новостную группу SPSS от 17.03.2001.
*Кто-нибудь знает, как в SPSS отсортировать переменные в выдаче
*FREQUENCIES (output)?  В некоторых процедурах, например DESCRIPTIVE,
*сортировку можно задать через командный синтаксис, но я не вижу, как это
*сделать в FREQUENCIES.  Мне нужна именно команда FREQUENCIES, так как в ней есть 
*вычисление медианы вместе со всеми прочими статистиками (а в DESCRIPTIVE - нет).  Мне нужно проанализировать около 100 переменных, для всех вычислить среднее, стандарт, асимметрию, эксцесс, минимум, максимум, медиану. Таким образом, чтобы результат бы упорядочен по убыванию средних.


* ОТВЕТ. Автор: rlevesque@videotron.ca.

* Этот синтаксис сортирует переменные в порядке убывания МЕДИАНЫ (но ясно, что вместо медианы можно ввести и другую статистику: среднее, минимум, максимум и т.д. - А.Б.), затем вызывает процедуру FREQ со включением переменных в установленном порядке.
* Из-за ограничения на количество переменных в 32,768 шт. (2^15) и того факта, что в процессе решения используется транспонирование матрицы данных, данный макрос будет работать корректно для файлов, имеющих не более 32,000 наблюдений (ограничения действуют до определённой версии SPSS - А.Б.).

SET MPRINT=yes /PRINTBACK=yes.
* Вот макрос, которые всё это выполняет.
*////////////////////////////////////.
DEFINE !median(!POS=!CMDEND) 

COMPUTE dummy=1.
MATCH FILES FILE=* /BY dummy /KEEP=!1.
XSAVE OUTFILE='c:\\temp\\temp.sav'.

* Подсчёт числа переменных, переданных в качестве параметра в макрос.
 FLIP.
COMPUTE dummy=1.
RANK VARIABLES=dummy /N INTO n.
DO IF $CASENUM=1.
WRITE OUTFILE='c:\\temp\\define nbvar.sps'
/ 'DEFINE !nbvar()' n '!ENDDEFINE'.
END IF.
EXECUTE.

GET FILE='c:\\temp\\temp.sav'.
INCLUDE FILE='c:\\temp\\define nbvar.sps'.
* Цель следующих 4 команд - добавить в файл данных ещё одно наблюдение, где все переменные будут иметь пропущенные значения.
COMPUTE dummy=1.
AGGREGATE OUTFILE='c:\\temp\\aggr.sav'
    /BREAK=dummy /n=N(dummy). 
ADD FILES FILE='c:\\temp\\aggr.sav' /IN=aggfile /FILE=* /BY dummy. 

*Заменяем пропуски медианами и удаляем ненужные переменные и наблюдения.
RMV m1 TO !CONCAT('m',!EVAL(!nbvar))=MEDIAN(!1, ALL). 
SELECT IF aggfile=1.
MATCH FILES FILE=* /BY=aggfile /DROP=dummy n aggfile.

*Приписываем медианы соответствующим переменным. 
VECTOR v=ALL /m=m1 TO !CONCAT('m',!nbvar).
LOOP #cnt=1 TO !nbvar.
COMPUTE v(#cnt)=m(#cnt).
END LOOP.

* Сортируем медианы по убыванию (D), пишем макрос в файл синтаксиса, который вернёт переменные в нужном порядке.
FLIP VARIABLES=!1 .
SORT CASES BY var001 (D).
COMPUTE dummy=1.
MATCH FILES FILE=* /BY dummy /FIRST=first /LAST=last.
DO IF first.
WRITE OUTFILE='c:\\temp\\list.sps' / 'DEFINE !list()' case_lbl.
ELSE if not last.
WRITE OUTFILE='c:\\temp\\list.sps' / " "case_lbl.
ELSE.
WRITE OUTFILE='c:\\temp\\list.sps' /" "case_lbl '!ENDDEFINE'.
END IF.
EXECUTE.

* Остался "десерт" :-).
GET FILE='c:\\temp\\temp.sav'.
INCLUDE FILE='c:\\temp\\list.sps'.
FREQUENCIES
  VARIABLES=!list   /STATISTICS=MEAN MEDIAN SKEWNESS SESKEW KURTOSIS SEKURT
  /ORDER=  ANALYSIS .

!ENDDEFINE.
*////////////////////////////////////.


* Вот пример вызова макроса.

GET FILE='c:\\program files\\SPSS\\employee data.sav'.
!median educ salary TO prevexp.