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
*ВОПРОС:
Имеется набор данных, где для каждого человека шесть переменных содержат
средний объём выпитого в день, когда употреблялся алкоголь, за шесть месяцев, 
следующих друг за другом. Т.е. наблюдения - люди. Мне требуется построить
два регрессионных уравнения для каждого человека. Одно уравнение - линейная
зависимость объёма выпитого от времени (т.е. от номера месяца), второе - 
квадратичная зависимость объёма выпитого от времени и времени в квадрате.

Выражение 1: DDD = A0 + A1 * Time
Выражение 2: DDD = A0 + A1 * Time + A2 * Time**2

Таким образом, мне нужно добавить к каждому человеку коэффициенты для каждого
из уравнений. Я легко могу это сделать для Выражения 1, используя инструкции, 
которые можно найти в Cohen (или любом другом учебнике по регрессии). Но как 
подсчитать коэффициенты для Выражения 2. На тему пропущенных значений можно
не думать.
***************************************************.

*ОТВЕТ:
* Добавляем в файл данных регрессионные коэффициенты к моделям на уровне наблюдений.
* Размещено в SPSSX-L 03.02.2001. Автор: Raynald Levesque.

* Создадим пример данных для иллюстрации (положим, имеется 5 наблюдений).
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 независимых переменных (IV), а также переменную selecvar чтобы не принимать
* в расчёт наблюдения с номером человека.
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.