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 + -
显示快捷键?