3

私は緊急治療室への訪問に対する大気汚染の影響を研究することを計画しており、二国間ケースクロスオーバーデザインを使用する予定です。それぞれの場合(病院訪問)について、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に1つのケースと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
4

3 に答える 3

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;
于 2012-09-10T11:46:32.707 に答える
2

これが1つの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"))))
于 2012-09-10T12:28:58.150 に答える
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))
于 2012-09-11T03:06:18.973 に答える