%MACRO R0313L1M(INP=, IND=, OUTDATA=, IDVAR=, KEEPVAR=, SEDITS=, DATE_ASOF=, FMNAME=, AGEFMT=, SEXFMT=, DF=1, AGESEXMAC=AGESEXV4, EDITMAC=R03EDIT1, LABELMAC=R02X78L1, HIERMAC=R02X78H1, MULTCCMAC=R02X78M2, SCOREMAC=SCOREVAR); %********************************************************************** * R0313L1M creates RXHCC and score variables for each person present * in the user-provided PERSON file. * If a person has at least one diagnosis in user-provided DIAG file * then RXHCCs are created, otherwise RXHCCs are set to 0. * Score variables are created using coefficients from 8 final models: * 5 continuing enrollee and 3 new enrollee models. * * Assumptions about input files: * - both files are sorted by person ID * - person level file has the following variables: * :&IDVAR - person ID variable (it is a macro parameter) * :DOB - date of birth * :SEX - sex * :OREC - original reason for entitlement * :ESRD - end stage renal disease * * - diagnosis level file has the following vars: * :&IDVAR - person ID variable (it is a macro parameter) * :DIAG - diagnosis * * Parameters: * INP - input person dataset * IND - input diagnosis dataset * OUTDATA - output dataset * IDVAR - name of person id variable (HICNO for medicare data) * KEEPVAR - variables kept in the output dataset * SEDITS - a switch that controls whether to perform edits * on ICD9: 1-YES, 0-NO * DATE_ASOF - SAS date for age calculation (Feb 1 of payment year) * FMNAME - format to crosswalk ICD9 to V03 RXCC * AGEFMT - format to crosswalk ICD9 to acceptable age range in * case edits on ICD9 are to be performed * SEXFMT - format to crosswalk ICD9 to acceptable sex in case * edits on ICD9 are to be performed * DF - factor set by CMS to scale coefficients if required * (1 = no adjustment made) * AGESEXMAC - external macro name: create age/sex and * originally disabled variables * EDITMAC - external macro name: perform edits to diagnosis * LABELMAC - external macro name: assign labels to RXHCCs * HIERMAC - external macro name: set RXHCC=0 according to * hierarchies * MULTCCMAC - external macro name: assign one ICD9 to multiple * RXCCs * SCOREMAC - external macro name: calculate a score variable * * External macros: * %AGESEXV4 - create age/sex, originally disabled and nonaged * variables * %R03EDIT1 - perform edits to diagnosis * %R02X78M2 - assign one ICD9 to multiple RXCCs * %R02X78L1 - assign labels to RXHCCs * %R02X78H1 - set RXHCC=0 according to hierarchies * %SCOREVAR - calculate a score variable * **********************************************************************; **********************************************************************; * step1: include external macros; **********************************************************************; %IF "&AGESEXMAC" ne "" %THEN %DO; %INCLUDE IN0(&AGESEXMAC) /SOURCE2; %* create demographic variables; %END; %IF "&EDITMAC" ne "" %THEN %DO; %INCLUDE IN0(&EDITMAC) /SOURCE2; %* perform edits; %END; %IF "&LABELMAC" ne "" %THEN %DO; %INCLUDE IN0(&LABELMAC) /SOURCE2; %* RXHCC labels; %END; %IF "&HIERMAC" ne "" %THEN %DO; %INCLUDE IN0(&HIERMAC) /SOURCE2; %* hierarchies; %END; %IF "&MULTCCMAC" ne "" %THEN %DO; %INCLUDE IN0(&MULTCCMAC) /SOURCE2; %* multiple RXCCs; %END; %IF "&SCOREMAC" ne "" %THEN %DO; %INCLUDE IN0(&SCOREMAC) /SOURCE2; %* calculate score variable; %END; **********************************************************************; * step2: define internal macro variables; **********************************************************************; %LET N_RX=180; %*max # of RXHCCs; %* 10 NOT AGED continuing enrollee age/sex variables; %let NOAGEDAGESEXVARS=%str( F0_34 F35_44 F45_54 F55_59 F60_64 M0_34 M35_44 M45_54 M55_59 M60_64 ); %* 14 AGED continuing enrollee age/sex variables; %let AGEDAGESEXVARS=%str( F65_69 F70_74 F75_79 F80_84 F85_89 F90_94 F95_GT M65_69 M70_74 M75_79 M80_84 M85_89 M90_94 M95_GT ); %* 12 interactions with NonAged for Institutional continuing enrollees; %let INTERACTVARS=%str( NonAged_RXHCC1 NonAged_RXHCC58 NonAged_RXHCC59 NonAged_RXHCC60 NonAged_RXHCC61 NonAged_RXHCC62 NonAged_RXHCC63 NonAged_RXHCC65 NonAged_RXHCC75 NonAged_RXHCC78 NonAged_RXHCC79 NonAged_RXHCC80 ); %* 108 ORIGDS x ESRD x age/sex variables for New Enrollees; %let NE_INTERACTVARS=%str( NESRD_NOD_x_F0_34 NESRD_NOD_x_F35_44 NESRD_NOD_x_F45_54 NESRD_NOD_x_F55_59 NESRD_NOD_x_F60_64 NESRD_NOD_x_F65 NESRD_NOD_x_F66 NESRD_NOD_x_F67 NESRD_NOD_x_F68 NESRD_NOD_x_F69 NESRD_NOD_x_F70_74 NESRD_NOD_x_F75_79 NESRD_NOD_x_F80_84 NESRD_NOD_x_F85_89 NESRD_NOD_x_F90_94 NESRD_NOD_x_F95_GT NESRD_NOD_x_M0_34 NESRD_NOD_x_M35_44 NESRD_NOD_x_M45_54 NESRD_NOD_x_M55_59 NESRD_NOD_x_M60_64 NESRD_NOD_x_M65 NESRD_NOD_x_M66 NESRD_NOD_x_M67 NESRD_NOD_x_M68 NESRD_NOD_x_M69 NESRD_NOD_x_M70_74 NESRD_NOD_x_M75_79 NESRD_NOD_x_M80_84 NESRD_NOD_x_M85_89 NESRD_NOD_x_M90_94 NESRD_NOD_x_M95_GT ESRD_NOD_x_F0_34 ESRD_NOD_x_F35_44 ESRD_NOD_x_F45_54 ESRD_NOD_x_F55_59 ESRD_NOD_x_F60_64 ESRD_NOD_x_F65 ESRD_NOD_x_F66 ESRD_NOD_x_F67 ESRD_NOD_x_F68 ESRD_NOD_x_F69 ESRD_NOD_x_F70_74 ESRD_NOD_x_F75_79 ESRD_NOD_x_F80_84 ESRD_NOD_x_F85_89 ESRD_NOD_x_F90_94 ESRD_NOD_x_F95_GT ESRD_NOD_x_M0_34 ESRD_NOD_x_M35_44 ESRD_NOD_x_M45_54 ESRD_NOD_x_M55_59 ESRD_NOD_x_M60_64 ESRD_NOD_x_M65 ESRD_NOD_x_M66 ESRD_NOD_x_M67 ESRD_NOD_x_M68 ESRD_NOD_x_M69 ESRD_NOD_x_M70_74 ESRD_NOD_x_M75_79 ESRD_NOD_x_M80_84 ESRD_NOD_x_M85_89 ESRD_NOD_x_M90_94 ESRD_NOD_x_M95_GT NESRD_OD_x_F65 NESRD_OD_x_F66 NESRD_OD_x_F67 NESRD_OD_x_F68 NESRD_OD_x_F69 NESRD_OD_x_F70_74 NESRD_OD_x_F75_79 NESRD_OD_x_F80_84 NESRD_OD_x_F85_89 NESRD_OD_x_F90_94 NESRD_OD_x_F95_GT NESRD_OD_x_M65 NESRD_OD_x_M66 NESRD_OD_x_M67 NESRD_OD_x_M68 NESRD_OD_x_M69 NESRD_OD_x_M70_74 NESRD_OD_x_M75_79 NESRD_OD_x_M80_84 NESRD_OD_x_M85_89 NESRD_OD_x_M90_94 NESRD_OD_x_M95_GT ESRD_OD_x_F65 ESRD_OD_x_F66 ESRD_OD_x_F67 ESRD_OD_x_F68 ESRD_OD_x_F69 ESRD_OD_x_F70_74 ESRD_OD_x_F75_79 ESRD_OD_x_F80_84 ESRD_OD_x_F85_89 ESRD_OD_x_F90_94 ESRD_OD_x_F95_GT ESRD_OD_x_M65 ESRD_OD_x_M66 ESRD_OD_x_M67 ESRD_OD_x_M68 ESRD_OD_x_M69 ESRD_OD_x_M70_74 ESRD_OD_x_M75_79 ESRD_OD_x_M80_84 ESRD_OD_x_M85_89 ESRD_OD_x_M90_94 ESRD_OD_x_M95_GT ); %* 8 model variables lists; %* (1) Continuing Enrollee Non-Low Income Aged; %let MODEL1VARS=%str( &AGEDAGESEXVARS F65OD M65OD &RXHCCV3_list78 ); %* (2) Continuing Enrollee Non-Low Income Non-Aged; %let MODEL2VARS=%str( &NOAGEDAGESEXVARS &RXHCCV3_list78 ); %* (3) Continuing Enrollee Low Income Aged; %let MODEL3VARS=%str( &AGEDAGESEXVARS F65OD M65OD &RXHCCV3_list78 ); %* (4) Continuing Enrollee Low Income Non-Aged; %let MODEL4VARS=%str( &NOAGEDAGESEXVARS &RXHCCV3_list78 ); %* (5) Continuing Enrollee Institutional with Non-Aged Interactions; %let MODEL5VARS=%str( &AGESEXVARS ORIGDS &RXHCCV3_list78 &INTERACTVARS ); %* (6) New Enrollee Community Non-Low Income; %let MODEL6VARS=%str( &NE_INTERACTVARS ); %* (7) New Enrollee Community Low Income; %let MODEL7VARS=%str( &NE_INTERACTVARS ); %* (8) New Enrollee Institutional; %let MODEL8VARS=%str( &NE_INTERACTVARS ); **********************************************************************; * step3: merge person and diagnosis files outputting one record * per person with score and RXHCC variables for each input * person level record **********************************************************************; DATA &OUTDATA(KEEP=&IDVAR &KEEPVAR ); ****************************************************; * step3.1: declaration section; ****************************************************; %IF "&LABELMAC" ne "" %THEN %&LABELMAC; %*RXHCC labels; %*length of new variables; LENGTH RXCC $4. AGEF 3. RXCC1-RXCC&N_RX RXHCC1-RXHCC&N_RX &INTERACTVARS NESRD_NORIGDIS NESRD_ORIGDIS ESRD_NORIGDIS ESRD_ORIGDIS &NE_INTERACTVARS 3.; %*retain cc & age vars; RETAIN RXCC1-RXCC&N_RX 0 AGEF ; %*arrays; ARRAY R(&N_RX) RXCC1-RXCC&N_RX; ARRAY RX(&N_RX) RXHCC1-RXHCC&N_RX; %*interaction vars; ARRAY RV &INTERACTVARS; ARRAY NEIN &NE_INTERACTVARS; %*array of age/sex cells for new enrollee models; ARRAY NEAS(32) &NEAGESEXVARS; ****************************************************; * step3.2: to bring in regression coefficients; ****************************************************; IF _N_ = 1 THEN SET INCOEF.RXCOEFF; ****************************************************; * step3.3: merge ****************************************************; MERGE &INP(IN=IN1) &IND(IN=IN2) END=EOF; BY &IDVAR; RETAIN CNT 0; IF IN1 THEN DO; ********************************************************; * step3.4: for the first record for a person set RXCC to 0 * and calculate age ********************************************************; IF FIRST.&IDVAR THEN DO; %*set RXCCs to 0; DO I=1 TO &N_RX; R(I)=0; END; %* age; AGEF =FLOOR((INTCK( 'MONTH',DOB,&DATE_ASOF)-(DAY(&DATE_ASOF)