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