I am working on a case-crossover study which consists of cases and controls, where the cases act as their own controls but at different times than when the outcome occurred. I have a dataset consisting of only cases and need to generate multiple controls for each case. The controls need to be on the same day of the week, within the same month and year as the case. For example, if I had a case occurring on 1/01/2005 I would need to generate a control for 1/08/2005, 1/15/2005, 1/22/2005, and 1/29/2005. This case happened on a Saturday so all the controls would be on every other Saturday of January. Sometimes, there will be only three controls, i.e. the case happened on 1/18/2005 so I would need controls for 1/04/2005, 1/11/2005, and 1/25/2005. I have cases ranging from 1/01/2005 to 12/31/2010. This process would need to be repeated for all dates between that range.
I have attached a subset of observations in a tab-delimited text file. Thank you so much for your help!
See if this is close to what you are asking for. Not too elegant, but it at least satisfies the two cases that you mention.
Data have;
input case casedate :mmddyy10.;
datalines;
1 01/01/2005
2 01/18/2005
run;
* Want for a given case:
* control dates for all the same DOW in the same month;
data want;
set have;
* Control dates can be up to 4 weeks prior and 4 weeks after the casedate;
do i = -4 to 4;
controldate = intnx('week',casedate,i,'s');
if month(casedate)=month(controldate) and
controldate ne casedate then output want;
end;
format casedate controldate date9.;
run;
proc print data=want;
run;
For a given CASEDATE the INTNX function will 'advance' the date some number of weeks into the future (or past). The 'Same' alignment option keeps the same day of week.
Result:
Obs case casedate i controldate 1 1 01JAN2005 1 08JAN2005 2 1 01JAN2005 2 15JAN2005 3 1 01JAN2005 3 22JAN2005 4 1 01JAN2005 4 29JAN2005 5 2 18JAN2005 -2 04JAN2005 6 2 18JAN2005 -1 11JAN2005 7 2 18JAN2005 1 25JAN2005
See if this is close to what you are asking for. Not too elegant, but it at least satisfies the two cases that you mention.
Data have;
input case casedate :mmddyy10.;
datalines;
1 01/01/2005
2 01/18/2005
run;
* Want for a given case:
* control dates for all the same DOW in the same month;
data want;
set have;
* Control dates can be up to 4 weeks prior and 4 weeks after the casedate;
do i = -4 to 4;
controldate = intnx('week',casedate,i,'s');
if month(casedate)=month(controldate) and
controldate ne casedate then output want;
end;
format casedate controldate date9.;
run;
proc print data=want;
run;
For a given CASEDATE the INTNX function will 'advance' the date some number of weeks into the future (or past). The 'Same' alignment option keeps the same day of week.
Result:
Obs case casedate i controldate 1 1 01JAN2005 1 08JAN2005 2 1 01JAN2005 2 15JAN2005 3 1 01JAN2005 3 22JAN2005 4 1 01JAN2005 4 29JAN2005 5 2 18JAN2005 -2 04JAN2005 6 2 18JAN2005 -1 11JAN2005 7 2 18JAN2005 1 25JAN2005
Thank you very much for your help! I'm sorry the file did not upload correctly but I was able to modify your code to fit the data!
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.