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
* Опубликован: 30.12.2005.
* (Вопрос) Мне нужно симулировать случайные переменные, представляющие собой триады чисел: var1a, var1b, var1c, var2a, var2b, var2c и т.д.
* Каждая переменная может принимать случайное целое число 0, 1 или 2, но каждая переменная из триады (например, var2a, var2b, var2c), должна иметь РАЗНЫЕ значения.
* Таким образом, первая из трёх переменных может принимать любое из трех значений 0, 1 или 2 (я использовал инструкцию COMPUTE var1a  = TRUNC(RV.UNIFORM(0,3)) .).
* Вторая переменная может принимать любое значение из трёх, за исключением того значения, что приняла первая переменная.
* Третья переменная вычисляется как 3 минус сумма значений двух предыдущих переменных.

* Моя трудность в том, как получить вторую переменную.
* (и, возможно, элегантное решение как сделать всё это вместе через цикл LOOP, или как-то иначе).

 * (Ответ) Размещён в SPSSX-L rlevesque@videotron.ca  01 августа 2002.

* Допустим, вам нужно сгенерировать 10 наблюдений 4-х триад случайных переменных.

INPUT PROGRAM.
LOOP id=1 TO 10.
LOOP varn=1 TO 4.
LEAVE id,varn.
LOOP ctr=1 TO 3.
END CASE.
END LOOP.
END LOOP.
END LOOP.
END FILE.
END INPUT PROGRAM.
LIST.

COMPUTE draw=UNIFORM(1).
* Ранжируем каждые три значения переменной draw (т.е. в пределах одних и тех же значений id и var).
RANK VARIABLES=draw BY id varn /RANK INTO rk.

* 4 триады (по 3 значения в каждой) дают 12 переменных.
VECTOR var(12).
COMPUTE var((varn-1)*3+ctr)=rk.

* Сводим наблюдения в одну строку для каждого отдельного значения id.
AGGREGATE
  /OUTFILE=*
  /BREAK=id
  /var1 TO var12 = MAX(var1 TO var12).

RENAME VARIABLES (var1 TO var3 = var1a var1b var1c)
	/(var4 TO var6 = var2a var2b var2c)
	/(var7 TO var9 = var3a var3b var3c)
	/(var10 TO var12 = var4a var4b var4c).