%MACRO R0518P1M(INP=, IND=, OUTDATA=, IDVAR=, KEEPVAR=, SEDITS=, DATE_ASOF=, FMNAME0=Y17Y18QC, AGEFMT0=IAGEHYBCY17MCE, SEXFMT0=ISEXHYBCY17MCE, DF=1, AGESEXMAC=AGESEXV4, EDITMAC0=R05I0ED2, LABELMAC=R05X76L1, HIERMAC=R05X76H1, SCOREMAC=SCOREVAR); %********************************************************************** * R0518P1M 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 MCE edits * on ICD10: 1-YES, 0-NO * DATE_ASOF - SAS date for age calculation (Feb 1 of payment year) * FMNAME0 - format name (crosswalk ICD10 to V05 RxCCs) * AGEFMT0 - format name (crosswalk ICD10 to acceptable age range * in case MCE edits on diags are to be performed) * SEXFMT0 - format name (crosswalk ICD10 to acceptable sex in * case MCE edits on diags 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 * EDITMAC0 - external macro name: perform edits to ICD10 * LABELMAC - external macro name: assign labels to RXHCCs * HIERMAC - external macro name: set RXHCC=0 according to * hierarchies * SCOREMAC - external macro name: calculate a score variable * * External macros: * %AGESEXV4 - create age/sex, originally disabled and nonaged * variables * %R05I0ED2 - perform edits to ICD10 diagnosis * %R05X76L1 - assign labels to RXHCCs * %R05X76H1 - 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 "&EDITMAC0" ne "" %THEN %DO; %INCLUDE IN0(&EDITMAC0) /SOURCE2; %* perform edits on ICD10; %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 "&SCOREMAC" ne "" %THEN %DO; %INCLUDE IN0(&SCOREMAC) /SOURCE2; %* calculate score variable; %END; **********************************************************************; * step2: define internal macro variables; **********************************************************************; %LET RxHCClist=&RXHCCV5_list76; %LET RxCClist=&RXCCV5_list76; %LET N_RX=%sysfunc(countw(&RXHCClist)); %PUT "number of CCs in the main program list: " &N_RX; %PUT "RXCC list: " &RXCClist; %* macro to find RXCC number in array of RXCCs; %MACRO FIND; %LET J=1; %DO %UNTIL(IND=0 OR &J > &N_RX); IF RRR="%SCAN(&RXCClist,&J)" THEN IND=&J; %LET J=%EVAL(&J+1); %END; %MEND FIND; %* 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_RXHCC130 NonAged_RXHCC131 NonAged_RXHCC132 NonAged_RXHCC133 NonAged_RXHCC134 NonAged_RXHCC135 NonAged_RXHCC145 NonAged_RXHCC160 NonAged_RXHCC163 NonAged_RXHCC164 NonAged_RXHCC165 ); %* 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 &RXHCCV5_list76 ); %* (2) Continuing Enrollee Non-Low Income Non-Aged; %let MODEL2VARS=%str( &NOAGEDAGESEXVARS &RXHCCV5_list76 ); %* (3) Continuing Enrollee Low Income Aged; %let MODEL3VARS=%str( &AGEDAGESEXVARS F65OD M65OD &RXHCCV5_list76 ); %* (4) Continuing Enrollee Low Income Non-Aged; %let MODEL4VARS=%str( &NOAGEDAGESEXVARS &RXHCCV5_list76 ); %* (5) Continuing Enrollee Institutional with Non-Aged Interactions; %let MODEL5VARS=%str( &AGESEXVARS ORIGDS &RXHCCV5_list76 &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. RRR $8. &RXCClist &RXHCClist &INTERACTVARS NESRD_NORIGDIS NESRD_ORIGDIS ESRD_NORIGDIS ESRD_ORIGDIS &NE_INTERACTVARS 3.; %*retain cc & age vars; RETAIN &RXCClist 0 AGEF ; %*arrays; ARRAY R(&N_RX) &RXCClist; ARRAY RX(&N_RX) &RXHCClist; %*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; 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)