xtgls.ado

来自「是一个经济学管理应用软件 很难找的 但是经济学学生又必须用到」· ADO 代码 · 共 1,056 行 · 第 1/2 页

ADO
1,056
字号
*! version 2.2.8  01apr2005
program define xtgls, eclass byable(onecall)
	version 7.0, missing
	if replay() {
		if _by() { error 190 }
                if `"`e(cmd)'"'~=`"xtgls"' {
                        error 301
                }
		syntax [, Level(cilevel)]
		DispRes `level'
		exit
	}
	if _by() {
		local by "by `_byvars'`_byrc0':"
	}
	capture noi `by' Estimate `0'
	nobreak { mac drop X_* }
	exit _rc
end



program define Estimate, eclass byable(recall)
	mac drop X_*
	syntax varlist(ts) [if] [in] [aw] [, /*
		*/ noCONstant Corr(string) FORCE I(varname) 		/*
		*/ ITERate(int `c(maxiter)') Level(cilevel) noLOg IGLS 	/*
		*/ NMK OLS Panels(string) PCSE T(varname) 		/*
		*/ TOLerance(real 1e-7) RHOtype(string) FORCEPCSE ]

	tsunab varlist : `varlist'
	local tol "`tolerance'"
	local toleran

	local rr = cond("`rhotype'"=="", "regress", "`rhotype'")
	global X_rcalc "`rr'"
	global X_nocons `constant'

	if `iterate' < 1 {
		noi di in red `"iterate() must be positive"'
		exit 198
	}

	local qqq = cond("`log'"!="", "quietly", "noisily")
	gettoken depvar varlist: varlist

	_rmcoll `varlist' [`weight'`exp'] `if' `in', `constant'
	local varlist `r(varlist)'
	global X_indv1 `varlist' 
	local kk : word count `varlist'
	global X_rhok "k(`kk')"

	if "`constant'" == "" {
		local varname `varlist' _cons
	}
	else {
		local varname `varlist'
	}
	local varlist `depvar' `varlist'
	global X_depv2 "`depvar'"

	local origdep "`depvar'"
	tsunab origdep : `origdep'
	local origdep : subinstr local origdep "." "_"
	tsrevar `depvar'
	local depvar "`r(varlist)'"
	tsrevar `varlist'
	local varlist "`r(varlist)'"

	if "`weight'" != "" {
		tempvar www
		qui gen double `www' `exp'

		summ `www', meanonly
		qui replace `www' = `www'/r(mean)

		local j = 1
		foreach var of varlist `varlist' {
			tempvar var`j'
			qui gen double `var`j'' = `var'*sqrt(`www')
			local varli1 `varli1' `var`j''
					/* replace the first occurence only */
			local j = `j'+1
		}
		if "`constant'"=="" {
			tempvar cons
			qui gen double `cons' = sqrt(`www')
			local varli1 `varli1' `cons'
			local constant "noconstant"
			local consopt "noconstant"
		}
		local varlist `varli1'
		qui replace `www'=1

		local fixname 1

		global X_wtype "aweight"
		global X_wexp  "`exp'"
		global X_wt `"[aweight=`www']"'
		global X_wtexp `"[aweight`exp']"'
		global X_wtvar `"`www'"'
	}
	else    global X_wt

	if `"`pcse'"' != "" {
		local ols `"ols"'
	}

	global X_if `"`if'"'
	global X_in `"`in'"'

	MapCorr `corr'
	local corr $S_1
	MapPanel `panels'
	local var $S_1
	local panels
	global S_1

	getPCSE `"`0'"' "`pcse'" "`ols'" "`forcepcse'" `var' 	/*
		*/ "`igls'" "`t'" "`i'"
	if "`r(done)'" == "1" { exit }

	if `"`corr'"' != `"0"' | "`constant'" != "" {
		if "`constant'" == "" & "`weight'" == "" {
			tempvar cons
			gen byte `cons' = 1
			global X_cons `"`cons'"'
			local fixname 1
		}
		local copt "nocons"
		global X_cot "nocons"
	}

	global X_bal = (`var'==2)

	xt_iis `i'
	global X_ivar `"`s(ivar)'"'
	if `corr' > 0 | `var' == 2 {
		xt_tis `t'
		global X_tvar `"`s(timevar)'"'
	}

	tokenize `varlist'
	global X_depv `"`1'"'
	mac shift
	global X_indv `"`*'"'

	quietly {
		tempvar touse
		mark `touse' $X_if $X_in
		markout `touse' $X_depv $X_indv $X_ivar $X_tvar
		if `"`www'"' != "" {
			replace `touse' = 0 if `www'<= 0
		}

		preserve
		keep if `touse'

		local nnobs = _N
		if `"`corr'"' != `"0"' {
			sort $X_ivar $X_tvar
			by $X_ivar : replace `touse'=0 if _N==1
			count if `touse'==0
			local drop = r(N)
			if `drop'>0 {
				keep if `touse'
				noi di in blue `"(note: "' in ye `drop' /*
				*/ in blue `" observations dropped"' /*
				*/ `" because only 1 obs in group)"'
			}
		}

		tempvar ii
		egen `ii' = group($X_ivar)
		compress `ii'
		global X_itemp `"`ii'"'
		sort $X_itemp $X_tvar		/* sic, X_tvar may be blank */

		if "`force'" != "" | `"$X_tvar"' != `""' {
			tempvar tt
			if "`force'" == "" {
				egen `tt' = group($X_tvar)
				compress `tt'
			}
			else	qui by $X_itemp : gen `tt' = _n

			global X_ttemp `"`tt'"'
		}

		sort $X_itemp $X_ttemp
		if `corr' > 0 | `var' == 2 {
			qui tsset $X_itemp $X_ttemp 
			global X_ttmp
			tempname ttt
			capture _crcar1 `ttt' opt : $X_itemp , check 	/*
				*/ $X_rcalc $X_rhok
			if _rc {
				local arg $X_rcalc
				di in red "rhotype(`arg') : argument is invalid"
				exit 198
			}
		}
		else if "$X_ttemp" == "" {
			tempvar tvar
			quietly by $X_itemp : gen `tvar' = _n
			quietly compress `tvar'
			global X_tvar `"`tvar'"'
			global X_ttmp 1
			global X_ttemp $X_tvar
			sort $X_itemp $X_ttemp
		}

		if `corr' > 0 & "`force'" == "" {
			checkt $X_tvar `touse'
			if $S_1==2 {
				noi di in red /*
				*/ `"$X_tvar has duplicate values within panel"'
				exit 459
			}
			if $S_1==1 & `"`force'"' == `""' {
				noi di in red /*
*/ `"$X_tvar is not regularly spaced or does not have intervals of 1 -- use "'
				no di in red "the force option to treat the"  /*
				*/ " intervals as though they were regular"
				exit 459
			}
		}

		ChkBal
		if $S_1 == 1 {
			noi di in red `"panels must be balanced"'
			exit 459
		}
		if $S_1 == 2 {
			noi di in red /*
				*/ `"$X_tvar has duplicate values within panel"'
			exit 459
		}
		if $S_1 == 3 {
			noi di in red /*
				*/ "$X_tvar has different values across panels"
			exit 459
		}

		GetNKT
		if $X_ng == 1 & `var'==2 {
			local var = 1
		}
		if $X_nt < 2 & `corr' > 0 {
			local corr 0
		}

		tempname sigmat
		mat `sigmat' = J(1,$X_ng,0)
		global X_sig `"`sigmat'"'

		tempname E Ei
		tempname xEx xEix xEiy xxi xty beta vce pcvce bold
		tempname ovce obeta

		global X_Emat `"`E'"'
		global X_beta `"`beta'"'

		local diff = `tol'+1
		local iter = 0

		if `var' < 2 {
			tempvar ee
			gen double `ee' = .
			global X_ee `"`ee'"'
		}
		else {
			gen double _ee = .
			global X_ee `"_ee"'
		}


		while `iter' < `iterate' & `diff' > `tol' {

			if `"`igls'"' == `""' {
				local diff = 0
			}

			mc`corr' `iter'
			mv`var'

			if `iter' == 0 {
				mat $X_sig = $X_Emat
			}

			mat `Ei' = syminv(`E')

			sort $X_ttemp $X_itemp

			mat glsaccum `xEx' = $X_indv /*
				*/ $X_cons $X_wt, `copt' /*
				*/ glsmat(`E') row($X_itemp) /*
				*/ group($X_ttemp)

			mat glsaccum `xEix' = $X_depv /*
				*/ $X_indv /*
				*/ $X_cons $X_wt, `copt' /*
				*/ glsmat(`Ei') /*
				*/ row($X_itemp) /*
				*/ group($X_ttemp)

			local s = rowsof(`xEix')
			mat `xEiy' = `xEix'[2..`s',1]
			mat `xEix' = `xEix'[2..`s',2..`s']

			global X_ecoe = `s' - 1

			mat accum `xxi' = $X_indv $X_cons $X_wt, `copt'
			mat `xxi' = syminv(`xxi')

			mat vecaccum `xty' = $X_depv $X_indv /*
				*/ $X_cons $X_wt, `copt'

			local nobs = r(N)
			local p = rowsof(`xxi')

			mat `vce' = syminv(`xEix')
			mat `beta' = (`vce' * `xEiy')'

			if `iter' == 0 {
				mat `bold' = `beta'
			}
			else {
				local diff = mreldif(`beta',`bold')
				mat `bold' = `beta'
				`qqq' di in gr `"Iteration "' `iter' /*
				*/ `": tolerance = "' in ye `diff'
			}
			local iter = `iter' + 1
		}
		if `diff' > `tol' {
			noi di in blue "convergence not achieved"
			global X_rc 430
		}
		else	global X_rc 0

		mc`corr' `iter'

		mat `pcvce' = `vce'
		mat `ovce' = `xxi'*`xEx'*`xxi'
		mat `obeta' = `xty'*`xxi'

		if `"`ols'"' != `""' {
			mat `beta' = `obeta'
			mat `vce' = `ovce'
			global X_tle `"ordinary least squares"'
		}
		else {
			global X_tle `"generalized least squares"'
		}

		tempvar ehat
		mat score double `ehat' = `beta'
		replace `ehat' = $X_depv - `ehat'
		calcll `var' `ehat'

		if `"`nmk'"' != `""' {
			tempname s1
			local k = colsof(`beta')
			scalar `s1' = `nobs'/(`nobs'-`k')
			mat `vce' = `vce'*`s1'
		}

		local rho  `"$rho"'
		local bp = colsof(`beta')

/*
		if `"`fixname'"' != `""' {
			local bnam : colsname(`beta')
			local nnam : word count `bnam'
			tokenize `"`bnam'"'
			local `nnam' `"_cons"'
			local bnam `"`*'"'
*/
			local bnam `varname'

			mat colnames `beta' = `bnam'
			mat colnames `vce' = `bnam'
			mat rownames `vce' = `bnam'
			mat colnames `pcvce' = `bnam'
			mat rownames `pcvce' = `bnam'
/*
		}
*/

		global X_miss = `nnobs' - $X_nobs

		if `var' == 0 {
			global X_ecov = 1
		}
		else if `var' == 1 {
			global X_ecov = $X_ng
		}
		else    global X_ecov = $X_ng * ($X_ng + 1) / 2

		global X_ecor : word count $X_rho
		local df = $X_nobs - $X_ecoe - $X_ecov - $X_ecor
		est post `beta' `vce', obs(`nobs') depname("`origdep'") /*
			*/ `dfopt'

		if `"`ols'"'!=`""' { est local vcetype "Panel-corrected" }
		global S_E_vce `"`e(vcetype)'"'     /* double save */

		SetGlob
		restore
		est repost , esample(`touse')

	}
	if "`opt'" != "" { est local rhotype "`opt'" }


	if `"`iter'"' != `""' {
		if `iter' > 1 {
			noi di
		}
	}
	else noi di
	est local chi2type "Wald"
	est local predict "xtgls_p"
	est local cmd "xtgls"
	noi DispRes `level'
end


program define DispRes

	local level `1'
	if "`level'" == "" {
		local level 95
	}

	di _n in gr `"`e(title)'"' _n
	di in gr `"Coefficients:  "' in ye `"`e(coefftype)'"'
	di in gr `"Panels:	  "' in ye `"`e(vt)"'
	local nc : word count `e(rho)'
	if `nc' == 1 {
		local myrho : di %9.4f `e(rho)'
		di in gr `"Correlation:   "' in ye `"`e(corr)'"' in gr /*
		*/ `"  ("' in ye trim(`"`myrho'"') in gr `")"'
	}
	else {
		di in gr `"Correlation:   "' in ye `"`e(corr)'"'
	}
	di

	di in gr `"Estimated covariances"' _col(28) `"= "'  /*
	*/ in ye %9.0g e(n_cv) /*
	*/ in gr _col(49) `"Number of obs"' _col(68) `"= "' in ye %9.0g e(N)

	di in gr `"Estimated autocorrelations"' _col(28) `"= "'  in ye /*
	*/ %9.0g e(n_cr) /*
	*/ in gr _col(49) `"Number of groups"' _col(68) `"= "'in ye %9.0g e(N_g)

	if e(g_min) == e(g_max) {
		di in gr `"Estimated coefficients"' _col(28) `"= "' /*
		*/ in ye %9.0g e(n_cf) /*
		*/ in gr _col(49) `"Time periods"' /*
		*/ _col(68) `"= "' in ye %9.0g e(N_t)
	}
	else {
		di in gr `"Estimated coefficients"' _col(28) `"= "' /*
		*/ in ye %9.0g e(n_cf) /*
		*/ in gr _col(49) `"Obs per group: min"' /*
		*/ _col(68) `"= "' in ye %9.0g e(g_min)
		di in gr _col(64) "avg" _col(68) "= " in ye %9.0g e(g_avg)
		di in gr _col(64) "max" _col(68) "= " in ye %9.0g e(g_max)
	}

	if e(chi2) > 999999 {
		local cfmt `"%9.0g"'
	}
	else	local cfmt `"%9.2f"'

	di /*
	*/ in gr _col(49) `"Wald chi2("' in ye e(df) in gr `")"' /*
	*/ in gr _col(68) `"= "' in ye `cfmt' e(chi2)


	di in gr `"Log likelihood"' _col(28) `"= "'  in ye %9.0g e(ll) /*
	*/ in gr _col(49) `"Prob > chi2"' _col(68) `"= "' in ye /*
	*/ %9.4f chiprob(e(df), e(chi2))

	di

	est display, level(`level')

	if e(df_pear) <= 0 {
		noi di
		noi di in blue `"Note: "' _c
		noi di in blue `"you estimated at least as many quantities "' _c
		noi di in blue `"as you have observations."'
	}
end


program define SetGlob, eclass

	est local title "Cross-sectional time-series FGLS regression"
	est local coefftype `"$X_tle"'
	est local rhotype `"$X_rcalc"'
	capture est scalar rc = $X_rc
	est scalar N = $X_nobs
	est scalar N_g = $X_ng
	est scalar N_t = $X_nt
	if "$X_ntavg" != "" {
		est scalar g_min = $X_ntmin
		est scalar g_avg = $X_ntavg
		est scalar g_max = $X_ntmax
	}
	est local depvar `"$X_depv2"'
	est local ivar `"$X_ivar"'
	if `"$X_ttmp"' == `""' {
		est local tvar `"$X_tvar"'
	}
	est local rho `"$X_rho"'
	est scalar n_cf = $X_ecoe
	est scalar n_cv = $X_ecov
	local nrho : word count $X_rho
	est scalar n_cr = `nrho'
	est scalar df_pear =  e(N) - e(n_cv) - e(n_cr) - e(n_cf)
	est scalar N_miss = $X_miss

	est local vt `"$X_var"'

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?