capture program drop nlequ
program define nlequ
if "`1'"== "?" {
global S_1 " rho sigma2 "
global rho=1
global sigma2=1
exit
}
replace `1'=v1*$rho +v2*$rho^2 +v3*$sigma2
end

capture program drop gmproc1
program define gmproc1

*GMPROC PROCEDURE HAS BEEN DEFINED BELOW;
*****************************************************************
*GENERAL MOMENTS ESTIMATION PROCEDURE FOR ESTIMATION OF RHO     * 
*MOMENT EQUATIONS INVOLVING                                     * 
*E’E, (ME)’(ME),  AND (ME)’E, WHERE ME=WEIGHTINGMATRIX*E        *
*****************************************************************
syntax [varlist]
mkmat r, mat(uh)

mat vh=MMAT*uh
mat wh=MMAT*vh

svmat uh, n(uh)
svmat vh, n(vh)
svmat wh, n(wh)

*****************************************************************
*CALCULATE VARIOUS SAMPLE MOMENTS APPEARING IN THE SYSTEM       *
*OF EQUATIONS FOR RHOH FROM ESTIMATED DISTURBANCES              *
*****************************************************************

gen u2h=uh*uh
gen v2h=vh*vh
gen uvh=uh*vh
gen vwh=vh*wh
gen w2h=wh*wh
gen uwh=uh*wh

****************************************************************
*CALCULATE TR(MMAT'MMAT)/(SAMPLE SIZE)                         *
****************************************************************
mat MMM=trace(MMAT'*MMAT)/100

egen u2hm = mean(u2h)
egen v2hm = mean(v2h)
egen uvhm = mean(uvh)
egen vwhm = mean(vwh)
egen w2hm = mean(w2h)
egen uwhm = mean(uwh)
gen h11=-2*uvhm
gen h12=v2hm
gen h13=-1
gen h21=-2*vwhm
gen h22=w2hm
gen h23=-trace(MMM)
gen h31=-(v2hm+uwhm)
gen h32=vwhm
gen h33=0
gen hy1=-u2hm
gen hy2=-v2hm
gen hy3=-uvhm

collapse h11 h12 h13 hy1 h21 h22 h23 hy2 h31 h32 h33 hy3

mkmat h11 h21 h31, matrix(h1t)
mkmat h12 h22 h32, matrix(h2t)
mkmat h13 h23 h33, matrix(h3t)
mkmat hy1 hy2 hy3, matrix(hyt)
mat h1=h1t'
mat h2=h2t'
mat h3=h3t'
mat hy=hyt'
set obs 3
svmat h1, n(v1)
svmat h2, n(v2)
svmat h3, n(v3)
svmat hy, n(z)
list v1 v2 v3 z

*****************************************************************
*PREPARE ESTIMATION OF RHO  AND SE FROM THREE EQUATIONS BY NLS  * 
*****************************************************************

nl equ z, init(rho=0.7, sigma2=1)

set obs 100
gen RhoGM=$rho
scalar RHOGM=$rho
scalar SGM=$sigma2

end
exit
