 %MACRO E2423T1M(INP=, IND=, OUTDATA=, IDVAR=, KEEPVAR=, 
                 FMNAME0   =012324Y22Y23MC, 
                 AGEFMT0   =IAGEHYBCY22MCE, 
                 SEXFMT0   =ISEXHYBCY22MCE,
                 EDITMAC0  =V24I0ED2,
                 SEDITS=, DATE_ASOF=,
                 DF_DG=, DF_POSTG=, 
                 AGESEXMAC=AGESEXV2, 
                 LABELMAC=V24H86L1, HIERMAC=V24H86H1, 
                 SCOREMAC=SCOREVAR);

 %**********************************************************************
 * E2423T1M creates HCC and score variables for each person who is
 * present in a person file.
 * If a person has at least one diagnosis in DIAG file then HCCs are
 * created, otherwise HCCs are set to 0.
 * Score variables are created using coefficients from 8 final models:
 * Dialysis Continuing Enrollee, Dialysis New Enrollee, 
 * Functioning Graft Community NonDual and Partial Benefit Dual Aged,
 * Functioning Graft Community NonDual and Partial Benefit Dual NonAged,
 * Functioning Graft Community Full Benefit Dual Aged,
 * Functioning Graft Community Full Benefit Dual NonAged,
 * Functioning Graft Institutional, Functioning Graft New Enrollee.
 *
 * 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     - gender
 *     :OREC    - original reason for entitlement
 *     :FBDual	 - =1 if bene in Full Benefit Dual status in the month,
 *                =0 otherwise
 *     :PBDual  - =1 if bene in Partial Benefit Dual status in the month,
 *                =0 otherwise
 *     :LTI     - =1 if bene in LTI status in the month,
 *                =0 otherwise
 *
 *   - 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 (MBI for Medicare data)
 *      KEEPVAR   - variables to keep in output file
 *      FMNAME0   - format name (crosswalk ICD10 to V24 CCs)
 *      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)
 *      EDITMAC0  - external macro name: perform edits to ICD10
 *      SEDITS    - a switch that controls whether to perform MCE edits  
 *                  on ICD10: 1-YES, 0-NO
 *      DATE_ASOF - reference date to calculate age. Set to February 1
 *                  of the payment year for consistency with CMS.
 *      DF_DG     - normalization factor set by CMS, used to multiply 
 *                  dialysis and transplant scores (currently set to 1 
 *                  by default)
 *      DF_POSTG  - normalization factor set by CMS, used to multiply 
 *                  functioning graft scores (currently set to 1 by 
 *                  default)
 *      AGESEXMAC - external macro name: create age/sex,
 *                  originally disabled, disabled vars
 *      LABELMAC  - external macro name: assign labels to HCCs
 *      HIERMAC   - external macro name: set HCC=0 according to
 *                  hierarchies
 *      SCOREMAC  - external macro name: 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; %* hcc 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;
 **********************************************************************;
              %****************************************
               * Macro variables common to all models
               *****************************************;

 %LET N_CC=204;    %*max # of HCCs;

               %****************************************
               * Continuing enrollee dialysis model
               *****************************************;
 %* Age/sex cells used in dialysis CE model and functioning graft 
  institutional model;
 %LET AGESEX=%STR(F0_34  F35_44 F45_54 F55_59 F60_64 F65_69
                  F70_74 F75_79 F80_84 F85_89 F90_94 F95_GT
                  M0_34  M35_44 M45_54 M55_59 M60_64 M65_69
                  M70_74 M75_79 M80_84 M85_89 M90_94 M95_GT);

 %* Dual status interactions with Age and Sex used in dialysis CE model;
 %LET FBPB = %STR(FBDual_Female_Aged
                  FBDual_Female_NonAged
                  FBDual_Male_Aged
                  FBDual_Male_NonAged
                  PBDual_Female_Aged
                  PBDual_Female_NonAged
                  PBDual_Male_Aged
                  PBDual_Male_NonAged
                  ); 

 %* Originally Disabled Interactions with Sex used in dialysis CE
  model and functioning graft community aged models;
 %LET OD = %STR(OriginallyDisabled_Female
                OriginallyDisabled_Male);

 %* Originally ESRD interactions with Sex used 
  in dialysis CE model;
 %LET OE = %STR(Originally_ESRD_Female
                Originally_ESRD_Male);

 %* LTI interactions with Aged used in dialysis CE model;
 %LET LTIA = %STR(LTI_Aged
                  LTI_NonAged);

 %* Disease interactions used in dialysis CE model and 
  functioning graft community models;
 %LET DID = %STR(HCC47_gCancer
                 DIABETES_CHF
                 CHF_gCopdCF
                 HCC85_gRenal_V24
                 gCopdCF_CARD_RESP_FAIL
                 HCC85_HCC96);

 %* Nonaged/Disease interactions used in dialysis CE model;
 %LET DDC = %STR(NONAGED_gSubUseDs_gPsych 
                 NONAGED_HCC6   NONAGED_HCC34
                 NONAGED_HCC46  NONAGED_HCC110
                 NONAGED_HCC176);

 %* diagnostic categories necessary to create interaction variables;
 %LET DIAG_CAT= %STR(CANCER  DIABETES  CHF CARD_RESP_FAIL
                     gCopdCF  RENAL_V24  SEPSIS PRESSURE_ULCER
                     gSubstanceUseDisorder_V24     
                     gPsychiatric_V24
                     gSubUseDs_gPsych_V24);

 %* Variables for Dialysis CE regression;
 %LET MOD_DIAL= %STR(&AGESEX &FBPB &OD &OE &LTIA 
                     &HCCV24_list86 &DID &DDC);


               %****************************************
               * New enrollee dialysis model
               *****************************************;
 %* Variables for Dialysis New Enrollees regression;
 %LET MOD_DIAL_NE = %STR(
 ND_PBD_NORIGDIS_NEF0_34      ND_PBD_NORIGDIS_NEF35_44
 ND_PBD_NORIGDIS_NEF45_54     ND_PBD_NORIGDIS_NEF55_59
 ND_PBD_NORIGDIS_NEF60_64     ND_PBD_NORIGDIS_NEF65_69
 ND_PBD_NORIGDIS_NEF70_74     ND_PBD_NORIGDIS_NEF75_79
 ND_PBD_NORIGDIS_NEF80_84     ND_PBD_NORIGDIS_NEF85_GT

 ND_PBD_NORIGDIS_NEM0_34      ND_PBD_NORIGDIS_NEM35_44
 ND_PBD_NORIGDIS_NEM45_54     ND_PBD_NORIGDIS_NEM55_59
 ND_PBD_NORIGDIS_NEM60_64     ND_PBD_NORIGDIS_NEM65_69
 ND_PBD_NORIGDIS_NEM70_74     ND_PBD_NORIGDIS_NEM75_79
 ND_PBD_NORIGDIS_NEM80_84     ND_PBD_NORIGDIS_NEM85_GT

 FBD_NORIGDIS_NEF0_34         FBD_NORIGDIS_NEF35_44
 FBD_NORIGDIS_NEF45_54        FBD_NORIGDIS_NEF55_59
 FBD_NORIGDIS_NEF60_64        FBD_NORIGDIS_NEF65_69
 FBD_NORIGDIS_NEF70_74        FBD_NORIGDIS_NEF75_79
 FBD_NORIGDIS_NEF80_84        FBD_NORIGDIS_NEF85_GT

 FBD_NORIGDIS_NEM0_34         FBD_NORIGDIS_NEM35_44
 FBD_NORIGDIS_NEM45_54        FBD_NORIGDIS_NEM55_59
 FBD_NORIGDIS_NEM60_64        FBD_NORIGDIS_NEM65_69
 FBD_NORIGDIS_NEM70_74        FBD_NORIGDIS_NEM75_79
 FBD_NORIGDIS_NEM80_84        FBD_NORIGDIS_NEM85_GT

 ND_PBD_ORIGDIS_NEF0_34       ND_PBD_ORIGDIS_NEF35_44
 ND_PBD_ORIGDIS_NEF45_54      ND_PBD_ORIGDIS_NEF55_59
 ND_PBD_ORIGDIS_NEF60_64      ND_PBD_ORIGDIS_NEF65_69
 ND_PBD_ORIGDIS_NEF70_74      ND_PBD_ORIGDIS_NEF75_79
 ND_PBD_ORIGDIS_NEF80_84      ND_PBD_ORIGDIS_NEF85_GT

 ND_PBD_ORIGDIS_NEM0_34       ND_PBD_ORIGDIS_NEM35_44
 ND_PBD_ORIGDIS_NEM45_54      ND_PBD_ORIGDIS_NEM55_59
 ND_PBD_ORIGDIS_NEM60_64      ND_PBD_ORIGDIS_NEM65_69
 ND_PBD_ORIGDIS_NEM70_74      ND_PBD_ORIGDIS_NEM75_79
 ND_PBD_ORIGDIS_NEM80_84      ND_PBD_ORIGDIS_NEM85_GT
                              
 FBD_ORIGDIS_NEF0_34          FBD_ORIGDIS_NEF35_44
 FBD_ORIGDIS_NEF45_54         FBD_ORIGDIS_NEF55_59
 FBD_ORIGDIS_NEF60_64         FBD_ORIGDIS_NEF65_69
 FBD_ORIGDIS_NEF70_74         FBD_ORIGDIS_NEF75_79
 FBD_ORIGDIS_NEF80_84         FBD_ORIGDIS_NEF85_GT

 FBD_ORIGDIS_NEM0_34          FBD_ORIGDIS_NEM35_44
 FBD_ORIGDIS_NEM45_54         FBD_ORIGDIS_NEM55_59
 FBD_ORIGDIS_NEM60_64         FBD_ORIGDIS_NEM65_69
 FBD_ORIGDIS_NEM70_74         FBD_ORIGDIS_NEM75_79
 FBD_ORIGDIS_NEM80_84         FBD_ORIGDIS_NEM85_GT);


               %****************************************
               * Community functioning graft model
               *****************************************;
 %* Age/sex cells used in functioning graft community aged models;
 %LET AGESEX_A=%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);

 %* Age/sex cells used in functioning graft community non-aged models; 
 %LET AGESEX_NA=%STR(F0_34  F35_44 F45_54 F55_59 F60_64
                     M0_34  M35_44 M45_54 M55_59 M60_64);

 %* Variables for Functioning Graft Community Aged regression;
 %LET MOD_GRAFT_COMM_A= %STR(&AGESEX_A &OD &HCCV24_list86 &DID);

 %* Variables for Functioning Graft Community Non-Aged regression;
 %LET MOD_GRAFT_COMM_NA= %STR(&AGESEX_NA &HCCV24_list86 &DID gSubUseDs_gPsych_V24);


               %****************************************
               * Institutional functioning graft model
               *****************************************;
 %* Nonaged/Disease Interactions for institutional functioning graft 
  model;
 %LET DDI = %STR(NONAGED_HCC85       NONAGED_PRESSURE_ULCER_V24
                 NONAGED_HCC161      NONAGED_HCC39
                 NONAGED_HCC77       NONAGED_HCC6);

 %* Disease Interactions for institutional functioning graft model;
 %LET DII = %STR(CHF_gCopdCF                    
                 gCopdCF_CARD_RESP_FAIL         
                 SEPSIS_PRESSURE_ULCER_V24      
                 SEPSIS_ARTIF_OPENINGS          
                 ART_OPENINGS_PRESS_ULCER_V24   
                 DIABETES_CHF                   
                 gCopdCF_ASP_SPEC_B_PNEUM       
                 ASP_SPEC_B_PNEUM_PRES_ULC_V24  
                 SEPSIS_ASP_SPEC_BACT_PNEUM     
                 SCHIZOPHRENIA_gCopdCF          
                 SCHIZOPHRENIA_CHF              
                 SCHIZOPHRENIA_SEIZURES);         

 %* Variables for Functioning Graft Institutional regression;
 %LET MOD_GRAFT_INST= %STR(&AGESEX ORIGDS &HCCV24_list86
                           &DII &DDI);

               %***************************************;
               * New Enrollee Functioning Graft model 
               ****************************************;
 %* Variables for Functioning Graft New Enrollee regression;
 %LET MOD_GRAFT_NE= %STR(
 ND_PBD_NORIGDIS_G_NEF0_34    ND_PBD_NORIGDIS_G_NEF35_44 
 ND_PBD_NORIGDIS_G_NEF45_54   ND_PBD_NORIGDIS_G_NEF55_59 
 ND_PBD_NORIGDIS_G_NEF60_64   ND_PBD_NORIGDIS_G_NEF65    
 ND_PBD_NORIGDIS_G_NEF66      ND_PBD_NORIGDIS_G_NEF67    
 ND_PBD_NORIGDIS_G_NEF68      ND_PBD_NORIGDIS_G_NEF69    
 ND_PBD_NORIGDIS_G_NEF70_74   ND_PBD_NORIGDIS_G_NEF75_79 
 ND_PBD_NORIGDIS_G_NEF80_84   ND_PBD_NORIGDIS_G_NEF85_89 
 ND_PBD_NORIGDIS_G_NEF90_94   ND_PBD_NORIGDIS_G_NEF95_GT
 
 ND_PBD_NORIGDIS_G_NEM0_34    ND_PBD_NORIGDIS_G_NEM35_44 
 ND_PBD_NORIGDIS_G_NEM45_54   ND_PBD_NORIGDIS_G_NEM55_59 
 ND_PBD_NORIGDIS_G_NEM60_64   ND_PBD_NORIGDIS_G_NEM65    
 ND_PBD_NORIGDIS_G_NEM66      ND_PBD_NORIGDIS_G_NEM67    
 ND_PBD_NORIGDIS_G_NEM68      ND_PBD_NORIGDIS_G_NEM69    
 ND_PBD_NORIGDIS_G_NEM70_74   ND_PBD_NORIGDIS_G_NEM75_79 
 ND_PBD_NORIGDIS_G_NEM80_84   ND_PBD_NORIGDIS_G_NEM85_89 
 ND_PBD_NORIGDIS_G_NEM90_94   ND_PBD_NORIGDIS_G_NEM95_GT 

 FBD_NORIGDIS_G_NEF0_34       FBD_NORIGDIS_G_NEF35_44  
 FBD_NORIGDIS_G_NEF45_54      FBD_NORIGDIS_G_NEF55_59  
 FBD_NORIGDIS_G_NEF60_64      FBD_NORIGDIS_G_NEF65     
 FBD_NORIGDIS_G_NEF66         FBD_NORIGDIS_G_NEF67     
 FBD_NORIGDIS_G_NEF68         FBD_NORIGDIS_G_NEF69     
 FBD_NORIGDIS_G_NEF70_74      FBD_NORIGDIS_G_NEF75_79  
 FBD_NORIGDIS_G_NEF80_84      FBD_NORIGDIS_G_NEF85_89  
 FBD_NORIGDIS_G_NEF90_94      FBD_NORIGDIS_G_NEF95_GT 
 
 FBD_NORIGDIS_G_NEM0_34       FBD_NORIGDIS_G_NEM35_44  
 FBD_NORIGDIS_G_NEM45_54      FBD_NORIGDIS_G_NEM55_59  
 FBD_NORIGDIS_G_NEM60_64      FBD_NORIGDIS_G_NEM65     
 FBD_NORIGDIS_G_NEM66         FBD_NORIGDIS_G_NEM67     
 FBD_NORIGDIS_G_NEM68         FBD_NORIGDIS_G_NEM69     
 FBD_NORIGDIS_G_NEM70_74      FBD_NORIGDIS_G_NEM75_79  
 FBD_NORIGDIS_G_NEM80_84      FBD_NORIGDIS_G_NEM85_89  
 FBD_NORIGDIS_G_NEM90_94      FBD_NORIGDIS_G_NEM95_GT 
 
 ND_PBD_ORIGDIS_G_NEF65       ND_PBD_ORIGDIS_G_NEF66     
 ND_PBD_ORIGDIS_G_NEF67       ND_PBD_ORIGDIS_G_NEF68     
 ND_PBD_ORIGDIS_G_NEF69       ND_PBD_ORIGDIS_G_NEF70_74  
 ND_PBD_ORIGDIS_G_NEF75_79    ND_PBD_ORIGDIS_G_NEF80_84  
 ND_PBD_ORIGDIS_G_NEF85_89    ND_PBD_ORIGDIS_G_NEF90_94  
 ND_PBD_ORIGDIS_G_NEF95_GT 
 
 ND_PBD_ORIGDIS_G_NEM65     
 ND_PBD_ORIGDIS_G_NEM66       ND_PBD_ORIGDIS_G_NEM67     
 ND_PBD_ORIGDIS_G_NEM68       ND_PBD_ORIGDIS_G_NEM69     
 ND_PBD_ORIGDIS_G_NEM70_74    ND_PBD_ORIGDIS_G_NEM75_79  
 ND_PBD_ORIGDIS_G_NEM80_84    ND_PBD_ORIGDIS_G_NEM85_89  
 ND_PBD_ORIGDIS_G_NEM90_94    ND_PBD_ORIGDIS_G_NEM95_GT 
 
 FBD_ORIGDIS_G_NEF65          FBD_ORIGDIS_G_NEF66      
 FBD_ORIGDIS_G_NEF67          FBD_ORIGDIS_G_NEF68      
 FBD_ORIGDIS_G_NEF69          FBD_ORIGDIS_G_NEF70_74   
 FBD_ORIGDIS_G_NEF75_79       FBD_ORIGDIS_G_NEF80_84   
 FBD_ORIGDIS_G_NEF85_89       FBD_ORIGDIS_G_NEF90_94   
 FBD_ORIGDIS_G_NEF95_GT    
 
 FBD_ORIGDIS_G_NEM65      
 FBD_ORIGDIS_G_NEM66          FBD_ORIGDIS_G_NEM67      
 FBD_ORIGDIS_G_NEM68          FBD_ORIGDIS_G_NEM69      
 FBD_ORIGDIS_G_NEM70_74       FBD_ORIGDIS_G_NEM75_79   
 FBD_ORIGDIS_G_NEM80_84       FBD_ORIGDIS_G_NEM85_89   
 FBD_ORIGDIS_G_NEM90_94       FBD_ORIGDIS_G_NEM95_GT);   

 %*age/sex variables for Dialysis New Enrollee interactions;
 %LET NE_AGESEXV_DI=%STR(
      NEF0_34    NEF35_44   NEF45_54   NEF55_59   NEF60_64
      NEF65_69   NEF70_74   NEF75_79   NEF80_84   NEF85_GT   
      NEM0_34    NEM35_44   NEM45_54   NEM55_59   NEM60_64
      NEM65_69   NEM70_74   NEM75_79   NEM80_84   NEM85_GT );     
 
 %*age/sex variables for Functioning Graft New Enrollee interactions;
 %LET NE_AGESEXV_FG_OD=%STR(
      NEF65      NEF66      NEF67      NEF68      NEF69
      NEF70_74   NEF75_79   NEF80_84   NEF85_89   NEF90_94   
      NEF95_GT   
      NEM65      NEM66      NEM67      NEM68      NEM69
      NEM70_74   NEM75_79   NEM80_84   NEM85_89   NEM90_94   
      NEM95_GT);

 %LET NE_AGESEXV_FG_NOD=%STR(
      NEF0_34    NEF35_44   NEF45_54   NEF55_59   NEF60_64
      NEF65      NEF66      NEF67      NEF68      NEF69
      NEF70_74   NEF75_79   NEF80_84   NEF85_89   NEF90_94   
      NEF95_GT   
      NEM0_34    NEM35_44   NEM45_54   NEM55_59   NEM60_64
      NEM65      NEM66      NEM67      NEM68      NEM69
      NEM70_74   NEM75_79   NEM80_84   NEM85_89   NEM90_94   
      NEM95_GT);
 
 %*macro to create New Enrollee regression variables;
 %MACRO INTER(PVAR=, RLIST=);
    %LOCAL I;
    %LET I=1;
    %DO %UNTIL(%SCAN(&RLIST,&I)=);
       &PVAR._%SCAN(&RLIST,&I) = &PVAR * %SCAN(&RLIST,&I);
       %LET I=%EVAL(&I+1);
    %END;
 %MEND INTER;

 %**********************************************************************
 * step3: merge person and diagnosis files outputting one record
 *        per person with score and HCC variables for each input person
 *        level record
 **********************************************************************;

 DATA &OUTDATA(KEEP=&KEEPVAR);
    %****************************************************;
    * step3.1: declaration section;
    %****************************************************;

    %IF "&LABELMAC" ne "" %THEN %&LABELMAC;  *HCC labels;

    %*length of some new variables,
     other demographic variables defined in macro &AGESEXMAC;
    LENGTH CC $4. AGEF   
           &AGESEX &DIAG_CAT &FBPB &OD &OE &LTIA &DDC &DID 
           &DDI &DII
           &NE_AGESEXV_DI &NE_AGESEXV_FG_OD &NE_AGESEXV_FG_NOD
           CC1-CC&N_CC
           HCC1-HCC&N_CC        3.;

    %*retain cc vars;
    RETAIN CC1-CC&N_CC 0  AGEF
           ;
    %*arrays;
    ARRAY C(&N_CC)  CC1-CC&N_CC;
    ARRAY HCC(&N_CC) HCC1-HCC&N_CC;
    %*interactions with HCCs;
    ARRAY RV &DIAG_CAT &DID &DDC &DDI &DII;      

    %****************************************************
    * step3.2: bring regression parameters
    ****************************************************;
    IF _N_ = 1 THEN SET INCOEF.HCCCOEFN;

    %****************************************************
    * step3.3: merge
    ****************************************************;
    MERGE &INP(IN=IN1)
          &IND(IN=IN2);
    BY &IDVAR;

    IF IN1 THEN DO;

    %*******************************************************
    * step3.4: for the first record for a person set CC to 0
    ********************************************************;

       IF FIRST.&IDVAR THEN DO;
          %*set ccs to 0;
           DO I=1 TO &N_CC;
            C(I)=0;
           END;
           %* age;
           AGEF =FLOOR((INTCK(
                'MONTH',DOB,&DATE_ASOF)-(DAY(&DATE_ASOF)<DAY(DOB)))/12);
           IF AGEF<0 THEN AGEF=0;
       END;

    %******************************************************
    * step3.5 if there are any diagnoses for a person
    *         then do the following:
    *         - perform diag edits using macro &EDITMAC0 
    *         - create CC using corresponding formats for ICD10
    *         - assign additional CC using provided additional formats
    *******************************************************;
       IF IN1 & IN2 THEN DO;
          %*initialize;
          CC="9999";

          %IF "&EDITMAC0" NE "" %THEN 
               %&EDITMAC0(AGE=AGEF,SEX=SEX,ICD10=DIAG); 
          IF CC NE "-1.0" AND CC NE "9999" THEN DO;
             IND=INPUT(CC,4.);
             IF 1 <= IND <= &N_CC THEN C(IND)=1;
          END;
          ELSE IF CC="9999" THEN DO;
             %IF "&FMNAME0" NE "" %THEN %DO;
             ** assignment 1 **;
             IND = INPUT(LEFT(PUT(DIAG,$IAS1&FMNAME0..)),4.);
             IF 1 <= IND <= &N_CC THEN C(IND)=1;
             ** assignment 2 **;
             IND = INPUT(LEFT(PUT(DIAG,$IAS2&FMNAME0..)),4.);
             IF 1 <= IND <= &N_CC THEN C(IND)=1;
             %END;
          END;
       END; %*CC creation;  


    %**************************************************************
    * step3.6 for the last record for a person do the
    *         following:
    *         - create demographic variables needed (macro &AGESEXMAC)
    *         - create HCC using hierarchies (macro &HIERMAC)
    *         - create HCC interaction variables
    *         - create HCC and NonAged interaction variables
    *         - set HCCs and interaction vars to zero if there
    *           are no diagnoses for a person
    *         - create 29 score variables
    **************************************************************;
       IF LAST.&IDVAR THEN DO;

           %*****************************
           * demographic vars
           *****************************;
           %*create age/sex cells, originally disabled, disabled vars;
           %IF "&AGESEXMAC" ne "" %THEN
           %&AGESEXMAC(AGEF=AGEF, SEX=SEX, OREC=OREC);

           NEF85_GT = (SEX='2' & AGEF >84);
           NEM85_GT = (SEX='1' & AGEF >84);
           NEF65_69 = SUM(NEF65, NEF66, NEF67, NEF68, NEF69);
           NEM65_69 = SUM(NEM65, NEM66, NEM67, NEM68, NEM69);

           %*Dual status interactions;
           FBDual_Female_Aged     = FBDual*(SEX='2')*(AGEF >=65); 
           FBDual_Female_NonAged  = FBDual*(SEX='2')*(AGEF < 65);
           FBDual_Male_Aged       = FBDual*(SEX='1')*(AGEF >=65);
           FBDual_Male_NonAged    = FBDual*(SEX='1')*(AGEF < 65);

           PBDual_Female_Aged     = PBDual*(SEX='2')*(AGEF >=65);
           PBDual_Female_NonAged  = PBDual*(SEX='2')*(AGEF < 65);
           PBDual_Male_Aged       = PBDual*(SEX='1')*(AGEF >=65);
           PBDual_Male_NonAged    = PBDual*(SEX='1')*(AGEF < 65);

           %* originally disabled interactions with age/sex;
           OriginallyDisabled_Female= ORIGDS*(SEX='2');
           OriginallyDisabled_Male  = ORIGDS*(SEX='1');

           %* originally  ESRD or both originally disabled & ESRD;
           Originally_ESRD_Female   = (OREC IN ('2','3'))*(SEX='2')*
                                      (AGEF >=65);
           Originally_ESRD_Male     = (OREC IN ('2','3'))*(SEX='1')*
                                      (AGEF >=65);

           %* LTI interaction with aged; 
           LTI_Aged    = LTI*(AGEF >=65);
           LTI_NonAged = LTI*(AGEF < 65);

           %*****************************
           * variables for New Enrollees
           *****************************;
           %* NE interactions;
           %* Dialysis NE;
           NE_ORIGDS       = (OREC='1');
           ND_PBD_NORIGDIS = (FBDual <=0 and NE_ORIGDS <=0);
           FBD_NORIGDIS    = (FBDual > 0 and NE_ORIGDS <=0);
           ND_PBD_ORIGDIS  = (FBDual <=0 and NE_ORIGDS > 0);
           FBD_ORIGDIS     = (FBDual > 0 and NE_ORIGDS > 0);

           %INTER(PVAR =  ND_PBD_NORIGDIS,  RLIST = &NE_AGESEXV_DI);
           %INTER(PVAR =  FBD_NORIGDIS,     RLIST = &NE_AGESEXV_DI);
           %INTER(PVAR =  ND_PBD_ORIGDIS,   RLIST = &NE_AGESEXV_DI);
           %INTER(PVAR =  FBD_ORIGDIS,      RLIST = &NE_AGESEXV_DI);

           %* Functioning Graft NE;
           NE_ORIGDS_G       = (AGEF>=65)*(OREC='1');
           ND_PBD_NORIGDIS_G = (FBDual <=0 and NE_ORIGDS_G <=0);
           FBD_NORIGDIS_G    = (FBDual > 0 and NE_ORIGDS_G <=0);
           ND_PBD_ORIGDIS_G  = (FBDual <=0 and NE_ORIGDS_G > 0);
           FBD_ORIGDIS_G     = (FBDual > 0 and NE_ORIGDS_G > 0);

           %INTER(PVAR =  ND_PBD_NORIGDIS_G,  RLIST = &NE_AGESEXV_FG_NOD);
           %INTER(PVAR =  FBD_NORIGDIS_G,     RLIST = &NE_AGESEXV_FG_NOD);
           %INTER(PVAR =  ND_PBD_ORIGDIS_G,   RLIST = &NE_AGESEXV_FG_OD);
           %INTER(PVAR =  FBD_ORIGDIS_G,      RLIST = &NE_AGESEXV_FG_OD); 

           IF IN1 & IN2 THEN DO;
             %***************************
             * setting HCCs, hierarchies   
             ***************************;
             CC134=0;
             CC135=0;
             CC136=0;
             CC137=0;
             CC138=0;  /* set all Renal CCs to 0 */

             %IF "&HIERMAC" ne "" %THEN %&HIERMAC;
             %***************************
             * HCC interaction variables
             ***************************;
            %*diagnostic categories;
            CANCER         = MAX(HCC8, HCC9, HCC10, HCC11, HCC12);
            DIABETES       = MAX(HCC17, HCC18, HCC19);
            CARD_RESP_FAIL = MAX(HCC82, HCC83, HCC84);
            CHF            = HCC85;
            gCopdCF        = MAX(HCC110, HCC111, HCC112);
            RENAL_V24      = MAX(HCC134, HCC135, HCC136, HCC137, HCC138);
            SEPSIS         = HCC2;
            gSubstanceUseDisorder_V24= MAX(HCC54, HCC55, HCC56);
            gPsychiatric_V24   = MAX(HCC57, HCC58, HCC59, HCC60);

            %*community models interactions ;
            HCC47_gCancer                = HCC47*Cancer;
            DIABETES_CHF                 = DIABETES*CHF;
            CHF_gCopdCF                  = CHF*gCopdCF;
            HCC85_gRenal_V24             = HCC85*Renal_V24;
            gCopdCF_CARD_RESP_FAIL       = gCopdCF*CARD_RESP_FAIL;
            HCC85_HCC96                  = HCC85*HCC96;
            gSubUseDs_gPsych_V24         = gSubstanceUseDisorder_V24*gPsychiatric_V24; 

            NONAGED_gSubUseDs_gPsych     = (AGEF < 65)*(gSubUseDs_gPsych_V24);   
            NONAGED_HCC6                 = (AGEF < 65)*(HCC6);   
            NONAGED_HCC34                = (AGEF < 65)*(HCC34);   
            NONAGED_HCC46                = (AGEF < 65)*(HCC46);   
            NONAGED_HCC110               = (AGEF < 65)*(HCC110);   
            NONAGED_HCC176               = (AGEF < 65)*(HCC176);   
              
            %*institutional model;
            PRESSURE_ULCER = MAX(HCC157, HCC158, HCC159); /*11/20/2018*/;
            SEPSIS_PRESSURE_ULCER_V24     = SEPSIS*PRESSURE_ULCER;
            SEPSIS_ARTIF_OPENINGS         = SEPSIS*(HCC188);
            ART_OPENINGS_PRESS_ULCER_V24  = (HCC188)*PRESSURE_ULCER;
            gCopdCF_ASP_SPEC_B_PNEUM      = gCopdCF*(HCC114);
            ASP_SPEC_B_PNEUM_PRES_ULC_V24 = (HCC114)*PRESSURE_ULCER;
            SEPSIS_ASP_SPEC_BACT_PNEUM    = SEPSIS*(HCC114);
            SCHIZOPHRENIA_gCopdCF         = (HCC57)*gCopdCF;
            SCHIZOPHRENIA_CHF             = (HCC57)*CHF;
            SCHIZOPHRENIA_SEIZURES        = (HCC57)*(HCC79);

            NONAGED_HCC85              = (AGEF < 65)*(HCC85);
            NONAGED_PRESSURE_ULCER_V24 = (AGEF < 65)*PRESSURE_ULCER;
            NONAGED_HCC161             = (AGEF < 65)*(HCC161);
            NONAGED_HCC39              = (AGEF < 65)*(HCC39);
            NONAGED_HCC77              = (AGEF < 65)*(HCC77);

           END; %*there are some diagnoses for a person;
           ELSE DO;
              DO I=1 TO &N_CC;
                 HCC(I)=0;
              END;
              DO OVER RV;
                 RV=0;
              END;
           END;

           %*to be able to keep normalization factors DF_DG and DF_POSTG in the output file;
           DF_DG = &DF_DG; 
           DF_POSTG = &DF_POSTG;
           LABEL
           DF_DG = "Normalization factor set by CMS, used to multiply dialysis and transplant scores"
           DF_POSTG = "Normalization factor set by CMS, used to multiply functioning graft scores";
          
           %*score calculation;
                                 
           /*********************************/
           /*    dialysis model             */
           /*********************************/;

          %IF "&SCOREMAC" ne "" %THEN %DO;
          %&SCOREMAC(PVAR=SCORE_DIAL, RLIST=&MOD_DIAL, CPREF=DI_);
           %*normalization;
           SCORE_DIAL=&DF_DG*SCORE_DIAL;

           /**********************************/
           /*  dialysis new enrollees model  */
           /**********************************/;

          %&SCOREMAC(PVAR=SCORE_DIAL_NE, RLIST=&MOD_DIAL_NE, CPREF=DNE_);
           %*normalization;
           SCORE_DIAL_NE=&DF_DG*SCORE_DIAL_NE;


           /**********************************/
           /*   transplant scores            */
           /**********************************/;

           SCORE_TRANS_KIDNEY_ONLY_1M = &DF_DG*TRANSPLANT_KIDNEY_ONLY_1M;
           SCORE_TRANS_KIDNEY_ONLY_2M = &DF_DG*TRANSPLANT_KIDNEY_ONLY_2M;
           SCORE_TRANS_KIDNEY_ONLY_3M = &DF_DG*TRANSPLANT_KIDNEY_ONLY_3M;
          

           /****************************************/
           /* community functioning graft non-dual */
           /* and partial benefit dual aged model  */
           /****************************************/;

          %&SCOREMAC(PVAR=_SCORE_G_COMM_ND_PBD_GE65, RLIST=&MOD_GRAFT_COMM_A,
                         CPREF=GNPA_);
          
          %*transplant bumps;

           SCORE_G_COMM_ND_PBD_GE65_DUR4_9 =&DF_POSTG*(_SCORE_G_COMM_ND_PBD_GE65 +
                 FGC_GE65_DUR4_9_ND_PBD*(AGEF >= 65) + 
                 FGC_PBD_GE65_flag*PBDual*(AGEF >= 65));
          
           SCORE_G_COMM_ND_PBD_GE65_DUR10PL =&DF_POSTG*(_SCORE_G_COMM_ND_PBD_GE65 +
                 FGC_GE65_DUR10PL_ND_PBD*(AGEF >= 65) + 
                 FGC_PBD_GE65_flag*PBDual*(AGEF >= 65));


           /*******************************************/
           /* community functioning graft non-dual    */
           /* and partial benefit dual non-aged model */
           /*******************************************/;

         %&SCOREMAC(PVAR=_SCORE_G_COMM_ND_PBD_LT65, RLIST=&MOD_GRAFT_COMM_NA,
                         CPREF=GNPN_);

          %*transplant bumps;

          SCORE_G_COMM_ND_PBD_LT65_DUR4_9 =&DF_POSTG*(_SCORE_G_COMM_ND_PBD_LT65 +
                FGC_LT65_DUR4_9_ND_PBD*(AGEF < 65) + 
                FGC_PBD_LT65_flag*PBDual*(AGEF < 65));
          
          SCORE_G_COMM_ND_PBD_LT65_DUR10PL =&DF_POSTG*(_SCORE_G_COMM_ND_PBD_LT65 +
                FGC_LT65_DUR10PL_ND_PBD*(AGEF < 65) + 
                FGC_PBD_LT65_flag*PBDual*(AGEF < 65));


           /*******************************************/
           /* community functioning graft             */
           /* full benefit dual aged model            */
           /*******************************************/;

         %&SCOREMAC(PVAR=_SCORE_G_COMM_FBD_GE65, RLIST=&MOD_GRAFT_COMM_A,
                         CPREF=GFA_);

          %*transplant bumps;

          SCORE_G_COMM_FBD_GE65_DUR4_9 =&DF_POSTG*(_SCORE_G_COMM_FBD_GE65 +
                FGC_GE65_DUR4_9_FBD*(AGEF >= 65));
          
          SCORE_G_COMM_FBD_GE65_DUR10PL =&DF_POSTG*(_SCORE_G_COMM_FBD_GE65 +
                FGC_GE65_DUR10PL_FBD*(AGEF >= 65));

           /*******************************************/
           /* community functioning graft             */
           /* full benefit dual non-aged model        */
           /*******************************************/;

         %&SCOREMAC(PVAR=_SCORE_G_COMM_FBD_LT65, RLIST=&MOD_GRAFT_COMM_NA,
                         CPREF=GFN_);

          %*transplant bumps;

          SCORE_G_COMM_FBD_LT65_DUR4_9 =&DF_POSTG*(_SCORE_G_COMM_FBD_LT65 +
                FGC_LT65_DUR4_9_FBD*(AGEF < 65));
          
          SCORE_G_COMM_FBD_LT65_DUR10PL =&DF_POSTG*(_SCORE_G_COMM_FBD_LT65 +
                FGC_LT65_DUR10PL_FBD*(AGEF < 65));

           /*****************************************/
           /* institutional functioning graft model */
           /*****************************************/;

         %&SCOREMAC(PVAR=_SCORE_GRAFT_INST, RLIST=&MOD_GRAFT_INST,
                         CPREF=GI_);

          %*transplant bumps;

          SCORE_G_INST_ND_PBD_GE65_DUR4_9 = &DF_POSTG*(_SCORE_GRAFT_INST +
                FGI_GE65_DUR4_9_ND_PBD*(AGEF>=65) + 
                FGI_PBD_GE65_flag*PBDual*(AGEF>=65) +
                LTI_GE65*LTI*(AGEF>=65));

          SCORE_G_INST_ND_PBD_GE65_DUR10PL = &DF_POSTG*(_SCORE_GRAFT_INST +
                FGI_GE65_DUR10PL_ND_PBD*(AGEF>=65) + 
                FGI_PBD_GE65_flag*PBDual*(AGEF>=65) +
                LTI_GE65*LTI*(AGEF>=65));

          SCORE_G_INST_ND_PBD_LT65_DUR4_9 = &DF_POSTG*(_SCORE_GRAFT_INST +
                FGI_LT65_DUR4_9_ND_PBD*(AGEF<65) + 
                FGI_PBD_LT65_flag*PBDual*(AGEF<65) +
                LTI_LT65*LTI*(AGEF<65));

          SCORE_G_INST_ND_PBD_LT65_DUR10PL = &DF_POSTG*(_SCORE_GRAFT_INST +
                FGI_LT65_DUR10PL_ND_PBD*(AGEF<65) + 
                FGI_PBD_LT65_flag*PBDual*(AGEF<65) +
                LTI_LT65*LTI*(AGEF<65));

          SCORE_G_INST_FBD_GE65_DUR4_9 = &DF_POSTG*(_SCORE_GRAFT_INST +
                FGI_GE65_DUR4_9_FBD*(AGEF>=65) + 
                LTI_GE65*LTI*(AGEF>=65));

          SCORE_G_INST_FBD_GE65_DUR10PL = &DF_POSTG*(_SCORE_GRAFT_INST +
                FGI_GE65_DUR10PL_FBD*(AGEF>=65) + 
                LTI_GE65*LTI*(AGEF>=65));

          SCORE_G_INST_FBD_LT65_DUR4_9 = &DF_POSTG*(_SCORE_GRAFT_INST +
                FGI_LT65_DUR4_9_FBD*(AGEF<65) + 
                LTI_LT65*LTI*(AGEF<65));

          SCORE_G_INST_FBD_LT65_DUR10PL = &DF_POSTG*(_SCORE_GRAFT_INST +
                FGI_LT65_DUR10PL_FBD*(AGEF<65) + 
                LTI_LT65*LTI*(AGEF<65));


           /*****************************************/
           /* new enrollees functioning graft model */
           /*****************************************/;

          %&SCOREMAC(PVAR=_SCORE_GRAFT_NE, RLIST=&MOD_GRAFT_NE,
                         CPREF=GNE_);

          %*transplant bumps;

           SCORE_G_NE_ND_PBD_GE65_DUR4_9  = round((
                 &DF_POSTG*(_SCORE_GRAFT_NE +
                 FGC_GE65_DUR4_9_ND_PBD*(6<= NE_AGESEX <=16 or 22<= NE_AGESEX <=32)*(FBDual<=0))/ActAdj_DUR4_9),.001);

           SCORE_G_NE_ND_PBD_GE65_DUR10PL = round((
                 &DF_POSTG*(_SCORE_GRAFT_NE +
                 FGC_GE65_DUR10PL_ND_PBD*(6<= NE_AGESEX <=16 or 22<= NE_AGESEX <=32)*(FBDual<=0))/ActAdj_DUR10PL),.001);

           SCORE_G_NE_ND_PBD_LT65_DUR4_9  = round((
                 &DF_POSTG*(_SCORE_GRAFT_NE +
                 FGC_LT65_DUR4_9_ND_PBD*(1<= NE_AGESEX <=5 or 17<= NE_AGESEX <=21)*(FBDual<=0))/ActAdj_DUR4_9),.001);

           SCORE_G_NE_ND_PBD_LT65_DUR10PL = round((
                 &DF_POSTG*(_SCORE_GRAFT_NE +
                 FGC_LT65_DUR10PL_ND_PBD*(1<= NE_AGESEX <=5 or 17<= NE_AGESEX <=21)*(FBDual<=0))/ActAdj_DUR10PL),.001);
           
           SCORE_G_NE_FBD_GE65_DUR4_9  = round((
                 &DF_POSTG*(_SCORE_GRAFT_NE +
                 FGC_GE65_DUR4_9_FBD*(6<= NE_AGESEX <=16 or 22<= NE_AGESEX <=32)*(FBDual>0))/ActAdj_DUR4_9),.001);

           SCORE_G_NE_FBD_GE65_DUR10PL = round((
                 &DF_POSTG*(_SCORE_GRAFT_NE +
                 FGC_GE65_DUR10PL_FBD*(6<= NE_AGESEX <=16 or 22<= NE_AGESEX <=32)*(FBDual>0))/ActAdj_DUR10PL),.001);

           SCORE_G_NE_FBD_LT65_DUR4_9  = round((
                 &DF_POSTG*(_SCORE_GRAFT_NE +
                 FGC_LT65_DUR4_9_FBD*(1<= NE_AGESEX <=5 or 17<= NE_AGESEX <=21)*(FBDual>0))/ActAdj_DUR4_9),.001);

           SCORE_G_NE_FBD_LT65_DUR10PL = round((
                 &DF_POSTG*(_SCORE_GRAFT_NE +
                 FGC_LT65_DUR10PL_FBD*(1<= NE_AGESEX <=5 or 17<= NE_AGESEX <=21)*(FBDual>0))/ActAdj_DUR10PL),.001);

          %END;
          OUTPUT &OUTDATA;
       END; %*last record for a person;
     END; %*there is a person record;
 RUN;

 %**********************************************************************
 * step4: data checks and proc contents
 ***********************************************************************;
 PROC PRINT U DATA=&OUTDATA(OBS=46);
     TITLE "*** file output by ESRD software ***";
 RUN ;
 PROC CONTENTS DATA=&OUTDATA;
 RUN;

 %MEND E2423T1M;
