program xtoos_i, rclass version 13.0: syntax varlist (fv ts) [if/] [in], Ous(integer) Ksmpl(integer) [Rsmpl(integer 1) EValopt(varname) /* */Met(string) MComp(string) fe dum lags(numlist integer) HGRaph *] ****************************************************************************************************************************************** if "`dum'"=="dum" & "`fe'"=="fe" { di as err "option fe and option dummy variables not allowed" exit 250 } if "`hgraph'"=="hgraph" & "`evalopt'"=="" { di as err "when running option hgraph a specific group of individuals must be defined through option evalopt" exit 252 } ****************************************************************************************************************************************** tokenize `varlist' loc yvar "`1'" macro shift 1 loc rhsvars "`*'" capture tsset if _rc>0 { di as err "time/panel variables not set, use tsset/xtset ..." exit 0003 } loc panvar=r(panelvar) loc timevar=r(timevar) ****************************************************************************************************************************************** if "`lags'"=="" & ("`met'"=="xtabond" | "`met'"=="xtdpdsys") loc lags 1 else if "`lags'"=="" { foreach i of loc rhsvars { local m=regexm("`i'","`yvar'") local lags=`lags'+`m' } } if `lags'==0 loc lyvar else { loc lyvar L.`yvar' local lyvar=regexr("`lyvar'","L.D.","LD.") forval i=2/`lags' { loc lyvar `lyvar' L`i'.`yvar' local lyvar=regexr("`lyvar'","L`i'.D.","L`i'D.") } } loc rhsvars : list rhsvars - lyvar ****************************************************************************************************************************************** if ("`met'"=="xtabond" | "`met'"=="xtdpdsys") { if "`if'"!="" qui `met' `yvar' `rhsvars' if `if' `in', lags(`lags') else qui `met' `yvar' `rhsvars' `in', lags(`lags') } else { if "`if'"!="" qui reg `yvar' `lyvar' `rhsvars' if `if' `in' else qui reg `yvar' `lyvar' `rhsvars' `in' } fvexpand i.`panvar' if e(sample) `in' loc idum=r(varlist) tempvar sample qui gen `sample'=e(sample) qui replace `sample'=. if `sample'==0 `in' ********************************************************************************************************************* loc numid = wordcount("`idum'") foreach x of loc idum { loc k=regexr("`x'",".`panvar'","") loc k=regexr("`k'","b","") loc k=regexr("`k'","o","") loc idumn `idumn' `k' } ********************************************************************************************************************* loc kn =round(`numid'/`ous') matrix R0 = J(`kn',10,.) matrix I1 = J(1,`kn',1) ********************************************************************************************************************* if `rsmpl'>=1 { matrix RS = J(`rsmpl',10,.) matrix I2 = J(1,`rsmpl',1) forvalues r=1/`rsmpl' { loc idumn2 "`idumn'" loc rndid "" loc rndidk "" forvalues k=1/`kn' { if `k'<`kn' { foreach i of loc rndid { loc rndidk `rndidk' ``i'' } loc idumn2 : list idumn2-rndidk loc numid2 = wordcount("`idumn2'") tokenize `idumn2' loc rndid "" loc rndidk "" matrix A = `numid2'*matuniform(1,`ous') forvalues i=1/`ous' { loc x= A[1,`i'] loc j=round(`x') loc rndid `rndid' `j' } loc zero 0 loc rndid : list uniq rndid loc rndid : list rndid-zero loc nrndid = wordcount("`rndid'") while `nrndid'<`ous' { loc dif=`ous'-`nrndid' matrix A = `numid2'*matuniform(1,`dif') forvalues i=1/`dif' { loc x= A[1,`i'] loc j=round(`x') loc rndid `rndid' `j' } loc rndid : list uniq rndid loc rndid : list rndid-zero loc nrndid = wordcount("`rndid'") } ************************************************************ tempvar samplein qui gen `samplein'=`sample' foreach i of loc rndid { qui replace `samplein'=0 if `panvar'==``i'' } } ************************************************************ else if `k'==`kn' { foreach i of loc rndid { loc rndidk `rndidk' ``i'' } loc idumn2 : list idumn2-rndidk loc numid2 = wordcount("`idumn2'") ************************************************************ tempvar samplein qui gen `samplein'=`sample' foreach i of loc idumn2 { qui replace `samplein'=0 if `panvar'==`i' `in' } } ********************************************************** ************************************************************ tempvar y_f res res2 y ymt ym_in ym_ous ydev2_in ydev2_ous y_ar1 i_c fvset base first `panvar' if "`met'"=="" { if "`dum'"=="dum" { if "`if'"!="" qui xtreg `yvar' `lyvar' `rhsvars' i.`panvar' if `if' & `samplein'==1 `in', `options' else qui xtreg `yvar' `lyvar' `rhsvars' i.`panvar' if `samplein'==1 `in', `options' } else { if "`if'"!="" qui xtreg `yvar' `lyvar' `rhsvars' if `if' & `samplein'==1 `in', `fe' `options' else qui xtreg `yvar' `lyvar' `rhsvars' if `samplein'==1 `in', `fe' `options' } } else if "`dum'"=="dum" { if "`if'"!="" qui `met' `yvar' `lyvar' `rhsvars' i.`panvar' if `if' & `samplein'==1 `in', `options' else qui `met' `yvar' `lyvar' `rhsvars' i.`panvar' if `samplein'==1 `in', `options' } else if ("`met'"=="xtabond" | "`met'"=="xtdpdsys") & "`lags'"!="" { if "`if'"!="" qui `met' `yvar' `rhsvars' if `if' & `samplein'==1 `in', `fe' `options' lags(`lags') else qui `met' `yvar' `rhsvars' if `samplein'==1 `in', `fe' `options' lags(`lags') } else { if "`if'"!="" qui `met' `yvar' `lyvar' `rhsvars' if `if' & `samplein'==1 `in', `fe' `options' else qui `met' `yvar' `lyvar' `rhsvars' if `samplein'==1 `in', `fe' `options' } qui predict `y_f' if "`dum'"=="dum" { loc allxvars : colfullnames e(b) loc dumi : list allxvars-rhsvars qui gen `i_c'=-_b[_cons] foreach i of loc dumi { qui replace `i_c'=`i_c'+_b[`i']*`i' } qui sum `i_c' if `samplein'==1 `in' qui replace `y_f'=`y_f'+r(mean) if `samplein'==0 `in' } qui gen `y'=`yvar' qui egen `ym_in'=mean(`y') if `samplein'==1 & `sample'==1 `in' qui gen `ydev2_in'=(`yvar'-`ym_in')^2 qui sum `ydev2_in' if `samplein'==1 & `sample'==1 `in' scalar tss_in=r(mean) qui egen `ym_ous'=mean(`y') if `samplein'==0 & `sample'==1 `in' qui gen `ydev2_ous'=(`yvar'-`ym_ous')^2 qui sum `ydev2_ous' if `samplein'==0 & `sample'==1 `in' scalar tss_ous=r(mean) qui gen `res'=`yvar'-`y_f' qui gen `res2'=`res'^2 qui sum `res2' if `samplein'==1 & `sample'==1 `in' scalar rss_in=r(mean) matrix R0[`k',1]=rss_in qui sum `res2' if `samplein'==0 & `sample'==1 `in' scalar rss_ous=r(mean) matrix R0[`k',2]=rss_ous matrix R0[`k',3]=tss_in matrix R0[`k',4]=tss_ous matrix R0[`k',10]=r(N) ************************************************************************************* ************************************************************ if "`mcomp'"=="" { if "`if'"!="" qui egen `ymt'=mean(`y') if `if' & `samplein'==1 `in', by(`timevar') else qui egen `ymt'=mean(`y') if `samplein'==1 `in', by(`timevar') qui egen `y_ar1'=mean(`ymt'), by(`timevar') } else if ("`mcomp'"=="xtabond" | "`mcomp'"=="xtdpdsys") { if "`if'"!="" qui `mcomp' `yvar' if `if' & `samplein'==1 `in' else qui `mcomp' `yvar' if `samplein'==1 `in' qui predict `y_ar1' } else { if "`if'"!="" qui `mcomp' `yvar' L.`yvar' if `if' & `samplein'==1 `in' else qui `mcomp' `yvar' L.`yvar' if `samplein'==1 `in' qui predict `y_ar1' } qui drop `ym_in' qui egen `ym_in'=mean(`y') if `samplein'==1 & `sample'==1 `in' qui replace `ydev2_in'=(`yvar'-`ym_in')^2 qui sum `ydev2_in' if `samplein'==1 & `sample'==1 `in' scalar tss_ar1_in=r(mean) qui drop `ym_ous' qui egen `ym_ous'=mean(`y') if `samplein'==0 & `sample'==1 `in' qui replace `ydev2_ous'=(`yvar'-`ym_ous')^2 qui sum `ydev2_ous' if `samplein'==0 & `sample'==1 `in' scalar tss_ar1_ous=r(mean) qui replace `res'=`yvar'-`y_ar1' qui replace `res2'=`res'^2 qui sum `res2' if `samplein'==1 & `sample'==1 `in' scalar rss_ar1_in=r(mean) matrix R0[`k',5]=rss_ar1_in qui sum `res2' if `samplein'==0 & `sample'==1 `in' scalar rss_ar1_ous=r(mean) matrix R0[`k',6]=rss_ar1_ous matrix R0[`k',7]=tss_ar1_in matrix R0[`k',8]=tss_ar1_ous ************************************************************************************* matrix R0[`k',9]=sqrt(rss_ous)/sqrt(rss_ar1_ous) } ********************************************************************************************************************* matrix N = R0[1...,10] matrix n0=I1*N scalar n=n0[1,1] matrix R`r' = (1/n)*N'*R0 forvalues s=1/10 { matrix RS[`r',`s']=R`r'[1...,`s'] } ********************************************************************************************************************* } matrix N = RS[1...,10] matrix n0=I2*N scalar n=n0[1,1] matrix R = (1/n)*N'*RS matrix R[1,3] = 1-R[1,1]/R[1,3] matrix R[1,4] = 1-R[1,2]/R[1,4] matrix R[1,1] = sqrt(R[1,1]) matrix R[1,2] = sqrt(R[1,2]) matrix R[1,7] = 1-R[1,5]/R[1,7] matrix R[1,8] = 1-R[1,6]/R[1,8] matrix R[1,5] = sqrt(R[1,5]) matrix R[1,6] = sqrt(R[1,6]) matrix R[1,9]=R[1,2]/R[1,6] matrix colnames R = RMSE_in RMSE_oos R2_in R2_oos RMSE_Alt_in RMSE_Alt_oos R2_Alt_in R2_Alt_oos Utheil_Alt N matrix rownames R = Summary matlist R, title("Out of sample evaluation: Random sampling") lines(rowt) return matrix random R } ********************************************************************************************************************* ********************************************************************************************************************* ********************************************************************************************************************* ********************************************************************************************************************* ********************************************************************************************************************* ********************************************************************************************************************* tokenize `idumn' loc kn =round(`numid'/`ksmpl') loc ln = `kn'*`ksmpl' if `ksmpl'>=1 { matrix R0 = J(`kn',10,.) matrix I1 = J(1,`kn',1) forvalues k=`ksmpl'(`ksmpl')`ln' { loc j=`k'-`ksmpl' loc ki=`k'/`ksmpl' tempvar samplein qui gen `samplein'=`sample' if `k'==`ksmpl' { loc j=1 qui replace `samplein'=0 if `panvar'>=``j'' & `panvar'<=``k'' `in' } else if `k'==`ln' { qui replace `samplein'=0 if `panvar'>``j'' & `panvar'<=``numid'' `in' } else { qui replace `samplein'=0 if `panvar'>``j'' & `panvar'<=``k'' `in' } ************************************************************ tempvar y_f res res2 y ymt ym_in ym_ous ydev2_in ydev2_ous y_ar1 i_c fvset base first `panvar' if "`met'"=="" { if "`dum'"=="dum" { if "`if'"!="" qui xtreg `yvar' `lyvar' `rhsvars' i.`panvar' if `if' & `samplein'==1 `in', `options' else qui xtreg `yvar' `lyvar' `rhsvars' i.`panvar' if `samplein'==1 `in', `options' } else { if "`if'"!="" qui xtreg `yvar' `lyvar' `rhsvars' if `if' & `samplein'==1 `in', `fe' `options' else qui xtreg `yvar' `lyvar' `rhsvars' if `samplein'==1 `in', `fe' `options' } } else if "`dum'"=="dum" { if "`if'"!="" qui `met' `yvar' `lyvar' `rhsvars' i.`panvar' if `if' & `samplein'==1 `in', `options' else qui `met' `yvar' `lyvar' `rhsvars' i.`panvar' if `samplein'==1 `in', `options' } else if ("`met'"=="xtabond" | "`met'"=="xtdpdsys") & "`lags'"!="" { if "`if'"!="" qui `met' `yvar' `rhsvars' if `if' & `samplein'==1 `in', `fe' `options' lags(`lags') else qui `met' `yvar' `rhsvars' if `samplein'==1 `in', `fe' `options' lags(`lags') } else { if "`if'"!="" qui `met' `yvar' `lyvar' `rhsvars' if `if' & `samplein'==1 `in', `fe' `options' else qui `met' `yvar' `lyvar' `rhsvars' if `samplein'==1 `in', `fe' `options' } qui predict `y_f' if "`dum'"=="dum" { loc allxvars : colfullnames e(b) loc dumi : list allxvars-rhsvars qui gen `i_c'=-_b[_cons] foreach i of loc dumi { qui replace `i_c'=`i_c'+_b[`i']*`i' } qui sum `i_c' if `samplein'==1 qui replace `y_f'=`y_f'+r(mean) if `samplein'==0 `in' } qui gen `y'=`yvar' qui egen `ym_in'=mean(`y') if `samplein'==1 & `sample'==1 `in' qui gen `ydev2_in'=(`yvar'-`ym_in')^2 qui sum `ydev2_in' if `samplein'==1 & `sample'==1 `in' scalar tss_in=r(mean) qui egen `ym_ous'=mean(`y') if `samplein'==0 & `sample'==1 `in' qui gen `ydev2_ous'=(`yvar'-`ym_ous')^2 qui sum `ydev2_ous' if `samplein'==0 & `sample'==1 `in' scalar tss_ous=r(mean) qui gen `res'=`yvar'-`y_f' qui gen `res2'=`res'^2 qui sum `res2' if `samplein'==1 & `sample'==1 `in' scalar rss_in=r(mean) matrix R0[`ki',1]=rss_in qui sum `res2' if `samplein'==0 & `sample'==1 `in' scalar rss_ous=r(mean) matrix R0[`ki',2]=rss_ous matrix R0[`ki',3]=tss_in matrix R0[`ki',4]=tss_ous matrix R0[`ki',10]=r(N) ************************************************************************************* if "`mcomp'"=="" { if "`if'"!="" qui egen `ymt'=mean(`y') if `if' & `samplein'==1 `in', by(`timevar') else qui egen `ymt'=mean(`y') if `samplein'==1 `in', by(`timevar') qui egen `y_ar1'=mean(`ymt'), by(`timevar') } else if ("`mcomp'"=="xtabond" | "`mcomp'"=="xtdpdsys") { if "`if'"!="" qui `mcomp' `yvar' if `if' & `samplein'==1 `in' else qui `mcomp' `yvar' if `samplein'==1 `in' qui predict `y_ar1' } else { if "`if'"!="" qui `mcomp' `yvar' L.`yvar' if `if' & `samplein'==1 `in' else qui `mcomp' `yvar' L.`yvar' if `samplein'==1 `in' qui predict `y_ar1' } qui drop `ym_in' qui egen `ym_in'=mean(`y') if `samplein'==1 & `sample'==1 `in' qui replace `ydev2_in'=(`yvar'-`ym_in')^2 qui sum `ydev2_in' if `samplein'==1 & `sample'==1 `in' scalar tss_ar1_in=r(mean) qui drop `ym_ous' qui egen `ym_ous'=mean(`y') if `samplein'==0 & `sample'==1 `in' qui replace `ydev2_ous'=(`yvar'-`ym_ous')^2 qui sum `ydev2_ous' if `samplein'==0 & `sample'==1 `in' scalar tss_ar1_ous=r(mean) qui replace `res'=`yvar'-`y_ar1' qui replace `res2'=`res'^2 qui sum `res2' if `samplein'==1 & `sample'==1 `in' scalar rss_ar1_in=r(mean) matrix R0[`ki',5]=rss_ar1_in qui sum `res2' if `samplein'==0 & `sample'==1 `in' scalar rss_ar1_ous=r(mean) matrix R0[`ki',6]=rss_ar1_ous matrix R0[`ki',7]=tss_ar1_in matrix R0[`ki',8]=tss_ar1_ous ************************************************************************************* matrix R0[`ki',9]=sqrt(rss_ous)/sqrt(rss_ar1_ous) } ********************************************************************************************************************* matrix N = R0[1...,10] matrix n0=I1*N scalar n=n0[1,1] matrix R = (1/n)*N'*R0 matrix R[1,3] = 1-R[1,1]/R[1,3] matrix R[1,4] = 1-R[1,2]/R[1,4] matrix R[1,1] = sqrt(R[1,1]) matrix R[1,2] = sqrt(R[1,2]) matrix R[1,7] = 1-R[1,5]/R[1,7] matrix R[1,8] = 1-R[1,6]/R[1,8] matrix R[1,5] = sqrt(R[1,5]) matrix R[1,6] = sqrt(R[1,6]) matrix R[1,9]=R[1,2]/R[1,6] matrix colnames R = RMSE_in RMSE_oos R2_in R2_oos RMSE_Alt_in RMSE_Alt_oos R2_Alt_in R2_Alt_oos Utheil_Alt N matrix rownames R = Summary matlist R, title("Out of sample evaluation: Ordered partition") lines(rowt) return matrix ordered R } ********************************************************************************************************************* ********************************************************************************************************************* ********************************************************************************************************************* ********************************************************************************************************************* ********************************************************************************************************************* ********************************************************************************************************************* if "`evalopt'"!="" { matrix R0 = J(1,10,.) tempvar samplein qui gen `samplein'=`sample' qui replace `samplein'=0 if `evalopt'==1 `in' ************************************************************ tempvar y_f res res2 ymt ym_in ym_ous ydev2_in ydev2_ous y_ar1 i_c fvset base first `panvar' if "`met'"=="" { if "`dum'"=="dum" { if "`if'"!="" qui xtreg `yvar' `lyvar' `rhsvars' i.`panvar' if `if' & `samplein'==1 `in', `options' else qui xtreg `yvar' `lyvar' `rhsvars' i.`panvar' if `samplein'==1 `in', `options' } else { if "`if'"!="" qui xtreg `yvar' `lyvar' `rhsvars' if `if' & `samplein'==1 `in', `fe' `options' else qui xtreg `yvar' `lyvar' `rhsvars' if `samplein'==1 `in', `fe' `options' } } else if "`dum'"=="dum" { if "`if'"!="" qui `met' `yvar' `lyvar' `rhsvars' i.`panvar' if `if' & `samplein'==1 `in', `options' else qui `met' `yvar' `lyvar' `rhsvars' i.`panvar' if `samplein'==1 `in', `options' } else if ("`met'"=="xtabond" | "`met'"=="xtdpdsys") & "`lags'"!="" { if "`if'"!="" qui `met' `yvar' `rhsvars' if `if' & `samplein'==1 `in', `fe' `options' lags(`lags') else qui `met' `yvar' `rhsvars' if `samplein'==1 `in', `fe' `options' lags(`lags') } else { if "`if'"!="" qui `met' `yvar' `lyvar' `rhsvars' if `if' & `samplein'==1 `in', `fe' `options' else qui `met' `yvar' `lyvar' `rhsvars' if `samplein'==1 `in', `fe' `options' } qui predict `y_f' if "`dum'"=="dum" { loc allxvars : colfullnames e(b) loc dumi : list allxvars-rhsvars qui gen `i_c'=-_b[_cons] foreach i of loc dumi { qui replace `i_c'=`i_c'+_b[`i']*`i' } qui sum `i_c' if `samplein'==1 `in' qui replace `y_f'=`y_f'+r(mean) if `samplein'==0 `in' } qui egen `ym_in'=mean(`y') if `samplein'==1 & `sample'==1 `in' qui gen `ydev2_in'=(`yvar'-`ym_in')^2 qui sum `ydev2_in' if `samplein'==1 & `sample'==1 `in' scalar tss_in=r(mean) qui egen `ym_ous'=mean(`y') if `samplein'==0 & `sample'==1 `in' qui gen `ydev2_ous'=(`yvar'-`ym_ous')^2 qui sum `ydev2_ous' if `samplein'==0 & `sample'==1 `in' scalar tss_ous=r(mean) qui gen `res'=`yvar'-`y_f' qui gen `res2'=`res'^2 qui sum `res2' if `samplein'==1 & `sample'==1 `in' scalar rss_in=r(mean) matrix R0[1,1]=sqrt(rss_in) qui sum `res2' if `samplein'==0 & `sample'==1 `in' scalar rss_ous=r(mean) matrix R0[1,2]=sqrt(rss_ous) matrix R0[1,3]=1-rss_in/tss_in matrix R0[1,4]=1-rss_ous/tss_ous matrix R0[1,10]=r(N) ************************************************************************************* if "`mcomp'"=="" { if "`if'"!="" qui egen `ymt'=mean(`y') if `if' & `samplein'==1 `in', by(`timevar') else qui egen `ymt'=mean(`y') if `samplein'==1 `in', by(`timevar') qui egen `y_ar1'=mean(`ymt'), by(`timevar') } else if ("`mcomp'"=="xtabond" | "`mcomp'"=="xtdpdsys") { if "`if'"!="" qui `mcomp' `yvar' if `if' & `samplein'==1 `in' else qui `mcomp' `yvar' if `samplein'==1 `in' qui predict `y_ar1' } else { if "`if'"!="" qui `mcomp' `yvar' L.`yvar' if `if' & `samplein'==1 `in' else qui `mcomp' `yvar' L.`yvar' if `samplein'==1 `in' qui predict `y_ar1' } qui drop `ym_in' qui egen `ym_in'=mean(`y') if `samplein'==1 & `sample'==1 `in' qui replace `ydev2_in'=(`yvar'-`ym_in')^2 qui sum `ydev2_in' if `samplein'==1 & `sample'==1 `in' scalar tss_ar1_in=r(mean) qui drop `ym_ous' qui egen `ym_ous'=mean(`y') if `samplein'==0 & `sample'==1 `in' qui replace `ydev2_ous'=(`yvar'-`ym_ous')^2 qui sum `ydev2_ous' if `samplein'==0 & `sample'==1 `in' scalar tss_ar1_ous=r(mean) qui replace `res'=`yvar'-`y_ar1' qui replace `res2'=`res'^2 qui sum `res2' if `samplein'==1 & `sample'==1 `in' scalar rss_ar1_in=r(mean) matrix R0[1,5]=sqrt(rss_ar1_in) qui sum `res2' if `samplein'==0 & `sample'==1 `in' scalar rss_ar1_ous=r(mean) matrix R0[1,6]=sqrt(rss_ar1_ous) matrix R0[1,7]=1-rss_ar1_in/tss_ar1_in matrix R0[1,8]=1-rss_ar1_ous/tss_ar1_ous ************************************************************************************* matrix R0[1,9]=sqrt(rss_ous)/sqrt(rss_ar1_ous) matrix colnames R0 = RMSE_in RMSE_oos R2_in R2_oos RMSE_Alt_in RMSE_Alt_oos R2_Alt_in R2_Alt_oos Utheil_Alt N matrix rownames R0 = Summary matlist R0, title("Out of sample evaluation: Specific individuals: `evalopt'") lines(rowt) return matrix specific R0 if "`hgraph'"=="hgraph" { cap drop _yf cap drop _yar1 qui gen _yf=`y_f' qui gen _yar1=`y_ar1' label var _yf "pred`_evalopt'" if "`mcomp'"=="" label var _yar1 "naive" else label var _yar1 "AR1" tsline `yvar' _yf _yar1 if `evalopt'==1 & `sample'==1 `in', by(`panvar', yrescale) ttitle(`timevar') tlabel(,angle(45) labsize(vsmall)) qui drop _yf _yar1 } } end