I'm trying to understand what this macro does from code that someone gave me. The code is trying to create episodes of care from health claims data but I've never seen a macro set up like this. The send.REFdate table is a crosswalk table for defining quarters, months, days, calendar yr vs fiscal year etc.
/*Macro 1 of 2: identify distinct episodes based on consecutive days (from day-level claim data)*/
%macro episode (dat_episode, dat_day, dat_in, var_dt, min_episode_dt, max_episode_dt);
/*to day level*/
proc sql;create table &dat_day as
select distinct MemberID, ClaimNumber, ClaimID, TypeOfService, TypeOfClaim,Practice_Name,Medical_Group_Affiliation, DATE as &var_dt
from send.REFDate a left outer join &dat_in b
on date between AdmitDt and DischargeDate
where memberid is not null and AdmitDt is not null and DischargeDate is not null
and DischargeDate>=AdmitDt
union
select distinct MemberID, ClaimNumber, ClaimID, TypeOfService, TypeOfClaim,Practice_Name,Medical_Group_Affiliation, DATE as &var_dt
from send.REFDate a left outer join &dat_in b
on date between ServiceFromDate and ServiceToDate
where memberid is not null and ServiceFromDate is not null and ServiceToDate is not null
and ServiceToDate>=ServiceFromDate;
quit;
/*identify episodes' min and max dates based on consecutive days*/
/*min_dt*/
data episode_min;
set &dat_day;
sas_dt = input(&var_dt, yymmdd10.);
lag_sas_dt = lag(sas_dt);
by MemberID;
Retain lag_min_episode_dt;
IF first.MemberID
THEN do;
&min_episode_dt = &var_dt;
lag_sas_dt = .;
lag_min_episode_dt = &var_dt;
END;
IF first.MemberID = 0
THEN do;
If lag_sas_dt ne .
AND lag_sas_dt ne sas_dt
AND (lag_sas_dt + 1) ne sas_dt
Then do;
&min_episode_dt = &var_dt;
lag_min_episode_dt = &var_dt;
End;
Else
&min_episode_dt = lag_min_episode_dt;
END;
drop lag_min_episode_dt;/*the var only used to supply episode start dt to days that aren't 1st day of any episode*/
run;
/*max_dt*/
Proc sql;create table episode_max as
select MemberID,
&min_episode_dt,
max(&var_dt) as &max_episode_dt,
min(typeofservice)as groupid
from episode_min
group by MemberID, &min_episode_dt;quit;
/*put together min and max dates*/
proc sql;create table &dat_episode as
select a.MemberID,
a.&min_episode_dt,
ClaimNumber,
ClaimID,
Practice_Name,
Medical_Group_Affiliation,
&var_dt,
&max_episode_dt,
TypeOfClaim,
b.groupid
from episode_min a
left join episode_max b
on a.MemberID=b.MemberID
and a.&min_episode_dt=b.&min_episode_dt
order by MemberID, &min_episode_dt, &max_episode_dt, ClaimNumber, ClaimID, &var_dt;
quit;
proc sort data=&dat_episode;
by MemberID &min_episode_dt &max_episode_dt Medical_Group_Affiliation &var_dt ClaimNumber ClaimID;
run;
%mend episode;