/***********************************************************************/ /* lastdate - itt, at */ /* ITT - death date, end of enrollment, end of data */ /* AT - death, end of enrollment, end of data, exposure end/switch */ /* 021.lastdate */ /***********************************************************************/ data ids(rename=(class = index_class)); set out.dm_cohort(rename=(enr_end = enddt)); end_data = '31Dec2019'd; lastdate = min( deathdt, enddt,end_data); dur = lastdate - indexdt; keep patid indexdt class lastdate; run; %macro temp; %do year = 2012 %to 2019; data rx&year; set in.dispensing&year(keep = patid generic Dispense_Date DISPENSE_SUP); generic = left(lowcase(generic)); if substr(generic,1, 11 ) = 'sitagliptin' or substr(generic,1, 11 ) = 'saxagliptin' or substr(generic,1, 11 ) = 'linagliptin' or substr(generic,1, 10 ) = 'alogliptin' then class = 'DPP4 '; if substr(generic,1, 13 ) = 'empagliflozin' or substr(generic,1, 13 ) = 'canagliflozin' or substr(generic,1, 13 ) = 'dapagliflozin' or substr(generic,1, 13 ) = 'ertugliflozin' then class ='SGLT2'; if class ^= ' '; keep patid Dispense_Date generic class DISPENSE_SUP; run; %end; data dm_meds; set %do year = 2012 %to 2019; rx&year %end; ; run; %mend; %temp; proc sort nodup; by patid dispense_date generic; run; data meds_after; merge dm_meds(in = in1 rename=(dispense_date = rxdate DISPENSE_SUP =rxsup)) ids(in = in2); by patid; if in1 and in2; if indexdt <= rxdate <= lastdate; keep patid indexdt rxdate class lastdate index_class rxsup; run; data index_meds other_meds; set meds_after; if class = index_class then output index_meds; else output other_meds; run; proc sort nodup data = index_meds; by patid indexdt rxdate rxsup; run; data array_index; set index_meds; by patid indexdt; retain a1-a2810 ; array days{2810} a1-a2810; if first.indexdt then do i = 1 to 2810; days(i) = 0; end; lastday = lastdate - indexdt + 1; start = rxdate - indexdt + 1; end = start + (rxsup + 30); do j = start to end until (j = lastday); days(j) = 1; end; if last.indexdt then output; keep patid indexdt a1-a2810 lastday; run; data exposure_end; set array_index; array drugs{2810} a1-a2810; do i = 1 to 2810; if drugs(i) = 0 or i = lastday then do; output; i = 6000; end; end; keep patid indexdt i; run; proc sort data = exposure_end; by patid indexdt i; run; proc sort nodupkey data = exposure_end; by patid indexdt; run; data index_exposure_end; set exposure_end; if i ^= . then index_exposure_end = indexdt + i - 1; keep patid indexdt index_exposure_end ; run; data exposure_switch(rename=(rxdate = switch_date)); merge other_meds(in = in1 keep = patid indexdt rxdate) index_exposure_end(in = in2); by patid; if in1 and in2; if indexdt <= rxdate <= index_exposure_end; keep patid indexdt rxdate; run; proc sort data = exposure_switch; by patid indexdt switch_date; run; proc sort nodupkey data = exposure_switch; by patid indexdt; run; data out.lastdate(rename=(index_class = class)); merge ids(in = in1 keep = patid indexdt index_class lastdate) index_exposure_end(keep= patid index_exposure_end) exposure_switch(keep= patid switch_date); by patid; if in1; lastdate = min(lastdate, index_exposure_end, switch_date); keep patid indexdt index_class lastdate; run;