program define spregxt35 , eclass byable(recall) version 11.2 syntax varlist , [fe re be mle vce(str) aux(str) level(str) /// idv(str) itv(str) wit(str) iter(int 10)] qui { gettoken yvar xvar : varlist tempvar dy dy1 X0 Time Yh_ML Ue_ML LYvar Z0 tempname ldye12 By Bx Covx Covy Beta0 Beta1 Beta Cov kb0 kbd0 B V xz Bh xy2 Yh_ML Ue_ML local kx=e(kx) local kb=e(kb) local kbd=`kx' scalar `Beta0' = . scalar `Beta1' = 0 xtset `idv' `itv' local NC=r(imax) local NT=r(tmax) local N=_N gen `Time'=_n gen double `LYvar' = L.`yvar' gen double `dy' = D.`yvar' gen double `dy1'= L.`dy' gen `Z0' = 1 local j = 1 while `j' <= `iter' & abs(`Beta1'-`Beta0') > 0.01 { tempvar Y Ys scalar `Beta0' = `Beta1' gen double `Y' = `yvar' - `Beta0'*`LYvar' local varhp "" foreach var of local xvar { tempvar dxv gen double `dxv' = `var' - `Beta0'*`LYvar' local varhp "`varhp' `dxv'" } if "`be'"=="" & "`fe'"=="" & "`mle'"=="" { xtreg `Y' `varhp' , re `vce' `level' } else { xtreg `Y' `varhp' , `mle' `fe' `be' `vce' `level' } matrix `Bx' = e(b) matrix `Covx' = e(V) gen double `Ys' = `yvar' local k = 1 foreach x of local xvar { replace `Ys' = `Ys' - `Bx'[1,`k'] * `x' local k = `k' + 1 } replace `Z0' = 1 - _b[_cons] tempvar dy ldy ldy2 Eh ldye ldye1 gen double `dy' = D.`Ys' gen double `ldy' = L.`dy' gen double `ldy2'= 2*`dy'+`ldy' matrix accum `xy2' = `ldy' `ldy2' `Z0' matrix `By'= `xy2'[2,1]/`xy2'[1,1] local By1 = `By'[1,1] gen double `Eh'= `ldy2' - `By1' * `ldy' gen double `ldye' = `ldy' * `Eh' by `idv': egen double `ldye1' = sum(`ldye') by `idv': replace `ldye1' = `ldye1'/sqrt(_N) matrix accum `ldye12' = `ldye1' matrix `Covy' = `ldye12'[1,1] / (`xy2'[1,1]^2) scalar `Beta1' = `By'[1,1] local j = `j' + 1 } matrix `Beta' = `By'[1,1],`Bx'[1,1..`kbd'] matrix `kbd0' = J(1,`kbd',0) matrix `Cov' = `Covy',`kbd0' \ `kbd0'',`Covx'[1..`kbd',1..`kbd'] tokenize "L.`yvar' `xvar' " matrix colnames `Cov' = `*' _cons matrix rownames `Cov' = `*' _cons matrix colnames `Beta'= `*' _cons ereturn post `Beta' `Cov', depname("`yvar'") ereturn display , `level' ereturn scalar df_m=`kx'+1 ereturn scalar N=_N } end