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
* Опубликован: 09.12.2005.
* RL написал этот синтаксис в ответ на вопрос в телеконференции 1 апреля 2000.

********************************************.
*ВОПРОС:
>Я провожу симуляционное исследование в SPSS 9.0, которое включает генерации выборок 
>(скажем, объёма N = 100) с двоичными переменными и затем - изучение их взаимосвязи
>Псевдокод может выглядеть примерно так:
>
>new file .
>input program .
>loop #i = 1 to 100.
>compute x, двоичная переменная
>compute y, двоичная переменная, каким-то образом связаная с x
>end loop .
>...etc.
>crosstabs y by x /......
>
>Приведённый выше код должен находиться в цикле !do loop макроса таким образом, чтобы я мог генерировать
>большое число выборок, например 10 000.  Проблема в том, что я хочу записать результаты
>кросстабуляции для каждой выборки во внешний файл.
>Здесь я сталкиваюсь с трудностями: когда я записываю результаты во внешний файл через /write = ..., внешний файл реинициализируется после построения каждой перекрёстной таблицы. В результате в файле оказываются результаты кросстабуляции лишь для последней выборки.
>Я думал, получится это обойти, указывая в качестве имени внешнего файла '*', таким образом записывая все результаты в текущий файл, но и тут неудача, т.к. для команды crosstabs/write =  ... звёздочка оказывается недопустимым именем файла.
>
>Кто-нибудь знает как заставить это работать?  
>
******************************************.

*ОТВЕТ.

DEFINE !DOIT(size=!TOKENS(1)
		/nbrec=!TOKENS(1))

!DO !count=1 !TO !size
new file .
input program .
loop #i = 1 to !nbrec.
compute x=TRUNC(UNIFORM(1)*2).
compute y=TRUNC(UNIFORM(1)*2).
end case.
end loop .
end file.
end input program.

VECTOR cell(4F8).
COMPUTE cell(1+x*2+y)=1.
COMPUTE numb=!count.
AGGREGATE
  /OUTFILE=*
  /BREAK=numb
  /cell_00 = SUM(cell1) /cell_01 = SUM(cell2) 
  /cell_10 = SUM(cell3) /cell_11 = SUM(cell4).

/* Cell_00 содержит число наблюдений, где x=0 и y=0./
/* Cell_01 содержит число наблюдений, где x=0 и y=1./
/* Cell_10 содержит число наблюдений, где x=1 и y=0./
/* Cell_11 содержит число наблюдений, где x=1 и y=1./
LIST.

!IF (!count=1) !THEN
SAVE OUTFILE='sample.sav'   /COMPRESSED.
!ELSE
ADD FILES /FILE=*   /FILE='sample.sav'.
SAVE OUTFILE='sample.sav'   /COMPRESSED.
!IFEND.

!DOEND.
!ENDDEFINE.

!DOIT size=3 nbrec=200.

GET FILE='sample.sav'.