******************************************************************************** * PROGRAM "rscore" ******************************************************************************** *! rscore v3 GCerulli 15nov2016 program rscore , eclass version 14 syntax varlist [if] [in] [fweight pweight iweight] , model(string) rs_name(string) /// [factors(varlist) xlist(varlist) graph(numlist max=2) /// radar(numlist) id_string(varname) save_graph1(string) save_graph2(string) vce(string)] marksample touse markout `touse' `factors' `xlist' ******************************************************************************** * Standardize variables ******************************************************************************** local yxstd foreach v of local varlist{ cap drop `v'_std qui egen double `v'_std=std(`v') local yxstd `yxstd' `v'_std } local varlist "`yxstd'" ******************************************************************************** tokenize "`varlist'" local y "`1'" macro shift 1 local xvars "`*'" local N : word count `xvars' ******************************************************************************** if `N'==1{ di _newline(2) di as error "**************************************************************" di as error "WARNING: you need to specify at least 2 independent variables." error 102 di as error "**************************************************************" } ******************************************************************************** quietly{ // start quietly forvalues i=1/`N' { tempvar x`i' } local i=1 foreach var of local xvars{ qui gen `x`i''=`var' if `touse' local i=`i'+1 } forvalues i=1/`N' { tempvar z`i' } forvalues i=1/`N' { qui gen `z`i''=. if `touse' } qui replace `z1'=`x1' forvalues j=1/`N'{ qui replace `z`j''=`x`j'' qui replace `x1'=`z`j'' qui replace `x`j''=`z1' ***************************************************** local N=_N forvalues i=1/`N'{ local c`i'=`id_string'[`i'] } ***************************************************** * Body ***************************************************** local x_curr forvalues i=1/`N'{ local x_curr `x_curr' `x`i'' } foreach var of local x_curr { tempvar m_`var' } foreach var of local x_curr { qui egen `m_`var''=mean(`var') if `touse' } foreach var of local x_curr { tempvar s_`var' } foreach var of local x_curr { qui gen `s_`var''=(`var'- `m_`var'') if `touse' } tokenize `x_curr' local first "`1'" macro shift 1 local xvars2 "`*'" local s_xvars foreach var of local xvars2{ local s_xvars `s_xvars' `s_`var'' } foreach var of local s_xvars { tempvar x1`var' } foreach var of local s_xvars { qui gen `x1`var''=`x1'*`var' if `touse' qui sum `x1`var'' } local x_1 forvalues i=2/`N'{ local x_1 `x_1' `x`i'' } local x1s_x_1 foreach var of local s_xvars { local x1s_x_1 `x1s_x_1' `x1`var'' } **** Baseline regression **** local f=1 local facs foreach v of local factors{ local facs `facs' i.`v' } ******************************************************************************** if "`model'" == "fe"{ xi: xtreg `y' `x_1' `x1' `x1s_x_1' `facs' `xlist' if `touse' [`weight'`exp'] , vce(`vce') fe scalar R2_`j'=e(r2) } else if "`model'" == "re"{ xi: xtreg `y' `x_1' `x1' `x1s_x_1' `facs' `xlist' if `touse' [`weight'`exp'] , vce(`vce') re scalar R2_`j'=e(r2) } else if "`model'" == "ols"{ xi: reg `y' `x_1' `x1' `x1s_x_1' `facs' `xlist' if `touse' [`weight'`exp'] , vce(`vce') scalar R2_`j'=e(r2) } ******************************************************************************** local m=2 foreach var of local xvars2{ *di _b[`x1`s_`var'''] scalar d`m'=_b[`x1`s_`var'''] local m=`m'+1 *di "d`m'" } tempvar k1 qui gen `k1'=0 if `touse' local m=2 foreach var of local xvars2{ qui replace `k1'=`k1'+d`m'*`m_`var'' if `touse' local m=`m'+1 } qui sum `k1' scalar k1=r(mean) scalar d1=_b[`x1'] scalar delta0=d1-k1 tempvar delta0 qui gen `delta0'=delta0 if `touse' tempvar b1 qui gen `b1'=`delta0' if `touse' local m=2 foreach var of local xvars2{ qui replace `b1'=`b1'+d`m'*`var' if `touse' local m=`m'+1 } ******************************************************************************** * End of the Body ******************************************************************************** cap drop `rs_name'`j' qui gen `rs_name'`j'=`b1' if `touse' forvalues k=1/`j'{ qui replace `x`k''=`z`k'' if `touse' } } } // end quietly local i=0 local sum foreach var of local xvars{ local i=`i'+1 la var `rs_name'`i' "Responsiveness scores for variable `var'" local sum `sum' `rs_name'`i' } di _newline(2) di as result "**********************************************************************" di as result "*** DESCRIPTIVE STATISTICS FOR SINGLE FACTOR RESPONSIVENESS SCORES ***" di as result "**********************************************************************" sum `sum' , d di as text "{hline 61}" qui cap drop _rscore_id qui gen _rscore_id=_n qui order _rscore_id `sum' ******************************************************************************** * DISTRIBUTION GRAPH ******************************************************************************** if "`graph'"==""{ * do nothing } else if "`graph'"!="" & `graph'>0 { preserve local coeff `sum' local i=1 local new_coef foreach v of local coeff{ local k: word `i' of `xvars' rename `v' b_`k' local new_coef `new_coef' "b_`k'" local i=`i'+1 } local tot foreach v of local new_coef{ local tot `tot' (kdensity `v' if `v'>=-`graph' & `v'<=`graph') } tw `tot' , title(Distributions of Responsiveness Scores , size(medlarge)) legend(size(small)) if "`graph'"!="" & "`save_graph1'"!=""{ qui graph save `save_graph1' , replace } restore } ******************************************************************************** * RADAR GRAPH ******************************************************************************** if "`radar'"!="" & "`id_string'"==""{ di _newline(2) di as error "*************************************************************************************" di as error "WARNING: to use the radar() option you need to specify jointly the id_string() option" di as error "*************************************************************************************" } else if "`radar'"!="" & "`id_string'"!=""{ preserve qui keep `sum' qui xpose , clear forvalues i=1/`N'{ rename v`i' _U`i' } qui cap drop _id qui gen _id="." local M: word count `sum' forvalues i=1/`M'{ local s: word `i' of `xvars' qui replace _id="`s'" in `i' } qui keep in 1/`M' forvalues i=1/`N'{ la var _U`i' "`c`i''" } * Build the legend local lab local rad local i=1 foreach v of numlist `radar'{ local rad `rad' _U`v' local lb`v' : variable label _U`v' local L`v' "label(`i' `lb`v'')" local lab `lab' `L`v'' local i=`i'+1 } radar _id `rad' , title("") /// legend(on) legend(size(small)) legend(`lab') labsize(*0.8) if "`save_graph2'"!=""{ qui graph save `save_graph2' , replace } restore } ******************************************************************************** * RSCORE GOODNESS-OF-FIT ******************************************************************************** local K : word count `xvars' forvalues j=1/`K'{ ereturn scalar R2_`j'=R2_`j' } scalar sumR2=0 forvalues j=1/`K'{ scalar sumR2 = sumR2 + R2_`j' } ereturn scalar R2=(1/`K')*sumR2 ******************************************************************************** di _newline(2) di as result "*************************************************************" di as result "*************** RSCORE GOODNESS-OF-FIT **********************" di as result "*************************************************************" di as text "{hline 61}" local h=1 foreach v of local xvars{ di as result "The R-squared for `v' is: " di as result R2_`h' di as text "{hline 61}" local h=`h'+1 } di as result "The mean R-squared is: " di as result e(R2) di as text "{hline 61}" ******************************************************************************** end