* USER = your-userId * PASSWORD = your-password * PACKAGE = SAS * PROJECT = LIS /*----------------------------------*/ /* SAS ENVIRONMENT DEF */ /*----------------------------------*/ OPTIONS nodate nofmterr nosource nocenter label nonotes nonumber LS=200 PS=30; TITLE " " ; /*----------------------------------*/ /* JOB SUBMISSION: DEFINE DATASET */ /*----------------------------------*/ %LET cc = your-cc ; %LET yy = your-yy ; /*----------------------------------*/ /* MACRO PREPARE DATASET */ /*----------------------------------*/ %MACRO Prep ; DATA prep (DROP=d5 hweight); SET &&&cc.&yy.h (KEEP=country hweight d4 d5 dpi); * select only records if DPI filled; IF dpi in (. 0) THEN DELETE; * avoid double counting of household records ; IF d5 = 3 THEN DELETE; * set equivalence scale as square root of number of persons; ey = dpi / SQRT(d4); * create person weight as hweight times number of persons; wt = hweight * d4; RUN; * Get the median dpi & the mean equivalised income ; PROC UNIVARIATE DATA=prep NOPRINT; VAR ey dpi ; WEIGHT wt ; OUTPUT OUT=temp MEAN=aveey MEDIAN=medey medpi ; RUN ; DATA _NULL_; SET temp; CALL SYMPUT("m",medpi); CALL SYMPUT("a",aveey); RUN; DATA start (DROP= botlin toplin); SET prep ; * bottomcoding at one percent equivalized mean; botlin = 0.01 * &a; IF ey < botlin THEN ey = botlin ; * topcoding at ten times unequivalized median ; toplin = 10 * &m; IF dpi > toplin THEN ey = (toplin/(SQRT(d4))) ; RUN ; PROC SORT DATA=start; BY country ey ; RUN ; %MEND Prep ; /*-------------------------------------*/ /* MACRO: CALCULATE GINI COEFFICIENT */ /*-------------------------------------*/ %MACRO gini; DATA &cc.&yy._1 (KEEP=country gini) ; SET start END=eof; BY country ; RETAIN swt swtey swt2ey swteycw; * Initialise temp variables; IF _N_ = 1 THEN DO ; swt = 0; swtey = 0; swt2ey = 0; swteycw = 0; END ; * Calculation; swt = swt + wt ; swtey = swtey + (wt*ey) ; swt2ey = swt2ey + (wt*wt*ey) ; swteycw = swteycw + (swt*wt*ey); * Output Gini at the last observation; IF eof THEN DO ; gini = 100*((2*swteycw-swt2ey)/(swt * swtey)-1); OUTPUT ; END ; RUN; %MEND Gini; /*----------------------------------*/ /* MACRO: DEFINE QUANTILES */ /*----------------------------------*/ %MACRO quantile ; PROC UNIVARIATE DATA=start NOPRINT; BY country ; VAR ey ; WEIGHT wt ; OUTPUT OUT = tmp PCTLPTS = 10 20 50 80 90 PCTLPRE = dec ; RUN ; DATA &cc.&yy._2 (KEEP=country d9010 d9050 d8020) ; MERGE start (KEEP=country) tmp ; d9010 = dec90 / dec10 ; d9050 = dec90 / dec50 ; d8020 = dec80 / dec20 ; IF _N_ = 1 ; RUN; %MEND quantile ; /*----------------------------------*/ /* MACRO: CALCULATE ATKINSON INDEX */ /*----------------------------------*/ %MACRO Atkin; DATA tempo ; IF _N_ = 1 THEN DO UNTIL (last) ; SET start END=last; swt + wt ; swtey + (wt*ey) ; END ; SET start ; BY country ; mwtey = swtey / swt ; yy = (ey/mwtey) ; RUN ; DATA &cc.&yy._3 (KEEP=country atk5 atk1); SET tempo END=eof; BY country ; ratio1 = log(yy) ; cwtratio1 + (ratio1*(wt/swt)) ; ratio5 = yy**(1-0.5) ; cwtratio5 + (ratio5*(wt/swt)) ; IF eof THEN DO ; right1 = exp((cwtratio1)) ; atk1 = 1 - right1 ; right5 = (cwtratio5)**(1/0.5); atk5 = 1 - right5 ; OUTPUT ; END ; RUN; %MEND Atkin ; /*-----------------------*/ /* MACRO: PROC TABULATE */ /*-----------------------*/ %MACRO tabulate ; PROC TABULATE DATA=&dataset FORMAT=&formgen FORMCHAR=&bordure NOSEPS ; CLASS &classe ; VAR &variable ; TABLE &table / CONDENSE PRINTMISS BOX="&box" RTS=&rts ; KEYLABEL &lab ; RUN ; %MEND tabulate ; /*------------------------*/ /* MACRO DISPLAY RESULTS */ /*------------------------*/ %MACRO show ; DATA &cc.&yy._KF ; MERGE &cc.&yy._1 &cc.&yy._2 &cc.&yy._3 ; BY country ; ATTRIB gini label='Gini Coefficient ' format=10.4 atk5 label='Atkinson (epsilon=0.5) ' format=10.4 atk1 label='Atkinson (epsilon=1.0) ' format=10.4 d9010 label='Percentile ratio(90/10)' format=10.4 d9050 label='Percentile ratio(90/50)' format=10.4 d8020 label='Percentile ratio(80/20)' format=10.4 ; RUN ; %LET dataset= &cc.&yy._KF ; %LET formgen = 15.4 ; %LET bordure = '|----|+|---+' ; %LET classe = country ; %LET variable = gini atk5 atk1 ; %LET table = country, gini atk5 atk1 ; %LET box = 'Gini & Atkinson index' ; %LET rts = 40 ; %LET lab = sum = ' ' ; %TABULATE %LET dataset= &cc.&yy._KF ; %LET formgen = 15.4 ; %LET bordure = '|----|+|---+' ; %LET classe = country ; %LET variable = d9010 d9050 d8020 ; %LET table = country, d9010 d9050 d8020 ; %LET box = 'Percentile ratios' ; %LET rts = 40 ; %LET lab = sum = ' ' ; %TABULATE %MEND show ; &&&cc.&yy.f ; %PREP %QUANTILE %GINI %ATKIN %SHOW