capture program drop tslsproc4
program define tslsproc4

**************************************************************
* TSLSPROC4 PROCEDURE HAS BEEN DEFINED BELOW                 *     
*                                                            *
* GENERALIZED SPATIAL TWO STAGE LEAST SQUARES PROCEDURE      *
**************************************************************
syntax [varlist]
 
set matsize 100 
mkmat m1-m100, mat(MMAT)
mkmat y, mat(YVEC)
mkmat yn, mat(YNVEC)
mkmat y1, mat(Y1VEC)
mkmat y2, mat(Y2VEC)
mat WY1VEC=MMAT*Y1VEC
mat WY2VEC=MMAT*Y2VEC
mkmat x1, mat(X1VEC)
mkmat x2, mat(X2VEC)
mkmat x3, mat(X3VEC)
mkmat x, mat(XVEC)
scalar RhoGM=RhoGM
mat YSVEC=YVEC-RhoGM*MMAT*YVEC
mat YNSVEC=YNVEC-RhoGM*MMAT*YNVEC
mat Y1SVEC=Y1VEC-RhoGM*MMAT*Y1VEC
mat Y2SVEC=Y2VEC-RhoGM*MMAT*Y2VEC
mat WY1SVEC=WY1VEC-RhoGM*MMAT*WY1VEC
mat WY2SVEC=WY2VEC-RhoGM*MMAT*WY2VEC
mat X1SVEC=X1VEC-RhoGM*MMAT*X1VEC
mat XSVEC=XVEC-RhoGM*MMAT*XVEC
mat WX2VEC=MMAT*X2VEC
mat WWX2VEC=MMAT*WX2VEC
mat WX3VEC=MMAT*X3VEC
mat WWX3VEC=MMAT*WX3VEC
svmat YSVEC, n(YS)
svmat Y1SVEC, n(Y1S)
svmat Y2SVEC, n(Y2S)
svmat YNSVEC, n(YNS)
svmat WY1SVEC, n(WY1S)
svmat WY2SVEC, n(WY2S)
svmat XSVEC, n(XS)
svmat X1SVEC, n(X1S)
svmat WX2VEC, n(WX2)
svmat WWX2VEC, n(WWX2)
svmat WX3VEC, n(WX3)
svmat WWX3VEC, n(WWX3)
rename YS1 YS
rename Y1S1 Y1S
rename Y2S1 Y2S
rename YNS1 YNS
rename WY1S1 WY1S
rename WY2S1 WY2S
rename XS1 XS
rename X1S1 X1S
rename WX21 WX2
rename WWX21 WWX2
rename WX31 WX3
rename WWX31 WWX3

ivreg YS (WY1S WY2S YNS= x1 x2 x3 WX2 WWX2 WX3 WWX3) X1S XS , noconstant
predict rs, resid
gen res2=rs^2
egen ss2sls=sum(res2)
scalar SH2SLS=ss2sls/(_N-1)
scalar C1H2SLS=_b[X1S]
scalar C2H2SLS=_b[XS]
scalar B1H2SLS=_b[YNS]
scalar LAM1H2SLS=_b[WY1S]
scalar LAM2H2SLS=_b[WY2S]

gen E=YS - C1H2SLS*X1S - C2H2SLS*XS- LAM1H2SLS*WY1S - LAM2H2SLS*WY2S-B1H2SLS*YNS

end
exit
