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
*(Вопрос) Мне нужно вычислить всевозможные комбинации векторных произведений
среди группы переменных. То есть, надо найти произведения всех пар переменных,
сохраняя каждый раз результат в новой переменной. В файле данных переменные идут
одна за другой, так что, я думаю, можно как-то использовать функцию SPSS RANGE.
Только не знаю как. А поскольку в моей матрице данных 168 переменных, умножать их
поодиночке будет сложной задачей.
*	Может кто-нибудь предложить решение?.

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

*****************.
* Часть A.

* Создаются новые переменные для каждого произведения.
* Проблема в том, что потом очень сложно будет использовать полученные переменные,
так как у них нет никаких меток - где содержится результат перемножения конкретной
пары переменных.
* Часть B снимает эту проблему.
*****************.

* Создадим учебный массив данных с 5 переменными.
* Метод работает для максимального числа переменных, поддерживаемых SPSS
(где-то 32, 000) - для ранних версий (А.Б.).
* То есть, начальное число переменных может быть где-то в районе 250 штук..

* Вам нужно будет поменять границы индексов и число векторных переменных (числа 4, 5, 10) в синтаксисе ниже таким образом, чтобы это соответствовало вашим данным. 

DATA LIST LIST /agecateg var2 crit19 cntry lastvarn.
BEGIN DATA
1 2 3 4 5 6
2 5 1 3 6 4 
2 5 1 4 7 3
2 5 8 9 6 1
END DATA.
LIST.
SAVE OUTFILE='c:\\temp\\mydata.sav'.

* для n переменных существует (n-1)*n/2 векторных произведений.
* Когда n=5, у нас будет 10 произведений, поэтому нам нужны будут 10 переменных
(cp1 - cp10) для размещения результатов.
VECTOR v=agecateg TO lastvarn /cp(10F8.0).
COMPUTE #idx=1.
LOOP #cnt1=1 TO 4.
LOOP #cnt2=#cnt1 +1 TO 5.
COMPUTE cp(#idx)=v(#cnt1)*v(#cnt2).
COMPUTE #idx=#idx+1.
END LOOP.
END LOOP.
EXECUTE.
SAVE OUTFILE='c:\\temp\\mydata2.sav'.
* Готово.

*****************.
* Часть B.

* Посмотрим, как можно добавить к переменным cp осмысленные метки.
*****************.

GET FILE='c:\\temp\\mydata.sav'.
* в данном случае нам потребуются только имена переменных, поэтому мы ограничим
число наблюдений одним.
N OF CASES 1.
* Транспонируем.
FLIP.
* Теперь имена переменных сохранились в строковой переменной. Пронумеруем их.
COMPUTE id=$CASENUM.
* Нам нужно, чтобы имена переменных попали в одну строку. Определим вектор, который будет содержать имена.
VECTOR vn(5A8).

* Копируем каждую метку в соответствующую колонку.
COMPUTE vn(id)=case_lbl.
COMPUTE nobreak=1.
* Теперь "сожмём" все наблюдения в одну строку.
AGGREGATE
  /OUTFILE=*
  /BREAK=nobreak
  /vn1 TO vn5 = MAX(vn1 TO vn5).

* Получим командный синтаксис с определением имён переменных.
VECTOR v=vn1 TO vn5.
STRING #deflab(A50).
COMPUTE #idx=1.

LOOP #cnt1=1 TO 4.
LOOP #cnt2=#cnt1 +1 TO 5.
COMPUTE #deflab=CONCAT(
	'VARIABLE LABEL cp',LTRIM(STRING(#idx,F8.0)),' "',
	v(#cnt1),' * ',v(#cnt2),'".').
* Запишем команды в файл синтаксиса.
WRITE OUTFILE='c:\\temp\\define var labels.SPS' /#deflab.
COMPUTE #idx=#idx+1.
END LOOP.
END LOOP.
EXECUTE.

GET FILE='c:\\temp\\mydata2.sav'.
INCLUDE 'c:\\temp\\define var labels.SPS'.
FREQ ALL.