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
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
* Тема: Проверка Уайта (White's test) на гетероскедастичность в SPSS.
* Ключевые слова: гомоскедастичность, гетероскедастичность, регрессия, проверка, Уайт, White's test, сумма квадратов, R, REGRESSION, MATRIX, регрессор, предиктор, LOOP.
* Опубликован: 04.04.2002, перевод: 02.11.2008.
* Автор: Marta Garcia-Granero / Gwillym Pryce / Ray Levesque.
* Перевод: А. Балабанов.
* Размещение: http://www.spsstools.ru/Syntax/RegressionRepeatedMeasure/WhiteTestStatisticsAndSignificance.txt (.sps).
* Проверено: SPSS 13.0.

**********************************************************************
* Рекомендую, прежде всего, внимательно прочесть статью "Heterocedasticity: testing and correcting in SPSS"
 ("Проверка и коррекция гетероскедастичности в SPSS"), автор: Gwilym Pryce (см. http://www.spsstools.ru/spss.htm#Heteroscedasticity).
  Этот макрос основывается на данной статье.
* Код SPSS: Marta Garcia-Granero, 04.04.2002.

* Последовательность действий:

* (Провести исходный регрессионный анализ, сохранив нестандартизированные остатки - добавлено перев).

* Потребуется вычислить некоторые дополнительные переменные:
	* Квадраты нестандартизированных остатков;
	* Квадраты значений каждого предиктора модели, который подлежит проверке;
	* Попарные произведения всех предикторов.

* Построить регрессионную модель для предсказания квадратов остатков
	с помощью предикторов, их квадратов и попарных произведений.

* Умножить R-квадрат этой модели на размер выборки (n*R-square).

* Это и будет статистикой Уайта. Её значимость проверяется сравнением с критическим значением
	из распределения Хи-квадрат с "p" степенями свободы, где "p" есть общее число регрессоров
	в последней регрессионной модели (предикторы+квадраты+попарные произведения).


* ВАЖНО:
* Если какой-либо из исходный предикторов является двоичным (фиктивная переменная), его квадрат
	будет идентичен оригинальной переменной, т.е. они будут идеально коррелировать.
* В этом случае алгоритм регрессии выкинет одну из этих переменных из модели (либо исходную
	переменную, либо её квадрат), и "p", таким образом, следует уменьшить на 1 единицу для каждой
	двоичной переменной, включаемой в модель.


* МАКРОС ДЛЯ ПРОВЕРКИ УАЙТА *

* МАКРОС требует указания 5 аргументов:
*   а) числа предикторов,
*   б) числа попарных произведений, которые будут вычислены:
"	число предикторов*(число предикторов-1)/2"
*      [я не смогла найти другого способа, чтобы передать в команду VECTOR это число],
*   в) "p" (число предикторов+число квадратов+число попарных произведений), скорректированное на число двоичных предикторов,
*   г) имя зависимой переменной и
*   д) список предикторов в виде "первый предиктор TO последний предиктор"
*      (предикторы должны быть соответственно упорядочены и расположены по соседству в файле данных).

* Определение МАКРОСА.

DEFINE whitest(!POSITIONAL !TOKENS(1) /!POSITIONAL !TOKENS(1)
              /!POSITIONAL !TOKENS(1) /!POSITIONAL !TOKENS(1)
              /!POSITIONAL !CMDEND).

* >>>> Первая регрессионная модель для получения остатков <<<< *.
REGRESSION
  /STATISTICS R ANOVA
  /DEPENDENT !4
  /METHOD=ENTER !5
  /SCATTERPLOT=(*ZRESID,*ZPRED)
  /SAVE RESID(residual) .

* >>>> Новые переменные <<<< *.
* Новая зависимая переменная.
COMPUTE sq_res=residual**2.
* Избавимся от лишних переменных (зависимая и остатки).
* Проверьте, чтобы указанные пути для сохранения временных файлов существовали у вас на компьютере - примеч. перев.
SAVE OUTFILE='c:\\temp\\tempdat_.sav'
   /keep=sq_res !5.
