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
*(Вопрос) Предыдущее решение хорошо, если есть лишь одна переменная, у которой есть пустая категория. К сожалению, у меня есть 12 баз данных с 5-20 переменными в каждой. Каждая переменная имеет один и тот же набор возможных значений (категорий): 0.05, 1, 2, 3, 4, 5, 6, 7. Есть способ так автоматизировать процесс построения графиков с пустыми категориями, чтобы не надо было каждый раз перед их построением строить таблицы частот, выявлять пустые категории, создавать отдельные файлы для каждой категории и т.д.?

*(Ответ) Размещён в  SPSSX_L 06.12.2001  rlevesque@videotron.ca.
* Вот в некоторой степени общее решение. Вам не нужно знать наперед ни имена переменных с пустыми категориями, ни значения пустых категорий перед вызовом макроса. 
* Вы вызываете макрос один раз для отдельного файла данных. (Если у вас много файлов данных, можете оптимизировать этот макрос, добавив возможности, описанные в разделе этого сайта "Работа с большим количеством файлов данных" для ещё большей автоматизации процесса).

* В случае, если в файле данных встречаются строковые переменные, то появляются ошибки, но их можно просто игнорировать.

* Идея данного синтаксиса состоит в том, что мы создаём временные файлы с одним наблюдением в каждом и в этом файле всем переменным приписываем сначала одно значение из возможных (0.05, 1, 2, 3, 4, 7), потом второе, потом третье и т.д. Взвешиваем их с малым весом и потом из каждого файла "подшиваем" эти фиктивные наблюдения к основному файлу данных - А.Б.

SET MPRINT=yes.
*//////////////////////.
DEFINE !fill (filenam=!TOKENS(1) /vlist=!CMDEND)
GET FILE=!filenam.
N OF CASES 1.
!LET !cnt=!NULL

!DO !val !IN (!vlist)
DO REPEAT var=ALL.
+ COMPUTE var=!val.
END REPEAT PRINT.
!LET !cnt=!CONCAT(!cnt,!BLANK(1))
COMPUTE wgt=.00001.
XSAVE OUTFILE=!QUOTE(!CONCAT('c:\\temp\\temp',!LENGTH(!cnt),'.sav')).
!DOEND
EXECUTE.

GET FILE=!filenam.
COMPUTE wgt=1.
!LET !cntend=!LENGTH(!cnt)
/* Добавляем фиктивные наблюдения к исходному файлу данных */
!DO !cnt1=1 !TO !cntend
ADD FILES FILE=* /FILE=!QUOTE(!CONCAT('c:\\temp\\temp',!cnt1,'.sav')).
!DOEND

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


SET MPRINT=yes. 

* Вызов макроса для создания первого файла данных.
!fill 	filenam='C:\\program files\\spss\\employee data.sav' 
	vlist=.05 1 2 3 4 7.

* Показываем, что это сработало.
FORMAT jobcat minority (F8.2).
WEIGHT BY wgt.

* Вызов Basic Tables.
TABLES
  /FORMAT BLANK MISSING('.')
  /TABLES jobcat
  BY minority > (STATISTICS)
  /STATISTICS
  count( ( F5.0 )).

FREQUENCIES
  VARIABLES=jobcat
  /ORDER=  ANALYSIS .

* Внимание: Использование команды Crosstab не даст вам пустых ячеек, т.к. эта процедура округляет веса перед построением таблицы.