xtivreg.ado

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

ADO
1,891
字号
*! version 1.3.2  01apr2005
program define xtivreg, sortpreserve byable(onecall)
	if _by() {
		local BY `"by `_byvars'`_byrc0':"'
	}
	`BY' _vce_parserun xtivreg, panel jkopts(eclass) : `0'
	if "`s(exit)'" != "" {
		exit
	}

	version 7.0, missing
	if replay() {
		if `"`e(cmd)'"' != "xtivreg"  { error 301 }
		if _by() { error 190 }
	
		syntax , [level(cilevel) ]

		if "`e(model)'" == "fd" {
			DispFD , level(`level')
		}
		else if "`e(model)'" == "fe" {
			DispFE , level(`level')
		}	
		else if "`e(model)'" == "g2sls" | "`e(model)'" == "ec2sls" {
			if "`e(model)'" == "ec2sls" {
				local ec2sls "ec2sls"
			}	
			DispRE , level(`level') `ec2sls'
		}	
		else if "`e(model)'" == "be" {
			DispBE , level(`level')
		}	
		else {
			di as err "unknown model of xtivreg"
			error(198)
		}	
		DispI
		exit	
	}

	`BY' Estimate `0'
end

program Estimate, eclass byable(recall)
	local n 0

	gettoken lhs 0 : 0, parse(" ,[") match(paren)
	IsStop `lhs'
	if `s(stop)' { error 198 }
	while `s(stop)'==0 { 
		if "`paren'"=="(" {
			local n = `n' + 1
			if `n'>1 { 
capture noi error 198 
di as err `"syntax is "(all instrumented variables = instrument variables)""'
exit 198
			}
			gettoken p lhs : lhs, parse(" =")
			while "`p'"!="=" {
				if "`p'"=="" {
capture noi error 198 
di as err `"syntax is "(all instrumented variables = instrument variables)""'
di as err `"the equal sign "=" is required"'
exit 198 
				}
				local end`n' `end`n'' `p'
				gettoken p lhs : lhs, parse(" =")
			}
			tsunab end`n' : `end`n''
			tsunab exog`n' : `lhs'
		}
		else {
			local exog `exog' `lhs'
		}
		gettoken lhs 0 : 0, parse(" ,[") match(paren)
		IsStop `lhs'
	}
	local 0 `"`lhs' `0'"'

	tsunab exog : `exog'
	tokenize `exog'
	local lhs "`1'"
	local 1 " " 
	local exog `*'

	syntax [if] [in] [, FIRST noSA I(varname) /*
		*/ RE FE FD BE 	REGress THeta noConstant /* 
		*/ EC2sls SMall LM Level(cilevel) ]

	local id "`i'"
	if "`id'" == "" {
		local id "`_dta[iis]'"
	}

	capture tsset
	local id1 "`r(panelvar)'"
	local tvar "`r(timevar)'"

	local thetad `theta'

	if "`fd'" != "" & "`tvar'" == "" {
		di as err "must specify panelvar in tsset"
		di as err "see help {help tsset##|_new:tsset}"
		exit 459 
	}	

	if "`fd'" != "" & "`id1'" == "" {
		di as err "must specify panelvar in tsset"
		di as err "see help {help tsset##|_new:tsset}"
		exit 459 
	}	
	
	if "`id1'" != "" & "`id'" != "" & "`id1'" != "`id'" {
		di as err "id specified does not agree with tsset id"
		di "specified id is |`id'|"
		di "tsset id is |`id1'|"
		exit 198
	}

	if "`id'" == "" & "`id1'" != "" {
		local id "`id1'"
	}

	if "`id'" == "" {
		di as err "group variable not set"
		exit 198
	}	
	else {
		iis `id'
	}	


	 
	if "`tvar'" != "" {
		local t "`tvar'"
	}

	
	if "`t'" != "" {
		local targ " t(`t') "
	}

	_rmcoll `exog' 
	local nocoll "`r(varlist)'"
	_rmcoll `exog1' 
	local nocoll "`nocoll' `r(varlist)'"

	foreach var of local exog {
		local n 0
		local temp : subinstr local nocoll "`var'" "`var'", /* 
			*/ word count( local n) 
		if `n' == 1 {
			local exog_n "`exog_n' `var'"
		}
	}
	local exog "`exog_n'"
	
	local exog : subinstr local exog "  " " ", all

	foreach var of local exog1 {
		local n 0
		local temp : subinstr local nocoll "`var'" "`var'", /* 
			*/ word count( local n) 
		if `n' == 1 {
			local exog1_n "`exog1_n' `var'" 
		}
	}
	local exog1 "`exog1_n'"
	

	marksample touse
	markout `touse' `lhs' `exog' `exog1' `end1' `id' `t'

	qui count if `touse' >0 & `touse'<.
	if r(N)==0 {
		error 2000
	}	


	qui xtsum `id' if `touse'
	if r(n) == r(N) {
		di as err "the sample specifies cross-sectional data"
di as err "{help xtivreg##|_new:xtivreg} is not designed for "	/*
			*/ "cross-sectional data"
di as err "use {help ivreg##|_new:ivreg} with cross-sectional data"
		exit 498
	}	

	Subtract inst : "`exog1'" "`exog'"
	local endo_ct : word count `end1'
	local ex_ct : word count `inst'
	if `endo_ct' > `ex_ct' {
		di as err "equation not identified; must have at " /*
		*/ "least as many instruments not in"
		di as err "the regression as there are "           /*
		*/ "instrumented variables"
		exit 481
	}


	if "`re'`be'`fe'`fd'" == "" {
		local model "re"
	}
	else {
		if "`re'`be'`fe'`fd'" !=  "`re'" /* 
			*/ & "`re'`be'`fe'`fd'" !=  "`fe'" /* 
			*/ & "`re'`be'`fe'`fd'" !=  "`be'" /* 
			*/ & "`re'`be'`fe'`fd'" !=  "`fd'" { 
			di as err "only one model may be specified "
			exit 198
		}
		else {
			local model "`re'`be'`fe'`fd'" 
		}	
	}

	if "`first'" != "" & "`regress'" != "" {
		di as err /*
		*/ "options first and regress may not be specified together"
		exit 198
	}	
	
		
	if "`model'" != "fd" & "`constant'" != "" {
		di as err "option noconstant invalid in `model' model"
		exit 198
	}	

	if "`model'" != "re" & "`ec2sls'" != "" {
		di as err "option ec2sls may not be specified with `model'"
		exit 198
	}	
	
	if "`model'" != "re" & "`nosa'" != "" {
		di as err "option nosa may not be specified with `model'"
		exit 198
	}	
	
	if "`model'" != "re" & "`theta'" != "" {
		di as err "option theta may not be specified with `model'"
		exit 198
	}	

	if "`end1'" == "" {
		di as err "no endogenous variables specified"
		exit 198
	}

	if "`regress'" != "" {
		local inst "`end1'"
	}	
			
	

	local names "`end1' `exog' "

	tsrevar `lhs', substitute
	local lhs_t "`r(varlist)'"

	tsrevar `end1', substitute
	local end1_t "`r(varlist)'"

	tsrevar `exog', substitute
	local exog_t "`r(varlist)'"

	tsrevar `inst', substitute
	local inst_t "`r(varlist)'"

	local allvar " `lhs_t' `end1_t' `exog_t' `inst_t' "

	local k : word count `exog' `endog'

	local xvars " `end1_t' `exog_t' " 

	local coefs_ts "`end1_t' `exog_t'"
	local coefs "`end1' `exog'"
	
	preserve 
		qui keep if `touse'


		if "`model'" == "fe" {

			tempvar res_r res_r2 ssr_ra ssr_ura

			
			local cnt 1
			foreach var in `end1_t' {
				tempname endp`cnt' endpb`cnt' xbt uit
				
 				qui reg `var' `exog_t' `inst_t'
				qui predict double `endp`cnt'', xb
				
 				qui xtreg `var' `exog_t' `inst_t', fe i(`id')
				qui predict double `xbt', xb
				qui predict double `uit', u
				qui gen double `endpb`cnt''=`xbt'+`uit'
				
				local end1_tpb " `end1_tpb' `endpb`cnt'' "
				local end1_tp " `end1_tp' `endp`cnt'' "
				local cnt = `cnt' + 1
			}
		

			if "`lm'" != "" {
				qui reg `lhs_t' `exog_t' `end1_t' /*
					*/ ( `exog_t' `inst_t')
				qui predict double `res_r', res
				qui gen double `res_r2'=`res_r'*`res_r'
				qui sum `res_r2'
				scalar `ssr_ra'=r(sum)
			
				tempname xb_lm ui_lm yhat_lm yhat_lm2 
				tempname mss_lm tss_lm res_urlm
				tempname r2_lm res_r2  mss_lm tss_lm N_lm 
			
				qui xtreg `res_r' `end1_tpb' `exog_t' ,/*
					*/ fe i(`id')
				scalar `N_lm'=e(N)

				qui predict double `res_urlm', e
				qui replace `res_urlm'=`res_urlm'*`res_urlm'
				qui sum `res_urlm'
				scalar `ssr_ura'=r(sum)

				tempname lm_u
				scalar `lm_u'=`N_lm'*( `ssr_ra'-`ssr_ura') /*
					*/ /`ssr_ra'
			}

			/* now get rss_rlm rss_ulm  for F-test */

			tempname rss_rlm rss_ulm
			
			qui regress `lhs_t' `end1_tpb' `exog_t'
			scalar `rss_rlm'=e(rss)
			
			qui xtreg `lhs_t' `end1_tpb' `exog_t', fe i(`id')
			scalar `rss_ulm'=e(rss)
			
		}	
		
	
		tempvar res_w res_b i_obs i_obs2 theta 
		tempname sig_u2 sig_e2 n N K ti_min ti_max ti_ave Tcon
		tempname Zi ubPub xpx xzx trmat tr 

		scalar `K'=`k'+2 
					/* Get group and time information */

		if "`model'" == "fd" {
			local obif " if _n > 1"
		}	
		qui sort `id' `t'
		qui by `id': gen long `i_obs'=1  `obif'
		qui by `id': gen long `i_obs2'=sum(`i_obs')  `obif'
		qui by `id': replace `i_obs'=cond(_n==_N,`i_obs2'[_N],.) /*
			*/  `obif'

		qui sum `i_obs' `obif'
		scalar `n'=r(N)			/* n = number of groups */
		scalar `ti_min'=r(min)
		scalar `ti_max'=r(max)
		scalar `ti_ave'=r(mean)

		if `ti_min' == `ti_max' {
			scalar `Tcon' = 1
		}
		else {
			scalar `Tcon' = 0
		}	

		qui by `id': replace `i_obs'=`i_obs'[_N]

							/* Do FD IV */
		if "`model'" == "fd" {
			
			if "`exog_t'" != "" {
				local exog_tl "exog_t( `exog_t' )" 
			}
			else {
				local exog_tl ""
			}	

			if "`first'" != "" {
				foreach yvar of local end1 {
					di
					di as text "First-stage first-"/*
						*/"differenced regression"
					regress d.`yvar' d.(`exog' `inst') ,/*
						*/ `constant' level(`level')
				}	
			}		
		
			FirstD `lhs_t' , `exog_tl' end1_t(`end1_t') /*
				*/ inst_t(`inst_t') id(`id') /*
				*/ n_g(`n') t(`t') /*
				*/ i_obs(`i_obs') depvar(`lhs') /*
				*/ level(`level') coefs_ts(`coefs') /*
				*/ `constant' `small'
		
			tempname b V
			mat `b'=e(b)
			mat `V'=e(V)

			local names2 "`names'"
			foreach vart of local names2 {
				local names3 " `names3' d.`vart' "
			}

			if "`constant'" == "" {
				local const "_cons"
			}	
			mat colnames `b'=`names3' `const'
			mat colnames `V'=`names3' `const'
			mat rownames `V'=`names3' `const'
			
			restore

 			markout `touse' d.`lhs_t' d.(`end1_t' `exog_t') /*
				*/  d.(`exog_t' `inst_t') 
			est repost b = `b', rename esample(`touse')
		

			est scalar g_min = `ti_min'
			est scalar g_max = `ti_max'
			est scalar g_avg = `ti_ave'

			est local small "`small'"
			est local ivar "`id'"
			est local tvar "`t'"
			est local model "fd"
			est local depvar "d.`lhs'"

			local end1 `end1'
			est local instd "`end1'"
			local exog `exog'
			est local insts "`exog' `inst'"

			est local predict "xtivp_2"

			est local cmd "xtivreg"

			DispFD , level(`level')
			DispI
			exit
		}

						/* Do within 2sls */

		if "`first'" != ""  & "`model'" == "fe" {
			foreach yvar of local end1_t {
				qui xtreg `yvar' `exog_t' `inst_t', fe i(`id')
				tempname bw
				mat `bw'=e(b)
				mat colnames `bw' = `exog' `inst' _cons
				est repost b=`bw', rename
				di
				di as text "First-stage within regression"
				xtreg , level(`level')
			}	
		}		

		if "`exog_t'" != "" {
			local exogvs " exog_t(`exog_t') " 
		}	

		within `lhs_t' , `exogvs' end1_t(`end1_t') /*
			*/ inst_t(`inst_t') id(`id') /*
			*/ n_g(`n') res(`res_w') model(`model') /*
			*/ i_obs(`i_obs') depvar(`lhs') /*
			*/ level(`level') coefs_ts(`coefs_ts') `small'

		if "`model'" == "fe" {
			tempname b V
			mat `b'=e(b)
			mat `V'=e(V)

			mat colnames `b'=`names' _cons
			mat colnames `V'=`names' _cons
			mat rownames `V'=`names' _cons
			
			restore 
			est repost b = `b', rename  esample(`touse')

			est scalar g_min = `ti_min'
			est scalar g_max = `ti_max'
			est scalar g_avg = `ti_ave'

			est local ivar "`id'"
			est local tvar "`t'"
			est local model "fe"
			est local depvar "`lhs'"

			est local predict "xtivp_1"

			tempname df_wald
			if "`small'" != "" {
				scalar `df_wald' = e(df_r)
			}
			else {
				scalar `df_wald' = e(df_rz)
			}

			est scalar F_f = ( (`rss_rlm'-`rss_ulm')/ e(rss) ) /*
				*/ *( `df_wald'/e(df_a) ) 
			est scalar F_fp =fprob(e(df_a), `df_wald' ,e(F_f)) 
			
			if "`lm'" ! = "" {
				est scalar lm_u=`lm_u'
				est scalar lm_up= 1-chi2(e(df_a),e(lm_u)) 
			}	

			local end1 `end1'
			local exog `exog'
			est local instd "`end1'"
			est local insts "`exog' `inst'"
			est local version "1.1.4"

			est local cmd "xtivreg"

			DispFE , `lm' level(`level')
			DispI

			exit
		}


		tempname s_e rss_w df_rw
		scalar `rss_w' = e(rss)
		scalar `df_rw' = e(df_rz)

		scalar `s_e' = sqrt(`rss_w'/`df_rw')

		scalar `N'=e(N)

		qui replace `res_w'=`res_w'*`res_w'
		qui sum `res_w'

		if "`sa'" == "" { 
			if `Tcon'==1 {
				scalar `sig_e2' = `rss_w'/`df_rw'
			}
			else {
				scalar `sig_e2'=r(sum)/(`N'-`n'-`K'+1)
			}	
		}	
		else {
			scalar `sig_e2'=r(sum)/(`N'-`n')
		}	
	
		
							/* Do between 2sls */
		
		if "`exog_t'" != "" {
			local exog_tl " exog_t( `exog_t' )"
		}	
		else {
			local exog_tl ""
		}	

		if "`first'" != "" & "`model'"=="be" {
			local i 1
			foreach vart of local end1_t {
				local dept2 : word `i' of `end1'
				tsrevar `exog_t', substitute
				local exog_t2 "`r(varlist)'"
				tsrevar `inst', substitute
				local inst_t2 "`r(varlist)'"

				qui xtreg `vart' `exog_t2' `inst_t2', be 
					
				tempname bw
				mat `bw'=e(b)
				mat colnames `bw' = `exog' `inst' _cons
				est repost b=`bw', rename
				di
				di as text "First-stage between regression"
				xtreg , level(`level') depname(`dept2') 
				local i = `i' + 1
			}
		}	
				

		between `lhs_t' , `exog_tl' end1_t(`end1_t') /*
			*/ inst_t(`inst_t') coefs_ts(`coefs_ts') id(`id') /*
			*/ n_g(`n') res(`res_b') i_obs(`i_obs') /*
			*/ model(`model') `small'

		
		scalar `K' = e(df_m) + 1

		if "`model'" == "be" {
			tempname b V
			mat `b'=e(b)
			mat `V'=e(V)

			mat colnames `b'=`names' _cons
			mat colnames `V'=`names' _cons
			mat rownames `V'=`names' _cons
			
			restore
			est repost b = `b', rename esample(`touse')

			est scalar g_min = `ti_min'
			est scalar g_max = `ti_max'
			est scalar g_avg = `ti_ave'

			est scalar N = `N'
			
			local end1 `end1'
			local exog `exog'
			est local instd "`end1'"
			est local insts "`exog' `inst'"
			est local tvar "`t'"

			est local version "1.1.4"
			est local cmd     xtivreg
			DispBE, level(`level')	
			DispI

			exit
		}	
		
						/* since the data is already
					   	   mean by group so are 
						   residuals
						*/
		tempname s_u
		scalar `s_u' = sqrt((e(rmse)^2) -`s_e'^2/`ti_ave')

⌨️ 快捷键说明

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