Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
From | Ekaterina Hertog <ekaterina.hertog@sociology.ox.ac.uk> |
To | "statalist@hsphsun2.harvard.edu" <statalist@hsphsun2.harvard.edu> |
Subject | Re: st: Re: calculating proportions |
Date | Tue, 21 Feb 2012 17:22:48 +0000 |
Dear Pathmes and Oliver,thanks a lot, great code and it solves my problems! And I learned more than 3 things from it
Just a small hitch: converting numbers to proportions syntax: gen fap=fa/`N_female' gives an error message: 'invalid syntax'.I went around it by creating a variable which is a constant and equals a total number of women in the population and using it instead of the local macro. I clumsy way to do it.
katya On 21/02/2012 16:45, Pathmeswaran wrote:
Thanks Oliver. With your help I was able to learn 3 things on my first day in statalist! forvalues `r(N)' indentation in foreach/ forvalue loops *************** example code begins ************************** version 8 clear all set obs 7 gen byte id = _n gen byte sex = 1 replace sex = 0 in 4/7 label def lbl_sex 0 "male" 1 "female" label values sex lbl_sex gen int income = 7 replace income = 10 in 3 replace income = 0 in 4 replace income = 7 in 5 replace income = 9 in 6 replace income = 11 in 7 list * I have just copied Oliver's code sort sex gen idm=_n if sex==0 * idm is a unique number for each male gen fa=. label variable fa "Number of females with higher income" gen fb=. label variable fb "Number of females with lower income" gen fe=. label variable fe "Number of females with equal income" * The variables fa, fb& fe are generated individually for each male in the following loop quietly{ count if sex == 0 local N_male = `r(N)' count if sex == 1 local N_female = `r(N)' forvalues i = 1/`N_male' { egen int feabove = rank(income) if sex==1 | (sex==0& idm==`i'), field replace fa= feabove - 1 if idm==`i' drop feabove egen int febelow = rank(income) if sex==1 | (sex==0& idm==`i'), track replace fb= febelow - 1 if idm==`i' drop febelow replace fe=`N_female' - ( fa+ fb) if idm==`i' } } * Converting the numbers to proportions gen fap=fa/`N_female' label variable fap "Proportion of females with higher income" gen fbp=fb/`N_female' label variable fbp "Proportion of females with lower income" gen fep=fe/`N_female' label variable fep "Proportion of females with equal income" **************** example code ends *************************** With regards, Pathmes Prof A Pathmeswaran Professor in Public Health Faculty of Medicine, University of Kelaniya Ragama, Sri Lanka +94 11 295 3411 "Not everything that counts can be counted and not everything that can be counted counts" On 21 February 2012 21:09, Oliver Jones<ojones@wiwi.uni-bielefeld.de> wrote:Hi Pathemes, your code looks good to me, but I'm no programmer. I just have two very minor and highly subjective suggestions: 1. in the foreach statement use a local to tell Stata the end of the numlist, i.e. count if sex == 0 local N_male = `r(N)' foreach i of numlist 1/`N_male' { and by the way in this case it might be more appropriate to use forvalues insteed, which is the fastest way to loop over consecutive values, such as looping over numbers from 1 to k. (From the Stata Help to foreach) 2. Indent after the foreach / forvalues statement, i.e. forvalues i = 1/`N_male' { code code code } Best Oliver* * For searches and help try: * http://www.stata.com/help.cgi?search * http://www.stata.com/support/statalist/faq * http://www.ats.ucla.edu/stat/stata/
* * For searches and help try: * http://www.stata.com/help.cgi?search * http://www.stata.com/support/statalist/faq * http://www.ats.ucla.edu/stat/stata/