GET FILE='c:\\temp\\tempdat_.sav'.
EXECUTE.
* Векторы для новых предикторов.
VECTOR v=!5 /sq(!1) /cp(!2).
* Квадраты всех предикторов.
LOOP #i=1 to !1.
COMPUTE sq(#i)=v(#i)**2.
END LOOP.
* Попарные произведения всех предикторов.
* (алгоритм вычисления модифицировал Ray Levesque).
COMPUTE #idx=1.
LOOP #cnt1=1 TO !1-1.
LOOP #cnt2=#cnt1+1 TO !1.
COMPUTE cp(#idx)=v(#cnt1)*v(#cnt2).
COMPUTE #idx=#idx+1.
END LOOP.
END LOOP.
EXECUTE.

* >>>> Проверка Уайта <<<< *.
* Регрессия переменной sq_res на все прежние и вновь созданные предикторы.
REGRESSION /VARIABLES=ALL
  /STATISTICS R
  /DEPENDENT sq_res
  /METHOD= ENTER
  /SAVE RESID(residual) .
* Выдача результатов.
* Исходный код: Gwilym Pryce (сделаны незначительные изменения).
matrix.
compute p=!3.
get sq_res /variables=sq_res.
get residual /variables=residual.
compute sq_res2=residual&**2.
compute n=nrow(sq_res).
compute rss=msum(sq_res2).
compute ii_1=make(n,n,1).
compute i=ident(n).
compute m0=i-((1/n)*ii_1).
compute tss=transpos(sq_res)*m0*sq_res.
compute regss=tss-rss.
print regss
 /format="f8.4"
 /title="Сумма квадратов модели".
print rss
 /format="f8.4"
 /title="Сумма квадратов остатков".
print tss
 /format="f8.4"
 /title="Общая сумма квадратов".
compute r_sq=1-(rss/tss).
print r_sq
 /format="f8.4"
 /title="R-квадрат".
print n
 /format="f4.0"
 /title="Объем выборки (N)".
print p
 /format="f4.0"
 /title="Число (новых) предикторов (P)".
compute wh_test=n*r_sq.
print wh_test
 /format="f8.3"
 /title="Общая проверка Уайта на гетероскедастичность"+
 " (Хи-квадрат, df=P)".
compute sig=1-chicdf(wh_test,p).
print sig
 /format="f8.4"
 /title="Собств. уровень значимости для Хи-квадрат, df=P (H0:"+
 "гомоскедастичность)".
end matrix.

!ENDDEFINE.

* Пример данных №1: числовые предикторы *.
INPUT PROGRAM.
- VECTOR x(5).
- LOOP #I = 1 TO 100.
-  LOOP #J = 1 TO 5.
-   COMPUTE x(#J) = NORMAL(1).
-  END LOOP.
-  END CASE.
- END LOOP.
- END FILE.
END INPUT PROGRAM.
execute.
* x1 - зависимая, x2 TO x5 - предикторы.
rename variables x1=y.
execute.
* Вызов МАКРОСА: есть 4 предиктора, следовательно, 6 попарных произведений и 14 регрессоров в проверке.
whitest 4 6 14 y x2 TO x5.


* Пример данных №2: один двоичный предиктор *.
INPUT PROGRAM.
- VECTOR x(5).
- LOOP #I = 1 TO 100.
-  LOOP #J = 1 TO 5.
-   COMPUTE x(#J) = NORMAL(1).
-  END LOOP.
-  END CASE.
- END LOOP.
- END FILE.
END INPUT PROGRAM.
execute.
RECODE x2  (Lowest thru 0=0)  (0 thru Highest=1)  .
EXECUTE .

* x1 - зависимая, x2 TO x5 - предикторы.
rename variables x1=y.
execute.
* Вызов МАКРОСА: как и в №1, 4 предиктора, 6 попарных произведений, но ТОЛЬКО 13 регрессоров.
whitest 4 6 13 y x2 TO x5.

* Как можно видеть в выдаче, X2 не был включён в модель.