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
* Тема: Использование дисперсии остатков в качестве функции потерь в нелинейной регрессии.
* Ключевые слова: нелинейная регрессия, функция потерь, loss function, NLR, CNLR, LAG, LEAVE, макрос, интерполяция.
* Опубликован: 03.02.2002, перевод: 03.11.2008.
* Автор: Raynald Levesque, rlevesque@videotron.ca, http://www.spsstools.net.
* Перевод: А. Балабанов.
* Размещение: http://www.spsstools.ru/Syntax/RegressionRepeatedMeasure/NLRwithVarianceAsLossFunction.txt(.sps).
* Проверено: SPSS 13.0.

* (Вопрос) Как можно включить в процедуру нелинейной интерполяции функцию потерь на основе дисперсии остатков?.

*(Ответ) Для иллюстрации я использую пример со стр. 98 издания SPSS Regression Models 9.0, но включаю
* в качестве функции потерь дисперсию остатков.
* Это НЕТРИВИАЛЬНОЕ решение, т.к. для вычисления функции потерь нам требуются команды трансформации (преобразования данных, прохода (считки) файла).
* Кроме того, после выполнения команды MODEL до следующей процедуры преобразования данных вы не можете использовать функцию LAG.
* Автор: Raynald Levesque, rlevesque@videotron.ca, 03.02.2002.

DATA LIST LIST /pop.
BEGIN DATA
3.895
5.267
7.182
9.566
12.834
16.985
23.069
31.278
38.416
49.924
62.692
75.734
91.812
109.806
122.775
131.669
150.697
178.464
END DATA.

COMPUTE decade=$CASENUM-1.
COMPUTE yr=1790+decade*10.
FORMATS decade yr(F8.0).
LIST.

SET MPRINT=no.
*//////////////////////.
DEFINE !leave (!POS=!TOKENS(1) /!POS=!TOKENS(1))
!DO !cnt=1 !TO 17
DO IF idx=!cnt.
LEAVE !CONCAT(v,!cnt).
END IF.
!DOEND
!ENDDEFINE.
*//////////////////////.
SET MPRINT=yes.
COMPUTE idx=$CASENUM.

* Нелинейная регрессия.
MODEL PROGRAM A=3.9 B=-0.29 C=200 .
COMPUTE pred_ = C/(1+EXP(A+ B * decade)).
COMPUTE resid_ = pop - PRED_.

* Следующие 3 строчки копируют все значения resid_ в ПОСЛЕДНЮЮ строку файла данных.
VECTOR v(18F8.0).
COMPUTE v(idx)=resid_.
!leave.

* Вычисления дисперсии остатков (resid_). 
COMPUTE sigma2=SD(v1 TO v18)**2.
* Сохранение только значения, полученного в ПОСЛЕДНЕЙ строке.
IF idx<18 sigma2=0.
* sigma2 - и есть текущее значение функции потерь.

CNLR pop
  /OUTFILE='C:\\temp\\SPSSFNLR.TMP'
  /PRED pred_ 
  /LOSS sigma2
  /BOUNDS C >= 150
  /CRITERIA ITER 20 STEPLIMIT 2 ISTEP 1E+20 .