在双边案例交叉设计中创建控制日期

时间:2012-09-10 11:23:08

标签: r sas stata

我打算研究空气污染对急诊室就诊的影响,我打算采用双侧病例交叉设计。对于每个病例(医院就诊),我想创建4个控制日期(访问前后7天和14天)。例如,如果一个人在2012年9月10日访问诊所,我的控件将是8月27日,9月3日,9月17日和9月24日。以下示例说明了我拥有的和我想要实现的目标。

任何关于如何在SAS,Stata或R中进行此操作的想法都将受到高度赞赏

示例数据(均为访问日期)

id  date  
-------------
1   04-jan-05
2   05-jan-05
3   05-jan-05
4   06-jan-05
5   06-feb-05

我想要实现的目标(每个id有一个案例和4个控件)

id  date        outcome
---------------------------
1   21-Dec-04   control
1   28-Dec-04   control
1   04-Jan-05   case
1   11-Jan-05   control
1   18-Jan-05   control
2   22-Dec-04   control
2   29-Dec-04   control
2   05-Jan-05   case
2   12-Jan-05   control
2   19-Jan-05   control
3   22-Dec-04   control
3   29-Dec-04   control
3   05-Jan-05   case
3   12-Jan-05   control
3   19-Jan-05   control
4   23-Dec-04   control
4   30-Dec-04   control
4   06-Jan-05   case
4   13-Jan-05   control
4   20-Jan-05   control
5   23-Jan-05   control
5   30-Jan-05   control
5   06-Feb-05   case
5   13-Feb-05   control
5   20-Feb-05   control

3 个答案:

答案 0 :(得分:3)

一个简单的循环将产生你想要的输出。

data have;
input id  date :date10.;
format date date9.;
datalines;
1   04-jan-05
2   05-jan-05
3   05-jan-05
4   06-jan-05
5   06-feb-05
;
run;

data want (drop=i date rename=(date1=date));
set have;
format date1 date9.;
length outcome $8;
do i=-14 to 14 by 7;
    date1=date+i;
    outcome=ifc(i=0,'case','control');
    output;
end;
run;

答案 1 :(得分:2)

这是一个R解决方案:

# Your data
visits <- read.table(header=TRUE, text = "id  date  
1   04-jan-05
2   05-jan-05
3   05-jan-05
4   06-jan-05
5   06-feb-05")

# Convert $date to a date format
visits$date <- as.Date(visits$date, format="%d-%b-%y")

要将输出作为列表(在某些情况下可能有用):

lapply(1:nrow(visits), 
       function(x) 
         data.frame(id = visits$id[x], 
                    dates = visits$date[x] + seq(-14, 14, 7), 
                    outcome = c("control", "control", "case", 
                                "control", "control")))

或者,如果您更喜欢单个data.frame,则相同,加上do.call(rbind, ...)

do.call(rbind, 
        lapply(1:nrow(visits), 
               function(x) 
                 data.frame(id = visits$id[x], 
                            dates = visits$date[x] + seq(-14, 14, 7), 
                            outcome = c("control", "control", "case", 
                                        "control", "control"))))

答案 2 :(得分:2)

Stata解决方案:

input byte id str9 sdate 
  1   04-jan-05
  2   05-jan-05
  3   05-jan-05
  4   06-jan-05
  5   06-feb-05
end 
generate long ndate = date(sdate,"DMY",2050)
expand 5
bysort id: replace ndate = ndate + (_n-3)*7
generate byte case = (ndate == date(sdate,"DMY",2050))