**************************************************************************************************** * PROGRAM OVERVIEW **************************************************************************************************** * * PROGRAM: ms_createpov1t4.sas * * Created (mm/dd/yyyy): 02/09/2017 * Last modified: 10/03/2017 * Version: 1.1 * *-------------------------------------------------------------------------------------------------- * PURPOSE: * This program will find all potential index dates and create the POV1 dataset for TYPE4 analysis * (deliveries in pregnancy studies) * * Program inputs: * -Dataset with claims defined as being potential index dates * * Program outputs: * -Dataset with all potential index dates (POV1) * * PARAMETERS: * -CohortId = Identifier for the cohort being processed (primary, secondary) * * Programming Notes: * * * *-------------------------------------------------------------------------------------------------- * CONTACT INFO: * Mini-Sentinel Coordinating Center * info@mini-sentinel.org * *-------------------------------------------------------------------------------------------------- * CHANGE LOG: * * Version Date Initials Comment (reference external documentation when available) * ------- -------- -------- --------------------------------------------------------------- * 1.1 10/03/17 AP Changed PreTerm/PostTerm to PriorityGroup1 and PriorityGroup2 * ***************************************************************************************************; %macro ms_createpov1t4(CohortId=); %put =====> MACRO CALLED: ms_createpov1t4 v1.0; %if %str("&CohortId.")=%str("") %then %do; *Because _POV1 index dates actually contain delivery dates, they must be calculated to contain pregnancy start dates and this must be done before _POV2 and _POV3 calculation; *Create all pregnancy episodes, incident or not (for exclusion in control group); proc sort nodupkey data=_GroupIndex out=_GroupEpis; by PatId ADate; run; %ms_createclaimepi(infile=_GroupEpis, gaptype = 'F', gap=EpisodeGap, outfile=_GroupEpis); *Get Pre/Post term codes and calculate pregnancy durations and start dates; proc sql noprint undo_policy=none; create table _GroupEpis as select epis.*, pregstart.PriorityGroup1, pregstart.PriorityGroup2, pregstart.Priority, pregstart.Duration, pregstart.Code, pregstart.ADate as PSAdate from _GroupEpis as epis left join _GroupPreg as pregstart on epis.PatId = pregstart.PatId; quit; data _GroupEpis; set _GroupEpis; *Make sure pre/post term codes are close enough from delivery codes; if abs(ADate - PSADate) >episodegap then call missing(Code,PriorityGroup1,PriorityGroup2,Priority,Duration,PSADate); if PriorityGroup1 = 1 then PrePostPriority = 1; else if PriorityGroup2 = 1 then PrePostPriority = 2; else PrePostPriority = 3; run; proc sort data = _GroupEpis; by PatID Episode ADate PrePostPriority Priority; run; data _GroupEpis; set _GroupEpis; length EpisodeStartDt EpisodeEndDt 4.; format EpisodeStartDt EpisodeEndDt mmddyy10.; by PatId Episode; EpisodeEndDt=Adate; if Duration ne . then do; EpisodeStartDt = EpisodeEndDt - Duration; end; else do; EpisodeStartDt = EpisodeEndDt - &ittdays.; end; run; data _EpisDates; set _GroupEpis; by PatId Episode; if first.episode; keep PatId ADate; run; data _PrePostCodes; merge _GroupEpis _EpisDates (in=b); by PatId ADate; if b; run; *Check if women had PregDur codes; proc means data=_PrePostCodes nway noprint; var PriorityGroup1 PriorityGroup2; class PatId Episode; output out=_PrePostCodes(drop=_:) max(PriorityGroup1 PriorityGroup2)=HadPriority1 HadPriority2; run; data _PrePostCodes; set _PrePostCodes; HadNone=0; if HadPriority1 ne 1 and HadPriority2 ne 1 then HadNone=1; if HadNone=1 then do; HadPriority1=0; HadPriority2=0; end; *If both PriorityGroup1 and PriorityGroup2 codes were found, do not consider PriorityGroup2; if HadPriority1 eq 1 and HadPriority2 eq 1 then HadPriority2=0; run; data _GroupEpis _GroupStartCodes; merge _GroupEpis(in=a) _PrePostCodes; by PatId Episode; if a; *Identify pregnancies that really have 3 trimesters; Duration=EpisodeEndDt - EpisodeStartDt; Has3Trim=0; if Duration>=181 then Has3Trim=1; if first.Episode then output _GroupEpis; *Unique pre/post start code for episode uniqueness; output _GroupStartCodes; *All pre/post start codes for statistics; run; proc sort data=_GroupStartCodes; by PatId Adate; run; data _GroupStartCodes; set _GroupStartCodes; format IndexDt mmddyy10.; by PatId Adate; if first.ADate then TempDt=EpisodeStartDt; IndexDt = TempDt; retain TempDt; drop TempDt; run; proc sort nodupkey data=_GroupStartCodes; by PatId IndexDt Code; run; proc sort data =_GroupEpis; by PatID ADate; run; data _POV1&CohortId.(rename=EpisodeStartDt2=ADate); merge _POV1&CohortId.(in=a) _GroupEpis(keep=PatId ADate EpisodeStartDt EpisodeEndDt); by PatID ADate; format EpisodeStartDt2 mmddyy10.; if a; ExpireDt=EpisodeStartDt; EpisodeStartDt2=EpisodeStartDt; drop ADate; run; proc sort data=_pov1&CohortId.; by PatId ADate; run; %end; %put NOTE: ********END OF MACRO: ms_createpov1t4 v1.0********; %mend ms_createpov1t4;