I am trying to modify the conindex user-written program so as it would calculate indirectly standardized concentration indices as well. However, I get an error 102 "too few variables specified", and I am not sure how to fix it. The option that I have added is [, STvar(varname)]. Below you can find the code. The added code has been highlighted with a red color. I haven't tried to modify the compare option so as it would incorporate the comparison of standardized coefficients. But that would be great too.
Code:
capture program drop conindex2 program define conindex2, rclass sortpreserve byable(recall) version 11.0 syntax varname [if] [in] [fweight aweight pweight] , [RANKvar(varname)] [, robust] [, CLUSter(varname)] [, truezero] [, LIMits(numlist min=1 max=2 missingokay)] [, generalized][, generalised] [, bounded] [, WAGstaff] [, ERReygers] [, v(string)] [,beta(string)] [, graph] [, loud] [, COMPare(varname)] [, KEEPrank(string)] [, ytitle(string)] [, xtitle(string)] [,compkeep(numlist)] [,extended] [,symmetric] [,bygroup(numlist)] [,svy] [, STvar(varname)] marksample touse tempname grouptest counter tempvar wght sumw cumw cumw_1 cumwr cumwr_1 frnk temp sigma2 meanlhs meanlhs_star cumlhs cumlhs1 lhs rhs1 rhs2 xmin xmax varlist_star weight1 meanweight1 tempx temp1x sumlhsx temps tempex lhsex rhs1ex rhs2ex sigma2ex exrank tempgx lhsgex lhsgexstar symrank smrankmean tempsym sigma2sym lhssym lhssymstar rhs1sym rhs2sym lhsgsym tempgxstar raw_rank_c wi_c cusum_c wj_c rank_c var_rank_c mean_c lhs_c split_c ranking extwght temp1 meanweight sumlhs sumwr counts meanoverall tempdis temp0 meanlhs2 rhs temp2 frnktest meanlhsex2 equality group lhscomp rhs1comp rhs2comp rhscomp intercept scale stvar local weighted [`weight'`exp'] if "`weight'" != "" local weighted [`weight'`exp'] if "`weight'" == "" qui gen byte `wght' = 1 else qui gen `wght'`exp' if "`svy'"!=""{ if "`weight'" != "" { di as error "When the svy option is used, weights should only be specified using svyset." exit 498 } if "`cluster'"!="" { di as error "Warning: cluster option is redundant when using the svy option. svyset should be used to identify the survey design characteristics" } if "`robust'"!="" { di as error "Warning: robust option is redundant when using the svy option. svyset should be used to identify the survey design characteristics" } qui svyset if r(settings) == ", clear"{ di as error "svyset must be used to identify the survey design characteristics prior to running conindex2 with the svy option." exit 498 } local wtype = r(wtype) local wvar = r(wvar) if "`wtype'" != "." { local weighted "[`wtype' = `wvar']" qui replace `wght'=`wvar' } else replace `wght'=1 local survey "svy:" } markout `touse' `rankvar' `wght' `clus' `compare' quietly { local xxmin: word 1 of `limits' local xxmax: word 2 of `limits' if _by()==1 { if "`compare'"!="" { di as error "The option compare cannot be used in conjunction with by." exit 498 } } if "`compkeep'"=="" local bygroup = _byindex() if "`generalised'"=="generalised" local generalized="generalized" if "`extended'"!="" | "`symmetric'"!="" { di as error "Please see the help file for the correct syntax for the extended and symmetric indices" exit 498 } if "`xxmin'"=="" { scalar xmin=. } else scalar xmin=`xxmin' if "`xxmax'"=="" { scalar xmax=. } else scalar xmax=`xxmax' if "`weight'"!="" { sum `varlist' [aweight`exp'] if `touse' } else sum `varlist' if `touse' return scalar N=r(N) scalar testmean=r(mean) count if `varlist' < 0 & `touse' if r(N) > 0 { noisily disp as txt _n "Note: `varlist' has `r(N)' values less than 0" } if "`rankvar'" == "`varlist'" | "`rankvar'" ==""{ local index = "Gini" } else local index = "CI" gen double `standvar'=`varlist' if "`stvar'" != "" { replace `standvar'=`stvar' local label : variable label `stvar' label variable `standvar' `"`label'"' } gen double `ranking'=`varlist' if "`rankvar'" != "" { replace `ranking'=`rankvar' local label : variable label `rankvar' label variable `ranking' `"`label'"' } gen double `varlist_star'=`varlist' local CompWT_options = " `varlist'" if "`if'"!="" { local compif0="`if' & `compare'==0" local compif1="`if' & `compare'==1" } else { local compif0=" if `compare'==0" local compif1=" if `compare'==1" } forvalues i=0(1)1 { if "`weight'"!=""{ local CompWT_options`i' = "`CompWT_options' [`weight'`exp'] `compif`i'' `in'," } else local CompWT_options`i' = "`CompWT_options' `compif`i'' `in'," } if "`rankvar'"!="" { local Comp_options = "`Comp_options' rankvar(`rankvar')" } if "`cluster'"!="" { local Comp_options = "`Comp_options' cluster(`cluster')" } if xmin!=. { local Comp_options = "`Comp_options' limits(`limits')" } if "`v'"!="" { local Comp_options = "`Comp_options' v(`v')" } if "`beta'"!="" { local Comp_options = "`Comp_options' beta(`beta')" } if "`loud'"!="" { local Comp_options = "`Comp_options' loud" } if "`'"!="" { local Comp_options = "`Comp_options' " } foreach opt in robust truezero generalized bounded wagstaff erreygers svy{ if "``opt''"!="" { local Comp_options = "`Comp_options' `opt'" } } local extended=0 local symmetric=0 local modified=0 local problem=0 if "`truezero'"=="truezero" { if testmean==0 { if `problem'==0 di as err="The mean of the variable (`varlist') is 0 - the standard concentration index is not defined in this case." local problem=1 } if xmin != . { if xmin>0 { if `problem'==0 di as err="The lower bound for a ratio scale variable cannot be greater than 0." local problem=1 } } } if "`generalized'"=="generalized" { local generalized=1 } else local generalized=0 if "`truezero'"!="truezero" { if `generalized'==1 { if `problem'==0 di as err="The option truezero must be used when specifying the generalized option." local problem=1 } else local generalized=0 } if "`bounded'"!="" { if xmax==. { if `problem'==0 di as err="For bounded variables, the limits option must be specified as limits(#1 #2) where #1 is the minimum and #2 is the maximum." local problem=1 } local bounded=1 if xmin > xmax |xmin == xmax | xmin ==.{ if `problem'==0 di as err="For bounded variables, the limits option must be specified as limits(#1 #2) where #1 is the minimum and #2 is the maximum." local problem=1 } sum `varlist' if xmin!=.{ if r(min)<xmin |r(max)>xmax{ if `problem'==0 di as err="The variable (`varlist') takes values outside of the specified limits." local problem=1 } if r(min)>=xmin & r(max)<=xmax{ replace `varlist_star'=(`varlist'-xmin)/(xmax-xmin) } } } else local bounded=0 if "`wagstaff'"=="wagstaff" local wagstaff=1 else local wagstaff=0 if "`erreygers'"=="erreygers" local erreygers=1 else local erreygers=0 if `bounded'==0 & (`erreygers'==1| `wagstaff'==1){ di as err="Wagstaff and Erreygers Normalisations are only for use with bounded variables." di as err="Hence the bounded and limits(#1 #2) options must be used to specify the theoretical minimum (#1) and maximum (#2)." local problem=1 } if (`erreygers'==1 & `wagstaff'==1){ di as err="The option wagstaff cannot be used in conjunction with the option erreygers." local problem=1 } if "`v'"!="" { capture confirm number `v' if _rc { di as err="For the option v(#), # must be a number greater than 1." local problem=1 } if `v'<=1 & _rc==0 { di as err="For the option v(#), # must not be less than 1." local problem=1 } local extended=1 } if "`beta'"!="" { capture confirm number `beta' if _rc { di as err="For the option beta(#), # must be a number greater than 1." local problem=1 } if `beta'<=1 & _rc==0 { di as err="For the option beta(#), # must not be less than 1." local problem=1 } local symmetric=1 } if `extended'==1 & `symmetric'==1{ di as err="The option v(#) cannot be used in conjunction with the option beta(#)." local problem=1 } if (`extended'==1 | `symmetric'==1) & (`erreygers'==1| `wagstaff'==1){ di as err="Wagstaff and Erreygers Normalisations are not supported for extended/symmetric indices." local problem=1 } if (`generalized'==1) & (`erreygers'==1| `wagstaff'==1){ di as err="Cannot specify generalized in conjunction with Wagstaff or Erreygers Normalisations." local problem=1 } if xmin != . { sum `varlist' if r(min)<xmin{ if `problem'==0 di as err="The variable (`varlist') takes values outside of the specified limits." exit 498 } if "`truezero'"=="truezero" { di as txt="Note: The option truezero has been specified in conjunction with the limits option." if `extended'==1 | `symmetric'==1{ di as txt=" The index will be calculated using the standardised variable (`varlist' - min)/(max - min)." } else di as txt=" The limits are redundant as the variable is assumed to be ratio scaled (or fixed)." } } if "`truezero'"!="truezero" & `extended'==0 & `symmetric'==0 & `erreygers'==0 & `wagstaff'==0 & `generalized'==0 & `bounded'==0{ local modified=1 if xmin == . | xmax != . { di as err="For the modified concentration index, the limits option must be specified as limits(#1) where #1 is the minimum." di as err="If you require an alternative index, please look at the help file by typing - help conindex2 - to find the correct syntax." local problem=1 } if xmin == . { di as err="For the modified concentration index (the default), a missing value (.) may not be used as the lower limit. " local problem=1 } sum `varlist' if r(min)==r(max){ di as err="The modified concentration index cannot be computed since the variable (`varlist') is always equal to its minimum value." local problem=1 } } if "`truezero'"!="truezero" { if `extended'==1 | `symmetric'==1{ di as err="The extended and symmetric indices should be used for ratio-scale variables and hence truezero must be specified also." local problem=1 } } if "`graph'"=="graph"{ if "`truezero'"!="truezero" & `bounded'!=0{ di as err="Graph option only available for ratio-scale variables - please also specify the truezero option if the variable is ratio-scale or the bounded option if the variable is bounded." local problem=1 } if "`wagstaff'"=="wagstaff" | "`erreygers'"=="erreygers"{ di as err="Graph option not supported for Wagstaff or Erreygers Normalisations." local problem=1 } if `extended'==1 | `symmetric'==1{ di as err="Graph option not supported for Extended or Symmetric Indices." local problem=1 } } if "`loud'"=="loud" local noisily="noisily" if `problem'==1 exit 498 if `generalized'==1 & `extended'==1 noisily disp as txt _n "Note: The extended index equals the Erreygers normalised CI when v=2" if `generalized'==1 & `symmetric'==1 noisily disp as txt _n "Note: The symmetric index equals the Erreygers normalised CI when beta=2" if "`robust'"=="robust" | "`cluster'"!=""{ local SEtype="Robust std. error" } else local SEtype="Std. error" if "`svy'"!="" & (`extended'==0 & `symmetric'==0) gen `scale'=1 else gen double `scale'=sqrt(`wght') gsort -`touse' `ranking' egen double `sumw'=sum(`wght') if `touse' gen double `cumw'=sum(`wght') if `touse' gen double `cumw_1'=`cumw'[_n-1] if `touse' replace `cumw_1'=0 if `cumw_1'==. bys `ranking': egen double `cumwr'=max(`cumw') if `touse' bys `ranking': egen double `cumwr_1'=min(`cumw_1') if `touse' gen double `frnk'=(`cumwr_1'+0.5*(`cumwr'-`cumwr_1'))/`sumw' if `touse' gen double `temp'=(`wght'/`sumw')*((`frnk'-0.5)^2) if `touse' egen double `sigma2'=sum(`temp') if `touse' replace `temp'=`wght'*`varlist_star' egen double `meanlhs'=sum(`temp') if `touse' replace `meanlhs'=`meanlhs'/`sumw' if `modified'==1 & `bounded'==0{ replace `meanlhs'=`meanlhs'-xmin } if "`graph'"=="graph" { capture which lorenz if _rc==111 disp "conindex2 requires the lorenz.ado by Ben Jahn to produce graphs. Please install this before using conindex2." if "`ytitle'" ==""{ local ytext : variable label `varlist' if "`ytext'" == "" local ytext "`varlist'" local ytitle = "Cumulative share of `ytext'" if `generalized'==1 { if "`ytext'" == "" local ytext "`varlist'" local ytitle = "Cumulative average of `ytext'" } } if "`xtitle'" ==""{ if "`rankvar'" == "" local xtext : variable label `varlist' if "`rankvar'" != "" local xtext : variable label `ranking' if "`xtext'" == "" local xtext "`rankvar'" if "`xtext'" == "" local xtext "`varlist'" local xtitle = "Rank of `xtext'" } if `generalized'== 0{ lorenz estimate `varlist_star', pvar(`ranking') lorenz graph, ytitle(`ytitle', size(medsmall)) yscale(titlegap(5)) xtitle(`xtitle', size(medsmall)) ytitle(`ytitle', size(medsmall)) graphregion(color(white)) bgcolor(white) } if `generalized'==1 { lorenz estimate `varlist_star', pvar(`ranking') generalized lorenz graph, ytitle(`ytitle', size(medsmall)) yscale(titlegap(5)) xtitle(`xtitle', size(medsmall)) ytitle(`ytitle', size(medsmall)) graphregion(color(white)) bgcolor(white) } } noisily di in smcl /// "{hline 19}{c TT}{hline 13}{c TT}{hline 13}{c TT}{hline 19}" _c noi di in smcl "{c TT}{hline 10}{c TRC}" noisily di in text "Index:" _col(20) "{c |} No. of obs." _col(34) /// "{c |} Index value" _col(48) "{c |} `SEtype'" _col(68) /// "{c |} p-value" _col(79) "{c |}" noisily di in smcl /// "{hline 19}{c +}{hline 13}{c +}{hline 13}{c +}{hline 19}" _c noi di in smcl "{c +}{hline 10}{c RT}" gen double `lhs'=2*`sigma2'*(`varlist_star'/`meanlhs')*`scale' if `touse' gen double `intercept'=`scale' if `touse' gen double `rhs'=`frnk'*`scale' if `touse' local type = "`index'" if `modified'==1 & `bounded'==0{ replace `meanlhs'=`meanlhs'+xmin } if `generalized'==0 & `erreygers'==0 & `wagstaff'==0{ `noisily' disp "`index'" local type = "`index'" } if `modified'==1 { `noisily' disp "Modified `index'" local type = "Modified `index'" replace `lhs'=`lhs'*(`meanlhs')/(`meanlhs'-xmin) if `touse' ==1 } if `wagstaff'==1{ `noisily' disp "Wagstaff Normalisation" local type = "Wagstaff norm. `index'" replace `lhs'= `lhs'/(1-`meanlhs') if `touse' } if `erreygers'==1{ `noisily' disp "Errygers Normalisation" local type = "Erreygers norm. `index'" replace `lhs'= `lhs'*(4*`meanlhs') if `touse' } if `generalized'==1 { `noisily' disp "Gen. standard `index'" local type = "Gen. `index'" replace `lhs'=`lhs'*`meanlhs' if `touse' } if `extended'==1 | `symmetric'==1{ gsort -`touse' `frnk' gen double `temp1'=`wght'*`varlist_star' if `touse' egen double `sumlhs'=sum(`temp1') if `touse' bys `ranking': egen double `sumwr'=sum(`wght') if `touse' bys `ranking': egen double `counts'=count(`temp1') if `touse' gen `meanoverall'=`sumlhs'/`sumw' if `touse' bys `ranking': egen double `temp0'=rank(`ranking') if `touse', unique bys `ranking': egen double `meanlhs2'=sum(`temp1') if `touse' replace `meanlhs2'=`meanlhs2'/`sumwr' if `touse' } if `extended'==1{ capture drop `lhs' capture drop `rhs' capture drop `temp2' gen double `rhs'=((`sumwr'/`sumw')+((1-(`cumwr'/`sumw'))^`v')-((1-(`cumwr_1'/`sumw'))^`v')) if `temp0'==1 egen double `temp2'=sum(`rhs'^2) if `temp0'==1 gen double `lhs'=(`meanlhs2'/`meanoverall')*`temp2' if `touse' & `temp0'==1 local type = "Extended `index'" if `generalized'==1{ local type = "Gen. extended `index'" replace `lhs'=(`meanlhs2'*(`v'^(`v'/(`v'-1)))/(`v'-1))*`temp2' if `touse' & `temp0'==1 } } if `symmetric'==1{ capture drop `lhs' capture drop `rhs' capture drop `temp2' gen double `rhs'=(2^(`beta'-2))*(abs((`cumwr'/`sumw'-0.5))^`beta'-(abs(`cumwr_1'/`sumw'-0.5))^`beta') if `temp0'==1 egen double `temp2'=sum(`rhs'^2) if `temp0'==1 gen double `lhs'=(`meanlhs2'/`meanoverall')*`temp2' if `touse' & `temp0'==1 local type = "Symmetric `index'" if `generalized'==1{ local type = "Gen. symmetric `index'" replace `lhs'=`meanlhs2'*4*`temp2' if `touse' & `temp0'==1 } } `noisily' regress `lhs' `rhs' `intercept' `standvar' if `touse'==1, `robust' cluster(`cluster') noconstant if "`survey'"=="" `noisily' regress `lhs' `rhs' `intercept' `standvar' if `touse'==1, `robust' cluster(`cluster') noconstant if "`survey'"=="svy:" `noisily' svy: regress `lhs' `rhs' `intercept' `standvar' if `touse'==1, noconstant return scalar RSS=e(rss) mat b=e(b) mat V=e(V) return scalar CI= b[1,1] return scalar CIse= sqrt(V[1,1]) if `extended'==1 | `symmetric'==1{ `noisily' regress `lhs' `rhs' `standvar' if `temp0'==1, robust return scalar RSS=e(rss) mat b=e(b) mat V=e(V) return scalar CI= b[1,1] return scalar CIse = . } return scalar Nunique= e(N) local nclus= e(N_clust) local t=return(CI)/return(CIse) local p=2*ttail(e(df_r),abs(`t')) noisily di in text "`type'" _col(20) "{c |} " as result return(N) /// _col(34) "{c |} " as result return(CI) _col(48) "{c | }" /// as result return(CIse) _col(68) "{c |} " as result %7.4f /// `p' _col(79)"{c |}" noisily di in smcl /// "{hline 19}{c BT}{hline 13}{c BT}{hline 13}{c BT}{hline 19}" _c noi di in smcl "{c BT}{hline 10}{c BRC}" if `nclus'!=. noisily di in text "(Note: Std. error adjusted for `nclus' clusters in `cluster')" if return(Nunique)!=return(N) noisily di in text "(Note: Only " return(Nunique) " unique values for `rankvar')" if `extended'==1 | `symmetric'==1{ noisily di in text "(Note: Standard errors for the extended and symmetric indices are not calculated by the current version of conindex2.)" } if "`keeprank'"!="" { tempname savedrank gen double `savedrank'=`frnk' if _by()==0 { confirm new variable `keeprank'`compkeep' gen double `keeprank'`compkeep'=`savedrank' } if _by()==1 { gen double `keeprank'_`bygroup'=`savedrank' } } if "`compkeep'"!="" { confirm new variable templhs gen double templhs=`lhs' confirm new variable temprhs gen double temprhs=`rhs' } if "`compare'"!=""{ egen `group' = group(`compare') qui sum `group' if `touse' , meanonly scalar gmax=r(max) noisily di in text "" noisily di in text "" noisily di in text "For groups:" noisily di in text "" noisily di in text "" gen double `lhscomp'=. gen double `rhscomp'=. foreach i of num 1/`=scalar(gmax)' { if "`if'"!="" { local compif`i'="`if' & `group'==`i'" } else { local compif`i'=" if `group'==`i'" } if "`weight'"!=""{ local CompWT_options`i' = "`CompWT_options' [`weight'`exp'] `compif`i'' `in'," } else local CompWT_options`i' = "`CompWT_options' `compif`i'' `in'," qui sum `compare' if `touse' & `group'==`i', meanonly noisily di in text "CI for group `i': `compare' = "r(mean) noisily conindex2 `CompWT_options`i'' `Comp_options' keeprank(`keeprank') compkeep(`i') noisily di in text "" replace `lhscomp'=templhs if `touse' & `group'==`i' replace `rhscomp'=temprhs if `touse' & `group'==`i' drop templhs temprhs } `noisily' regress `lhscomp' c.`rhscomp' i.`group' if `touse', `robust' cluster(`cluster') return scalar N_restricted=e(N) return scalar SSE_restricted=e(rss) `noisily' regress `lhscomp' c.`rhscomp'##i.`group' if `touse', `robust' cluster(`cluster') noisily di in text "" return scalar SSE_unrestricted=e(rss) return scalar N_unrestricted=e(N) return scalar F=[(return(SSE_restricted)-return(SSE_unrestricted))/(gmax-1)]/(return(SSE_unrestricted)/(return(N_restricted)-2*gmax)) local p=1 - F(gmax-1,(return(N_restricted)- 2*gmax), return(F)) /* OO'D made two changes to second df 28.5.14 */ noisily di in text "Test for stat. significant differences with Ho: diff=0 (assuming equal variances)" _col(50) " noi di in smcl "{hline 19}{c TT}{hline 19}{c TRC}" noisily di in text "F-stat = " as result return(F) _col(20) "{c |} p-value= " as result %7.4f `p' _col(40) "{c |}" noi di in smcl "{hline 19}{c BT}{hline 19}{c BRC}" if gmax==2{ disp "Group: `compare'=0" conindex2 `CompWT_options1' `Comp_options' return scalar CI0=r(CI) return scalar CIse0=r(CIse) disp "Group: `compare'=1" conindex2 `CompWT_options2' `Comp_options' return scalar CI1=r(CI) return scalar CIse1=r(CIse) return scalar Diff= return(CI1)-return(CI0) return scalar Diffse= sqrt((return(CIse0))^2 + (return(CIse1))^2) return scalar z=return(Diff)/return(Diffse) local p=2*(1-normal(abs(return(z)))) noisily di in text "Test for stat. significant differences with Ho: diff=0 " _col(50) "(large sample assumed)" noi di in smcl /// "{hline 19}{c TT}{hline 23}{c TT}{hline 17}{c TT}{hline 18}{c TRC}" noisily di in text "Diff. = " as result return(Diff) _col(20) /// "{c |} Std. err. = " as result return(Diffse) _col(44) /// "{c |} z-stat = " as result %7.2f return(z) _col(59) "{c |} p-value = " as result %7.4f `p' _col(79)"{c |}" noi di in smcl /// "{hline 19}{c BT}{hline 23}{c BT}{hline 17}{c BT}{hline 18}{c BRC}" } } } end
Any help would be much appreciated.
Thanos
0 Response to Standardized concentration indices with conindex
Post a Comment