set mem 400
log using c:\temp\PROGRAM2.log, replace
quietly{
**************************************************************
*                                                            *
*      THIS COMPUTER PROGRAM IS FOR THE SPECIFICATION        *
*                                                            *
*        Y=ALPHA + LAMDA*WEIGHTINGMATRIX*Y + X*BETA + U,     *
*        U=RHO*WEIGHTINGMATRIX*U + E                         *
*                                                            *
**************************************************************
**************************************************************
*                                                            *
*EXPLANATION OF THE VARIABLES USED IN THE PROGRAM            *
*Y.........VECTOR OF DEPENDENT VARIABLE                      *
*X.........VECTOR OF EXOGENOUS EXPLANATORY VARIABLE          *
*U.........VECTOR OF DISTURBANCES                            *
*MMAT......SPATIAL WEIGHTING MATRIX                          *
*E.........VECTOR OF INNOVATIONS                             *
*LAMDA.....SPATIAL AUTOREGRESSIVE PARAMETER IN DEPENDENT VAR *
*RHO.......SPATIAL AUTOREGRESSIVE PARAMETER IN DISTURBANCE   *
*A2SLS.....2SLS ESTIMATE OF ALPHA  (STEP 1)                  *
*AH2SLS....2SLS ESTIMATE OF ALPHA  (STEP 2)                  *
*B2SLS.....2SLS ESTIMATE OF BETA  (STEP 1)                   *
*BH2SLS....2SLS ESTIMATE OF BETA  (STEP 2)                   *
*LAM2SLS...2SLS ESTIMATE OF LAMDA (STEP 1)                   *
*LAMH2SLS..2SLS ESTIMATE OF LAMDA  (STEP 2)                  *
*RHOGM.....GENERAL MOMENTS ESTIMATOR OF RHO                  *
*NS........SAMPLE SIZE                                       *
**************************************************************

**************************************************************
*                      READ THE DATA                         *
**************************************************************


infile y x1 x2 using c:\temp\var2.dat
save c:\temp\var2.dta, replace
clear
infile m1-m100 using c:\temp\mmat.dat
merge using c:\temp\var2
set matsize 100

mkmat y, mat(YMAT)
mkmat x1, mat(X1MAT)
mkmat x2, mat(X2MAT)
mkmat m1-m100, mat(MMAT)
mat WYMAT = MMAT*YMAT
mat WX2MAT  = MMAT*X2MAT
mat WWX2MAT = MMAT*WX2MAT
svmat WYMAT, n(WY)
svmat WX2MAT, n(WX2)
svmat WWX2MAT, n(WWX2)


**************************************************************
* IN THE FIRST STEP ESTIMATE THE MODEL USING TWO-STAGE LEAST *
*        SQUARES AND GET THE ESTIMATED DISTURBANCES          *
**************************************************************

ivreg y (WY= WX2 WWX2) x1 x2, noconstant 
predict r, resid
gen r2=r^2
egen ss=sum(r2)
scalar S2SLS=ss/(_N-1)
scalar A2SLS=_b[x1]
scalar B2SLS=_b[x2]
scalar LAM2SLS=_b[WY]
}
**************************************************************
*                  STEP 1:  2SLS ESTIMATORS                  *
**************************************************************
scalar list A2SLS LAM2SLS B2SLS S2SLS
**************************************************************



quietly{
**************************************************************
*   IN THE SECOND STEP USE THE ESTIMATES OF DISTURBANCES     * 
*          FOR THE GENERAL MOMENTS(GM) ESTIMATOR             *
**************************************************************

gmproc1 r
}
**************************************************************
*         STEP 2:  NLS ESTIMATORS OF RHO AND SIGMA^2         *
**************************************************************
scalar list RHOGM SGM
**************************************************************
 


quietly{
**************************************************************
*    IN THE THIRD STEP USE THE GM ESTIMATES FOR SPATIAL      *
*  AUTOREGRESSIVE PARAMETER, CORRECT FOR SPATIAL CORRELATION *
*  IN DISTURBANCES AND  ESTIMATE THE CORRECTED MODEL BY 2SLS *
************************************************************** 

merge using c:\temp\var2
drop _merge
merge using c:\temp\mmat
tslsproc2 y x1 x2 m1-m100 RhoGM
}
**************************************************************
*                   STEP 3:  2SLS ESTIMATOR                  *
**************************************************************
scalar list AH2SLS BH2SLS LAMH2SLS SH2SLS
**************************************************************

log close
clear
