Technical note: Comparison between three methods for evaluating Clinical Mastitis frequency in dairy cows: cow-level risk, cow level-rate and quarter-level rate SAS v. 9.4 (SAS Institute Inc., Cary, NC, USA). Presentation of Code **The %macro statement tells SAS that this is the beginning of the macro**; %macro risk(year=, beginmonth=, endmonth=); %do month = &beginmonth %to &endmonth; **Creating new variable**; title "data &month &year"; data nrate_&month._&year; set work.nrate1; if month NE &month then delete; if year NE &year then delete; if dim_mast >=0 then status_mastitis=1; else if dim_mast='.' then status_mastitis=0; run; **Change date format**; data nrate_&month._&year; set nrate_&month._&year; date1=input(date_mast,mmddyy10.); format date1 date9.; drop date_mast; **Selecting beginning and end date for each month**; if month = 5 and year=2016 then date_mast_begin = mdy(&month,16,&year); else date_mast_begin = mdy(&month,1,&year); if month =2 then date_mast_end = mdy(&month,28,&year); else if month in (4,6,9,11)then date_mast_end = mdy(&month,30,&year); else if month in (1,3,5,7,8,10,12) then date_mast_end = mdy(&month,31,&year); rename date1 = date_mast; run; **Creating table 1 (from Figure 1)**; proc sql; create table rate_mast1 as select id, date_mast , max_date_dry_or_cull, month, year from nrate_&month._&year where (date_mast BETWEEN date_mast_begin AND date_mast_end); quit; **Creating table 2 (from Figure 2)**; data plusdays (keep = id date_mast max_date_dry_or_cull); set rate_mast1; ft_days= intnx('day', date_mast,14); run; proc print data=plusdays; format date_mast max_date_dry_or_cull date10.; run; proc sql; create table days_at_risk1 as select id, min(date_mast) as CM_date, max(max_date_dry_or_cull) as Exit_date, max(max_date_dry_or_cull) - min(date_mast) as Length_of_stay from plusdays group by id; quit; proc print data=days_at_risk1; format CM_date Exit_date date10.; run; title "Quarters affected in &month &year"; proc sql; create table have as select id, date_mast, MQ_1,MQ_2,MQ_3,MQ_4, pathog_1MQ, pathog_2MQ, pathog_3MQ, pathog_4MQ from nrate_&month._&year ; quit; data need1; set have; quarters_affected = sum((TRIM(LEFT(mq_1)) ne '.'),(TRIM(LEFT(mq_2)) ne '.'),(TRIM(LEFT(mq_3)) ne '.'),(TRIM(LEFT(mq_4)) ne '.')); run; proc print data=need1; run; **Creating table 3 (from Figure 2); Frequency quarters**; proc freq data=need1; tables quarters_affected; run; data nrate_&month._&year._dar; set rate_mast1; date1 = date_mast; if month in (4) then date2 = mdy(&month,30,&year); else if month in (1,3,5)then date2 = mdy(&month,31,&year); else if month = 2 then date2 = mdy(&month,28,&year); no_of_days = intck ('days', date1, date2); format date1 date2 date10.; run; proc print data = nrate_&month._&year._dar; run; proc print data=rate_mast1; run; proc freq data=nrate_&month._&year._dar; tables no_of_days; run; proc freq data=days_at_risk1; tables length_of_stay; run; *Same code BUT healthy cows*; data nrate_&month._&year._healthycows; set nrate_&month._&year; if status_mastitis=1 then delete; run; **Creating table 4 (From Figure 1)**; proc sql; create table days_at_risk_healthy as select id, min(calv_date) as Calving_date, max(max_date_dry_or_cull) as Exit_date, max(max_date_dry_or_cull) - min(calv_date) as Length_of_stay from nrate_&month._&year._healthycows group by id; quit; proc print data=days_at_risk_healthy; format Calving_date Exit_date date10.; run; **The %mend statement signals the end of the macro**; %end; %mend risk; %risk(year=2016, beginmonth=5, endmonth=12); %risk(year=2017, beginmonth=1, endmonth=5);