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
* BREUSCH-PAGAN & KOENKER TEST MACRO *
* See 'Heteroscedasticity: Testing and correcting in SPSS'
* by Gwilym Pryce, for technical details.
* Code by Marta Garcia-Granero 2002/10/28.
 
* The MACRO needs 3 arguments:
* the dependent, the number of predictors and the list of predictors
* (if they are consecutive, the keyword TO can be used) .
 
* (1) MACRO definition (select an run just ONCE).
 
DEFINE bpktest(!POSITIONAL !TOKENS(1) /!POSITIONAL !TOKENS(1) /!POSITIONAL !CMDEND).
* Regression to get the residuals and residual plots.
REGRESSION
/STATISTICS R ANOVA
/DEPENDENT !1
/METHOD=ENTER !3
/SCATTERPLOT=(*ZRESID,*ZPRED)
/RESIDUALS HIST(ZRESID) NORM(ZRESID)
/SAVE RESID(residual) .
do if $casenum=1.
print /"Examine the scatter plot of the residuals to detect"
/"model misspecification and/or heteroscedasticity"
/""
/"Also, check the histogram and np plot of residuals "
/"to detect non normality of residuals "
/"Skewness and kurtosis more than twice their SE indicate non-normality ".
end if.
* Checking normality of residuals.
DESCRIPTIVES
VARIABLES=residual
/STATISTICS=KURTOSIS SKEWNESS .
* New dependent variable (g) creation.
COMPUTE sq_res=residual**2.
compute constant=1.
AGGREGATE
/OUTFILE='tempdata.sav'
/BREAK=constant
/rss = SUM(sq_res)
/N=N.
MATCH FILES /FILE=*
/FILE='tempdata.sav'.
EXECUTE.
if missing(rss) rss=lag(rss,1).
if missing(n) n=lag(n,1).
compute g=sq_res/(rss/n).
execute.
* BP&K tests.
* Regression of g on the predictors.
REGRESSION
/STATISTICS R ANOVA
/DEPENDENT g
/METHOD=ENTER !3
/SAVE RESID(resid) .
*Final report.
do if $casenum=1.
print /" BP&K TESTS"
/" ==========".
end if.
* Routine adapted from Gwilym Pryce.
matrix.
compute p=!2.
get g /variables=g.
get resid /variables=resid.
compute sq_res2=resid&**2.
compute n=nrow(g).
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(g)*m0*g.
compute regss=tss-rss.
print regss
/format="f8.4"
/title="Regression SS".
print rss
/format="f8.4"
/title="Residual SS".
print tss
/format="f8.4"
/title="Total SS".
compute r_sq=1-(rss/tss).
print r_sq
/format="f8.4"
/title="R-squared".
print n
/format="f4.0"
/title="Sample size (N)".
print p
/format="f4.0"
/title="Number of predictors (P)".
compute bp_test=0.5*regss.
print bp_test
/format="f8.3"
/title="Breusch-Pagan test for Heteroscedasticity"
+ " (CHI-SQUARE df=P)".
compute sig=1-chicdf(bp_test,p).
print sig
/format="f8.4"
/title="Significance level of Chi-square df=P (H0:"
+ "homoscedasticity)".
compute k_test=n*r_sq.
print k_test
/format="f8.3"
/title="Koenker test for Heteroscedasticity"
+ " (CHI-SQUARE df=P)".
compute sig=1-chicdf(k_test,p).
print sig
/format="f8.4"
/title="Significance level of Chi-square df=P (H0:"
+ "homoscedasticity)".
end matrix.
!ENDDEFINE.
 
* (2) Sample data (replace by your own)*.
 
INPUT PROGRAM.
- VECTOR x(20).
- LOOP #I = 1 TO 50.
- LOOP #J = 1 TO 20.
- COMPUTE x(#J) = NORMAL(1).
- END LOOP.
- END CASE.
- END LOOP.
- END FILE.
END INPUT PROGRAM.
execute.
 
* x1 is the dependent and x2 TO x20 the predictors.
 
* (3) MACRO CALL (select and run).
 
BPKTEST x1 19 x2 TO x20.