⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xtreg_re.ado

📁 是一个经济学管理应用软件 很难找的 但是经济学学生又必须用到
💻 ADO
字号:
*! version 1.2.1  29apr2005
program define xtreg_re, eclass
	_vce_parserun xtreg, panel : `0'
	if "`s(exit)'" != "" {
		exit
	}
	version 6, missing
	local options "Level(cilevel) OLD THeta SA SAF"
	local options "`options' Robust CLuster(varname)"
/* NOte SAF is an undocumented option to force Swamy-Arora exact calculation
  for balanced panels.  Used in test scripts.  dmd  */
  
	if replay() {
		if "`e(model)'" ~= "re" { 
			error 301 
		}
		syntax [, `options']
	}
	else { 
		syntax varlist(ts) [if] [, `options' I(varname) RE ]

		tsunab varlist : `varlist'
		tokenize `varlist'
		macro shift
		local xvars "`*'"
		xt_iis `i'
		local ivar "`s(ivar)'"
		capture tsset
		if _rc == 0 {
			local ivar `r(panelvar)'
			local tvar `r(timevar)'
		}

		tempname T Tbar s_e s_u thetav Bf VCEf n T_new N_clust
		tempvar touse dup T_i XB U tmp tv
		mark `touse' `if'
		markout `touse' `varlist' `ivar'
		qui count if `touse'
		if r(N)<3 { 
			error cond(r(N)==0,2000,2001)
			/*NOTREACHED*/
		}

/* Next two lines added to check for collinearity 13oct2003 bpp */
		noi _rmcoll `varlist'
		local varlist "`r(varlist)'"

		local oldvars `varlist'
		tsrevar `varlist'
		local varlist `r(varlist)'
		local tmpdep : word 1 of `varlist'

		sort `ivar' `tvar' `touse'
		preserve
		quietly  {
			tempname sa_N sa_n sa_K
					/* obtain fixed-effects estimates */
			keep if `touse'
			keep `varlist' `ivar' `cluster'
			ffxreg2 `varlist', i(`ivar') 
			scalar `sa_N'=e(N)
			scalar `s_e' = sqrt(e(sse)/e(df_t))
			matrix `Bf' = get(_b)
			matrix `VCEf' = get(VCE)
			restore, preserve
			keep if `touse'
			keep `varlist' `ivar' `touse' `cluster'

						/* count T_i		*/
			by `ivar': gen long `T_i'=_N if _n==_N
			summ `T_i' 
			scalar `T' = r(max)

			local g1 = r(min)
			local g2 = r(mean)
			local g3 = r(max)

			if "`old'"!="" { 
				scalar `Tbar' = r(mean) 
			}

			if `T'==r(min) {		/* min=max, constant */
				local T_cons 1
				local consopt "hascons"
				drop `T_i'
			}
			else {
				local T_cons 0
				local consopt "nocons"
				by `ivar': replace `T_i'=_N
			}

			if "`old'"=="" {
				by `ivar' : gen double `T_new' = 1/_N if _n==_N
				summ `T_new'
				scalar `Tbar' = 1/r(mean)
				drop `T_new'
			}

						/* create averages 	*/
			by `ivar': gen byte `dup' = cond(_n==_N,2,1)
			expand `dup'
			sort `ivar' `dup' 
			by `ivar': replace `dup'=cond(_n<_N,0,1)
						/* dup=0,1; 1->mean obs */

						/* here is where varlist
						   is converted to double */
			tokenize `varlist'
			local i 1
			while "``i''"!="" {
				by `ivar': gen double `tv' = /*
				*/ cond(`dup',sum(``i''[_n-1])/(_n-1),``i'')
				drop ``i''
				rename `tv' ``i''
				local i=`i'+1
			}

					/* obtain between-effects estimates */
			regress `varlist' if `dup'
			scalar `sa_K'=e(df_m)+1
			scalar `n' = e(N)
			if ( "`sa'" != ""  & `T_cons'==0 ) | /* 
				*/ "`saf'" != "" {

				tempvar res_b2
				
				predict double `res_b2' if !`dup' , res 
				
				tempvar i_obs i_obs2
				tempname ti_max ti_min ti_ave Zi tr trmat
				tempname ubPub_m ubPub xpx xzx

				gen `i_obs'=1 if !`dup'

				by `ivar':  gen `i_obs2' = sum(`i_obs') 
	
				replace `i_obs'=`i_obs2'
	
				by `ivar': replace `i_obs2'= /* 
					*/ cond(_n==_N,`i_obs2', .)

				sum `i_obs2'
		
				scalar `ti_max'=r(max)
				scalar `ti_min'=r(min)
				scalar `ti_ave'=r(mean)

				by `ivar': replace `i_obs2'=`i_obs2'[_N] /*
					*/ if !`dup'

				mat `Zi'=J(`ti_max',`ti_max',1)

				mat glsaccum `ubPub_m' = /* 
					*/ `res_b2' [iweight = 1/`i_obs2'] /*
					*/ if ~`dup' , /*
					*/ group(`ivar') glsmat(`Zi') /*
					*/ row(`i_obs')
	
				di "scalar `ubPub' = `ubPub_m'[1,1]"
				scalar `ubPub' = `ubPub_m'[1,1]

				mat glsaccum `xpx' = `xvars' /*
					*/ [iweight = 1/`i_obs2'] /* 
					*/ if !`dup', /*
					*/ group(`ivar') glsmat(`Zi') /* 
					*/ row(`i_obs')

				mat glsaccum `xzx' = `xvars' if !`dup', /*
					*/ group(`ivar') glsmat(`Zi') /* 
					*/ row(`i_obs')
	
				mat `trmat'=syminv(`xpx')
	
				mat `trmat'=`trmat'*`xzx'
	
				scalar `tr' = trace(`trmat')

				scalar `s_u'= sqrt( /* 
					*/ (`ubPub'- (`n'-`sa_K')*`s_e'^2) /*
					*/ / ( `sa_N'-`tr')  )

			}
			else {
				scalar `s_u' = sqrt((e(rmse)^2) -`s_e'^2/`Tbar')
			}	

					/* obtain theta			  */
			if `s_u'>=. { 
				scalar `s_u' = 0 
				if `T_cons' {
					scalar `thetav' = 0
				}
				else	gen byte `thetav' = 0
			}
			else {
				if `T_cons' {
					scalar `thetav' = /*
					*/ 1-`s_e'/sqrt(`T'*`s_u'^2+`s_e'^2)
				}
				else {
					by `ivar': gen double `thetav' = /*
					*/ 1-`s_e'/sqrt(`T_i'*`s_u'^2+`s_e'^2)/*
					*/ if !`dup'
				}
			}

				/* obtain random-effects estimates	*/
				/* now that varlist is already double	*/
			local i 1
			while "``i''"!="" {
				by `ivar': replace ``i''= /*
					*/ ``i''-`thetav'*``i''[_N] if !`dup'
				local i=`i'+1
			}
			drop if `dup'
			tempvar cons
			gen double `cons' = 1-`thetav'

			if "`cluster'" != "" {
				_xtreg_chk_cl `cluster' `ivar'
				local clopt "cluster(`cluster')"
			}

			regress `varlist' `cons', `consopt' `robust' `clopt'
			scalar `N_clust' = e(N_clust)
		}

		tempname mdf chi2 B V
		local   depv  = "`1'"
		local   nobs  = e(N)
		scalar `mdf'  = e(df_m) - cond(`T_cons',0,1)
		scalar `chi2' = e(F) * `mdf'

		mat `B' = get(_b)
		mat `V' = get(VCE)
		if `T_cons'==1 {
			local cols = colsof(`B') - 1
			mat `B' = `B'[1,1..`cols']
			mat `V' = `V'[1..`cols',1..`cols']
		}
		else	local cols = colsof(`B')
		loc depname : word 1 of `oldvars'
		loc rhsname : subinstr local oldvars "`depname'" ""
		mat colnames `B' = `rhsname' _cons
		mat rownames `V' = `rhsname' _cons
		mat colnames `V' = `rhsname' _cons
		est post `B' `V', depname(`depname') obs(`nobs')

		if `T_cons'==0 & 0`:word count `varlist'' > 1 {
			tokenize `oldvars'
			mac shift
			qui test `*'
			scalar `chi2' = r(chi2)
		}

		est mat bf `Bf'
		est mat VCEf `VCEf'

		local `cols'
		global S_E_vl `*'  /* double save */
		local names

		est local depvar `depname'

		global S_E_depv "`depname'"   /* double save */
		global S_E_if `"`if'"'

		est scalar sigma_u = `s_u'
		est scalar sigma_e = `s_e'
		est scalar sigma   = sqrt(`s_u'^2+`s_e'^2)
		est scalar rho     = `s_u'^2/(`s_u'^2+`s_e'^2)
		est local ivar `ivar'

		scalar S_E_ui = `s_u'        /* double save */
		scalar S_E_eit = `s_e'
		global S_E_ivar "`ivar'"

		est scalar N = `nobs'
		*est scalar T = `T'
		est scalar Tbar = `Tbar'
		est scalar Tcon = `T_cons'
		est scalar N_g = `n'
		est scalar df_m = `mdf'
		est scalar chi2 = `chi2'
		est local chi2type "Wald"
		est local sa "`sa'`saf'"

		est scalar g_min = `g1'
		est scalar g_avg = `g2'
		est scalar g_max = `g3'

		scalar S_E_nobs = `nobs'     /* double save */
		scalar S_E_T = `T'
		scalar S_E_Tbar = `Tbar'
		global S_E_Tcon   `T_cons'
		scalar S_E_n = `n'
		scalar S_E_mdf = `mdf'
		scalar S_E_chi2 = `chi2'


		if e(Tcon) { 
			est scalar theta = `thetav'
			scalar S_E_thta = `thetav'   /* double save */
		}
		else quietly {
			by `ivar': replace `thetav'=. if _n!=_N
			summ `thetav', d
			est scalar thta_min = r(min)
			est scalar thta_5   = r(p5)
			est scalar thta_50  = r(p50)
			est scalar thta_95  = r(p95)
			est scalar thta_max = r(max)
			tempname myth
			mat `myth' = (r(min), r(p5), r(p50), r(p95), r(max))
			est mat theta `myth'
		}
		restore
		quietly {
			tempvar mysamp
			gen byte `mysamp' = `touse'
			est repost, esample(`mysamp')

					/* obtain R^2 overall	*/
			_predict double `XB' if `touse', xb
			corr `XB' `tmpdep'
			est scalar r2_o = r(rho)^2
			scalar S_E_r2o = e(r2_o)      /* double save */
			sort `ivar' `touse'
					/* obtain R^2 between */
			by `ivar' `touse': gen double `U' = /*
				*/ cond(_n==_N & `touse', /*
				*/ sum(`XB'/_N), .)

			by `ivar' `touse': gen double `tmp' = /* 
				*/ cond(_n==_N & `touse', /*
				*/ sum(`tmpdep'/_N), .) 
			corr `U' `tmp'
			est scalar r2_b = r(rho)^2
			scalar S_E_r2b = e(r2_b)     /* double save */

				/* obtain R^2 within */
			by `ivar' `touse': replace `U' = `XB'-`U'[_N]
			by `ivar' `touse': replace `tmp'=`tmpdep'-`tmp'[_N]
			corr `U' `tmp'
			est scalar r2_w = r(rho)^2
			scalar S_E_r2w = e(r2_w)    /* double save */

			drop `U' `tmp'
			

		}
		
		if "`robust'" != "" | "`cluster'" != "" {
			est local vcetype "Robust"
			est local vce robust
		}
		if "`cluster'" != "" {
			est local clustvar "`cluster'"
			est scalar N_clust = `N_clust'
		}

		est local ivar "`ivar'"
		est local model re
		est local predict "xtrere_p"
		est local cmd "xtreg"
		global S_E_cmd2 "xtreg_re"    /* double save */
		global S_E_cmd "xtreg"
	}

	if e(Tcon) {
		local Twrd "    T"
	}
	else	local Twrd "T-bar"

	#delimit ;
	di _n in gr "Random-effects GLS regression" 
		_col(49) in gr "Number of obs" _col(68) "=" 
		_col(70) in ye %9.0f e(N) ;
	di in gr "Group variable (i): " in ye abbrev("`e(ivar)'",12) in gr
		_col(49) "Number of groups" _col(68) "="
		_col(70) in ye %9.0g e(N_g) _n ;
	di in gr "R-sq:  within  = " in ye %6.4f e(r2_w)
		_col(49) in gr "Obs per group: min" _col(68) "="
		_col(70) in ye %9.0g e(g_min) ;
	di in gr "       between = " in ye %6.4f e(r2_b)
		_col(64) in gr "avg" _col(68) "="
		_col(70) in ye %9.1f e(g_avg) ;
	di in gr "       overall = " in ye %6.4f e(r2_o)
		_col(64) in gr "max" _col(68) "="
		_col(70) in ye %9.0g e(g_max) _n ;

	if !missing(e(chi2)) | missing(e(df_r)) { ;
		di in gr "Random effects u_i ~ " in ye "Gaussian" in gr 
			_col(49) "`e(chi2type)' chi2(" 
				in ye e(df_m) in gr ")" _col(68) "="
			_col(70) in ye %9.2f e(chi2) ;
		di in gr "corr(u_i, X)" _col(20) "= " in ye "0"
			in gr " (assumed)" _col(49) "Prob > chi2" _col(68) "="
			_col(73) in ye %6.4f chiprob(e(df_m),e(chi2)) ;
	} ;
	else { ;
		di in gr "Random effects u_i ~ " in ye "Gaussian" in gr 
			_col(49) "F(" in ye e(df_m) in gr "," in ye e(df_r)
			in gr ")" _col(68) "=" _col(70) in ye %9.2f e(F) ;
		di in gr "corr(u_i, X)" _col(20) "= " in ye "0"
			in gr " (assumed)" _col(49) "Prob > F" _col(68) "="
			_col(73) in ye %6.4f fprob(e(df_m),e(df_r),e(F)) ;
	} ;
	#delimit cr

	if "`theta'" != "" {
		if e(Tcon) {
			di in gr "theta" _col(20) "= " in ye e(theta)
		}
		else {
			di in gr _n _dup(19) "-" " theta " _dup(20) "-"
			di in gr "  min      5%       median        95%" /*
				*/ "      max" 
			di in ye %6.4f e(thta_min) %9.4f e(thta_5) /*
				*/ %11.4f e(thta_50) %11.4f e(thta_95) /*
				*/ %9.4f e(thta_max) 

		}
	}
	display

	est di, level(`level') plus
	di in smcl in gr "     sigma_u {c |} " in ye %10.0g e(sigma_u)
	di in smcl in gr "     sigma_e {c |} " in ye %10.0g e(sigma_e)
	di in smcl in gr "         rho {c |} " in ye %10.0g e(rho) /*
		*/ in gr "   (fraction of variance due to u_i)"
	di in smcl in gr "{hline 13}{c BT}{hline 64}"
end


/*
	ffxreg2:
		ffxreg2 varlist, i(ivar)
		defines mse, b and covariance matrix
		no syntax checking
		may corrupt data in memory.
*/
program define ffxreg2, eclass
	syntax varlist [, I(varname)]
	tokenize `varlist'
	local ivar `i'

	tempvar x tmp
	tempname sst sse

	quietly  {
		sort `ivar'

		summ `1'
		scalar `sst' = (r(N)-1)*r(Var)

		while ("`1'"!="") {
			by `ivar': gen double `x' = sum(`1')/_n
			summ `1'
			by `ivar': replace `x' = `1' - `x'[_N] + r(mean)
			drop `1'
			rename `x' `1'
			mac shift
		}

		count if `ivar'!=`ivar'[_n-1]
		local dfa = r(N)-1

		est clear
		regress `varlist'
		local nobs = e(N)
		local dfb = e(df_m)
		scalar `sse' = e(rss)
		local dfe = e(df_r) - `dfa'
		if `dfe'<=0 | `dfe'>=. { noi error 2001 } 

		* we could avoid this if only we knew dfe in advance
		regress `varlist', dof(`dfe')
		est scalar sse = `sse'
		est scalar df_m = `dfa' + `dfb'
		est scalar df_t = `nobs' - 1 - e(df_m)
		est scalar N = e(N)
	}
end

⌨️ 快捷键说明

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