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
* Иногда в целях конфиденциальности в итоговых таблицах нецелесообразно отображать
* информацию, полученную по небольшому числу случаев (например, меньшему, чем 5).

* Удалять вручную (или программно) соответствующие ячейки из таблицы - не всегда хорошая практика, 
* поскольку иногда НЕ ДОСТАТОЧНО просто удалить ячейки с частотами, меньшими 5.
* Пример такой ситуации:
* допустим, для заданного возрастного интервала у нас есть 3 мужчины и 7 женщин. Положим, что в таблице 
* отображаются как статистики в разрезе мужчин и женщин по возрастам, так и комбинированный результат
* по возрастам без разделения на мужчин и женщин. Ясно, что если просто удалить статистики для мужчин, 
* то содержимое удалённой "мужской" ячейки МОЖЕТ БЫТЬ восстановлено, исходя из значения итога и значений
* "женской" ячейки.

* Здесь предлагается такое решение
* 1) определить, какие наблюдения попадут в ячейки с наболнением менее 5 наблюдений;
* 2) установить соответствующие значения в соответствующих переменных в $SYSMIS.
* Таким образом, для примера, приведённого выше, итоговая статистика будет равна статистике для
* женщин, таким образом, статистику для мужчин нельзя будет восстановить по таблице.


GET FILE='c:\\program files\\spss15\\employee data.sav'.
COMPUTE age = DATEDIFF( DATE.DMY(1,1,1990), bdate, "days") / 365.25 .
RECODE age (LO THRU 20=1) (LO THRU 30=2)(LO THRU 40=3)(LO THRU 50=4)(LO THRU 60=5)(LO THRU HI=6)
	INTO ageband.
* Custom Tables.
CTABLES
  /VLABELS VARIABLES=salary ageband gender DISPLAY=DEFAULT
  /TABLE ageband [C] BY gender > salary [COUNT VALIDN F40.0, MEAN]
  /CATEGORIES VARIABLES=ageband gender ORDER=A KEY=VALUE EMPTY=EXCLUDE TOTAL=YES
  /TITLES CAPTION="Показаны все зарплаты".

* Хотим спрятать информацию о зарплатах в тех ячейках, куда попадает меньше 5 значений.
SORT CASES BY ageband gender.
AGGREGATE 
	/BREAK=ageband gender
	/nmissing=NMISS(salary) /totaln=N.
COMPUTE nbValid = totaln - nmissing.
COMPUTE salary2=salary.
APPLY DICTIONARY FROM *
  /SOURCE VARIABLES =  salary
  /TARGET VARIABLES =  salary2
  /VARINFO ALL .
IF nbValid<5 salary2=$SYSMIS.
* Custom Tables.
CTABLES
  /VLABELS VARIABLES=salary2 ageband gender DISPLAY=DEFAULT
  /TABLE ageband [C] BY gender > salary2 [COUNT VALIDN F40.0, MEAN]
  /CATEGORIES VARIABLES=ageband gender ORDER=A KEY=VALUE EMPTY=EXCLUDE TOTAL=YES
  /TITLES CAPTION="Информация о зарплатах в ячейках с числом наблюдений, меньшим 5, не показана из соображений конфиденциальности".



**************************.
* Макро-версия.
**************************.

*///////////////////////.
DEFINE !hide(minnb=!TOKENS(1) /var=!TOKENS(1) /newvar=!TOKENS(1) /cell=!CMDEND)
SORT CASES BY !cell .
AGGREGATE 
	/PRESORTED
	/BREAK=!cell
	/nmissing=NMISS(!var) /totaln=N.
COMPUTE nbValid = totaln - nmissing.
COMPUTE !newvar=!var.
APPLY DICTIONARY FROM *
  /SOURCE VARIABLES =  !var
  /TARGET VARIABLES =  !newvar
  /VARINFO ALL .
IF nbValid< !minnb !newvar=$SYSMIS.

!ENDDEFINE.
*///////////////////////.
 
GET FILE='c:\\program files\\spss\\employee data.sav'.
COMPUTE age= RND(DATEDIFF(DATE.DMY(1,1,1990), bdate, "days") / 365.25) .
RECODE age (LOW THRU 20=1) (LOW THRU 30=2)(LOW THRU 40=3)(LOW THRU 50=4)(LOW THRU 60=5)(LOW THRU HI=6)
	INTO ageband.
* Custom Tables.
CTABLES
  /VLABELS VARIABLES=salary ageband gender DISPLAY=DEFAULT
  /TABLE ageband [C] BY gender > salary [COUNT VALIDN F40.0, MEAN]
  /CATEGORIES VARIABLES=ageband gender ORDER=A KEY=VALUE EMPTY=EXCLUDE TOTAL=YES
  /TITLES TITLE="Средние зарплаты по полу и возрасту" CAPTION="Показаны все зарплаты".

!hide minnb=5 var=salary newvar=salary2 cell=ageband gender.
* Custom Tables.
CTABLES
  /VLABELS VARIABLES=salary2 ageband gender DISPLAY=DEFAULT
  /TABLE ageband [C] BY gender > salary2 [COUNT VALIDN F40.0, MEAN]
  /CATEGORIES VARIABLES=ageband gender ORDER=A KEY=VALUE EMPTY=EXCLUDE TOTAL=YES
  /TITLES TITLE="Средние зарплаты по полу и возрасту"
	CAPTION="Информация о зарплатах в ячейках с числом наблюдений, меньшим 5, не показана из соображений конфиденциальности".