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
* Тема: преобразовать переменную в ограниченный интервал значений.
* Ключевые слова: преобразование, масштабирование, шкала, переменная, интервал.
* Опубликован: 16.06.2008.
* Автор: rlevesque@videotron.ca.
* Перевод: А. Балабанов.

* (Вопрос) Как преобразовать переменную "a" так, чтобы она принимала значения 
  в определённом интервале [0,1] ?.

* (Ответ) Предложено следующее линейное преобразование. Автор: rlevesque@videotron.ca, 
  размещено в SPSSX-L on 25.09.2001.

DATA LIST FREE /a.
BEGIN DATA
-5 12 85 26 -2 18
END DATA.
LIST.

COMPUTE dummy=1.
AGGREGATE
  /OUTFILE='C:\\temp\\AGGR.SAV'
  /BREAK=dummy
  /minval = MIN(a) /maxval = MAX(a).

MATCH FILES /FILE=*
 /TABLE='C:\\Temp\\AGGR.SAV'
 /BY dummy.

COMPUTE newa=(a-minval)/(maxval - minval).
EXECUTE.


************************************.
*
* Обобщение 1.
* Чтобы преобразовать приведённое выше решение в макрос, можно сделать следующее.
*
************************************.

SET MPRINT=no.
*/////////////////////.
DEFINE !transf (var=!TOKENS(1) /newvar=!TOKENS(1))
COMPUTE dummy=1.
AGGREGATE
  /OUTFILE='C:\\temp\\AGGR.SAV'
  /BREAK=dummy
  /minval = MIN(!var) /maxval = MAX(!var).

MATCH FILES /FILE=*
 /TABLE='C:\\Temp\\AGGR.SAV'
 /BY dummy.

COMPUTE !newvar=(!var-minval)/(maxval - minval).
!ENDDEFINE.
*/////////////////////.

* Пример использования.
SET MPRINT=yes.
GET FILE='c:\\Program Files\\spss\\employee data.sav'.
!transf var=salary newvar=nsal.
EXECUTE.


************************************.
*
* Обобщение 2.
* Чтобы обеспечить любую ширину интервала [b,c] вместо [0,1] делаем следующее.
*
************************************.

SET MPRINT=no.
*/////////////////////.
DEFINE !transf2 (var=!TOKENS(1) 
	/newvar=!TOKENS(1)
	/intbeg=!TOKENS(1)
	/intend=!TOKENS(1))

/* Задача: преобразовать переменную var в newvar так, что newvar принимает 
   значение из интервала [intbeg,intend] */

COMPUTE dummy=1.
AGGREGATE
  /OUTFILE='C:\\temp\\AGGR.SAV'
  /BREAK=dummy
  /minval = MIN(!var) /maxval = MAX(!var).

MATCH FILES /FILE=*
 /TABLE='C:\\Temp\\AGGR.SAV'
 /BY dummy.
COMPUTE !newvar=!intbeg + (!intend - !intbeg)*(!var-minval)/(maxval - minval).
!ENDDEFINE.
*/////////////////////.

* Пример использования.
SET MPRINT=yes.
GET FILE='c:\\Program Files\\spss\\employee data.sav'.
!transf2 var=salary newvar=nsal intbeg=2 intend=7.
EXECUTE.
* Проверка.
DESCRIPTIVES
  VARIABLES=nsal
  /STATISTICS=MEAN RANGE MIN MAX.