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
* Замена значений, ушедших в меньшую или большую сторону от среднего более, чем на n стандартных отклонений
* граничными значениями.
* Предполагается, что вы уверены в правомерности такой замены! В следующем предупреждении я 
* воспроизвёл рекомендации, данные Артуром Кенделом (Arthur J. Kendal).
 
*********************** ВНИМАНИЕ! ***************************************.
* Изменение значений, которые кажутся выбросами, часто приводит к 
  неверным результатам.
* Эта процедура должна применяться очень избирательно. Перед применением этого
синтаксиса убедитесь, что "выбросы" не являются ошибками ввода данных.
* Проанализируйте ваши данные до и после процедуры удаления выбросов.
* Рекомендуется проконсультироваться у профессионального статистика перед
  тем, как заменять значения "выбросов".
*************************************************************************.



* Этот макрос - обобщение синтаксиса, размещённого Mirko Wendland в SPSSX-L 02.09.2002.

* Макрос размещён в SPSSX-L 02.09.2002, автор: Raynald Levesque.
* См. сайт по SPSS: http://www.spsstools.net.

*/////////////////.
DEFINE !mac1 (savfile=!TOKENS(1) /tmpdir=!TOKENS(1) /grp=!TOKENS(1) /nbsd=!TOKENS(1) /vars=!CMDEND)


/* ВХОДНЫЕ ПАРАМЕТРЫ 							*/
/*savfile	путь и имя файла, с которым будем работать 		*/
/*tmpdir	директория для сохранения временных файлов		*/
/*grp		имя категориальной переменной, задающей группы		*/
/*nbsd		число стандартных отклонений, которое будем использовать*/
/*vars		список переменных, значения которых будут анализироваться*/
/*		на предмет замены в случае, если их значения отклонились	*/
/*		от среднего более, чем на  +/- !nbsd * SD. Имена переменных	*/
/*		должны иметь не более 7 символов				*/

/* РЕЗУЛЬТАТЫ									*/
/* создаётся набор новых переменных, чьи значения укладываются в заданный 	*/
/* интервал. Имена переменных - формируются из старых имён, к которым		*/
/* добавляется двойка								*/
/* Например, новые значения переменной salary будут в переменной salary2.	*/

GET FILE=!savfile.  
SORT CASES BY !grp.
SAVE OUTFILE=!tmpdir + 'sort.sav'.

* считаем средние и стандартные отклонения для каждой подгруппы.

AGGREGATE OUTFILE = *
  /PRESORTED
  /BREAK = !grp
!DO !v !IN (!vars)
  /!CONCAT(!v,m) = mean(!v)
  /!CONCAT(!v,s) = sd(!v)
!DOEND.

AUTORECODE VARIABLES=!grp /INTO grpcode.
COMPUTE nobreak=1.
RANK VARIABLES=grpcode BY nobreak  /N INTO n .
DO IF $CASENUM=1.
WRITE OUTFILE=!tmpdir + 'syntax.sps' /"DEFINE !n()"n"!ENDDEFINE.".
END IF.
EXECUTE.
INCLUDE !tmpdir + 'syntax.sps'. 

!mac2 nbgrp=!EVAL(!n) tmpdir=!tmpdir grp=!grp nbsd=!nbsd vars=!vars.
!ENDDEFINE.
*----------------.


*/////////////////.
DEFINE !mac2(nbgrp=!TOKENS(1) /tmpdir=!TOKENS(1) /grp=!TOKENS(1) /nbsd=!TOKENS(1) /vars=!CMDEND)
/* считаем значения каждой границы*/


!DO !v !IN (!vars)
!DO !grpnb = 1 !TO !nbgrp
+  DO IF !grp=!grpnb.
+	COMPUTE !CONCAT(!v,l) = !CONCAT(!v,m)  - (!nbsd * !CONCAT(!v,s)).
+	COMPUTE !CONCAT(!v,h) = !CONCAT(!v,m)  + (!nbsd * !CONCAT(!v,s)).
+  END IF.
!DOEND
!DOEND

SAVE OUTFILE=!tmpdir + 'lohi.sav'.

* сливаем исходные данные с данными границ (средние и станд. откл).

MATCH FILES FILE=!tmpdir + 'sort.sav' 
        /TABLE=!tmpdir + 'lohi.sav'
        /BY=!grp.

* заменяем выбросы на значения верхней или нижней границ.

DO REPEAT num=1 TO !nbgrp.
DO IF (grpcode = num).
  !DO !v !IN (!vars)
+	COMPUTE #tmp = !v.
+	IF (!v < !CONCAT(!v,l)) #tmp = !CONCAT(!v,l).
+	IF (!v > !CONCAT(!v,h)) #tmp = !CONCAT(!v,h).
+	COMPUTE !CONCAT(!v,2) = #tmp.
  !DOEND
END IF.
END REPEAT PRINT.

!ENDDEFINE.
*----------------.


**** Вызов макроса.

SET MPRINT=yes.
!mac1 savfile='c:\\program files\\spss\\employee data.sav' 
	tmpdir='c:\\temp\\' grp=jobcat nbsd=2 vars=salary prevexp .
EXECUTE.