Understanding what this SAS macro does

Viewed 20

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;
0 Answers
Related