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.