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
* Тема: автоматическое масштабирование переменных к интервалу 0-1.
* Ключевые слова: преобразование, масштабирование, шкала, переменная, интервал, 0, 1.
* Опубликован: 16.06.2008.
* Автор: Raynald Levesque.
* Перевод: А. Балабанов.

* (Вопрос) В массиве имеется 4 переменные. Они имеют разные минимальные и максимальные 
  значения. Я хотел бы отмасштабировать их к интервалу от нуля до единицы. Сейчас я делаю
  это, записывая синтаксис, в котором в качестве констант фигурируют минимумы и максимумы
  каждой из переменных, а точнее - вычитаю из каждой переменной её минимум, а затем делю 
  разницу на размах (разницу между максимумом и минимумом), например: 
  COMPUTE scale2=(scale1-0.13)/0.6.
* Есть ли способ делать это автоматически, чтобы не приходилось каждый раз для каждой
  переменной вводить её статистики?.

* (Ответ) Размещён в SPSSX-L, автор: Raynald Levesque@videotron.ca.

* Загрузим пример данных.
GET FILE='c:\program files\spss\employee data.sav'.

* Создадим макрос.
*/////////////.
DEFINE !rescale (var=!TOKENS(1) /newvar=!TOKENS(1))
SAVE OUTFILE='c:\temp\data file.sav'.
COMPUTE nobreak=1.
AGGREGATE OUTFILE=*
  /PRESORTED
  /BREAK=nobreak
  /min=MIN(!var) /max=MAX(!var).
COMPUTE range=max-min.
* Это будет работать, если в системе десятичным разделителем является точка. В противном случае,
  скорее всего, возникнет ошибка при исполнении синтаксиса командой INCLUDE ниже.
WRITE OUTFILE="C:\temp\rescale.sps"
  /"COMPUTE " !QUOTE(!newvar) "=(" !QUOTE(!var) "-" min(F12.11) ")/" range(F12.11) ".".
EXECUTE.
GET FILE='c:\temp\data file.sav'.
INCLUDE "C:\temp\rescale.sps".
!ENDDEFINE.
*/////////////.

* Пример вызова определённого выше макроса для приведения переменной к масштабу 0-1.
SET MPRINT=yes.
!rescale var=salary newvar=salary2.
SET MPRINT=no.
* Покажем, что всё сработало:.
GRAPH
  /SCATTERPLOT(BIVAR)=salary WITH salary2
  /MISSING=LISTWISE .

* Пример с другой переменной. То же преобразование, но с salbegin.
SET MPRINT=yes.
!rescale var=salbegin newvar=salbegin2.
SET MPRINT=no.
* Покажем, что сработало:.
GRAPH
  /SCATTERPLOT(BIVAR)=salbegin WITH salbegin2
  /MISSING=LISTWISE .