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
* ВОПРОС: Как добавить параметры регрессии по наблюдениям (casewise regression) в файл данных.
* ОТВЕТ (автор rlevesque@videotron.ca) размещён в SPSSX-L.

/* ПОЯСНЕНИЕ. Под casewise-регрессией тут понимается проведение регрессионного анализа */
/* отдельно по каждому наблюдению таким образом, что значения из разных переменных */
/* одной и той же строки формируют наблюдения для анализа. В результате получаем столько */
/* результатов регрессионного анализа, сколько строк было в исходном файле данных. И требуется */
/* к каждой строке добавить результаты анализа - коэффициенты перед независимыми переменными */
/* Здесь приводится пример ситуации, где возможно использование такой casewise-регрессии. */
/* Допустим, у нас есть измерения степени алкогольного опьянения отдельных людей в разные */
/* моменты времени. Для каждого человека результаты этих измерений содержатся в переменных */
/* drink1, drink2 и т.д. Ясно, поскольку эти наблюдения разделяются временем, то именно время может быть независимой переменной, определяющей опьянение. Таким образом, в этом примере получаем результаты регрессионного анализа для каждого отдельного человека относительно */
/* того, как влияет временной фактор и квадрат временного фактора на степень опьянения. - А.Б.*/


* Смоделируем данные (допустим, есть результаты наблюдений 5 объектов в 6 моментов времени).
INPUT PROGRAM.
LOOP id=1 TO 5.
VECTOR drink(6F8.0).
LOOP #time=1 TO 6.
COMPUTE drink(#time)=RND( UNIFORM(9)).
END LOOP.
END CASE.
END LOOP.
END FILE.
END INPUT PROGRAM.
LIST.
SAVE OUTFILE='c:\\temp\\mydata.sav'.

*Следующая строка разрешает вывод текста макроса в окно результатов.
SET MPRINT=yes.

* Начнём.
STRING newname(A8).
* Следующее будет работать, если в файле данных менее 10,000,000 строк.
COMPUTE newname=CONCAT('v',LTRIM(STRING($CASENUM,F7.0))).
FLIP /newnames=newname.

* Определим 2 независимые переменные и фильтрующую переменную selecvar чтобы пропустить строку-идентификатор ID.
COMPUTE time1 = $casenum-1.
COMPUTE selecvar=time1>0.
COMPUTE time2 = time1**2.


*//////////////////////////////////////////////.
DEFINE !doit(nbvar=!TOKENS(1))

* Сохраняем результаты регрессии для каждого наблюдения в отдельный файл.
!DO !cnt=1 !TO !nbvar
REGRESSION
  /SELECT= selecvar EQ 1
  /MISSING LISTWISE
  /STATISTICS COEFF OUTS R ANOVA
  /CRITERIA=PIN(.05) POUT(.10)
  /NOORIGIN
  /DEPENDENT !CONCAT('v',!cnt)
  /METHOD=ENTER time1 time2
  /OUTFILE=COVB( !QUOTE(!CONCAT('C:\\temp\\param',!cnt,'.sav'))) .
!DOEND

* Собираем все результаты в один файл, оставляем только коэффициенты..
GET FILE= 'C:\\temp\\param1.sav'.
!DO !cnt=2 !TO !nbvar
ADD FILES FILE=* /FILE=!QUOTE(!CONCAT('C:\\temp\\param',!cnt,'.sav')) .
!DOEND
SELECT IF RTRIM(rowtype_)="EST".

* добавляем коэффицинты к исходному файлу данных.
MATCH FILES /FILE=*
 /RENAME (depvar_ rowtype_ varname_ = d0 d1 d2)
 /FILE='C:\\Temp\\mydata.sav'
 /DROP= d0 d1 d2.
EXECUTE.
!ENDDEFINE.
*//////////////////////////////////////////////.


**** Вызов макроса (замените 5 на число наблюдений в вашем файле).
**** (Этот шаг может быть тоже автоматизирован, если есть необходимость).
!doit nbvar=5.