入学日期在特定日期之前和之后的12个月

时间:2016-02-06 19:26:23

标签: date sas subset

enter image description here我正在努力寻找身份证明的人,他们在住院日期之前连续12个月入学,在住院日期之后又过了12个月。每个成员都有一行。 这是在美国使用索赔数据库。任何帮助表示赞赏。 数据集示例: ID Enr_date End_Date hosp_date 1 1/5/2004 1/6/2008 2/2/2006 2 ....等等 3 4     id start_e end_e date_h 1 1/1/2005 1/1/2006 2/8/2008 1 2/3/2006 4/5/2013 2 5/7/2005 8/8/2006 4/5/2007 2 1/1/2007 2/2/2012 3 5/9/2005 5/9/2007 1/1/2007 3 6/4/2008 7/7/2012

2 个答案:

答案 0 :(得分:0)

假设我的上一篇评论有答案,有很多方法可以做到这一点。开始时可能很难以易于理解的方式获得外连接,交叉连接等工作。使用SAS宏,我们可以解决问题,因此很容易理解并进行可能需要的任何调试。这是一种可能适合您的方法:

%macro hdates;                                                                                                                        

 /* get number of hosp_dates    */                                                                                                                              
  proc sql noprint;                                                                                                                     
  select count(*) into: cnt                                                                                                             
  from date where hosp_date ne .;                                                                                                       
  quit;                                                                                                                                 

  %let cnt = &cnt;                                                                                                                      


  /* place hdates and ids into macro vars */                                                                                                                                  
  proc sql noprint;                                                                                                                     
  select  enrolid, hosp_date into: id_1 - :id_&cnt, : hdate_1 - :hdate_&cnt                                                             
  from date;                                                                                                                            
  quit;                                                                                                                                 

  proc delete data= hcov; run;                                                                                                          

  /* for each hdate id pair go through the dataset and test for 12 mo coverage                                                                                                                                 
  %do i = 1 %to &cnt;                                                                                                                   

  data new;                                                                                                                             
  set date;                                                                                                                             
  if (enrolid = &&id_&i) then do;                                                                                                       
      preDays = "&&hdate_&i"d - start_date ;                                                                                            
      postDays = end_date - "&&hdate_&i"d;                                                                                              
     if (preDays >= 365 and postDays >= 365) then output;                                                                              
  end;                                                                                                                                  
  run;                                                                                                                                  

  proc append base = hcov data=new;run;                                                                                                 

  %end;                                                                                                                                 






 %mend hdates;                                                                                                                         

 %hdates;                                                                                                                              

答案 1 :(得分:0)

我处理索赔数据,我想我明白你要问的是什么。我建议使用"浓缩"制作一张桌子。入学范围和另一个住院日期。然后您可以将它们合并在一起,只保留那些符合您标准的患者。以下代码将压缩注册范围(假设记录良好):

PROC SORT DATA=dset_in; BY id enr_date end_date; RUN;

DATA enrollment (KEEP=id enroll_start enroll_stop);
    SET dset_in;
    FORMAT enroll_start enroll_stop DATE9.;
    BY id enr_date end_date;
    RETAIN enroll_start enroll_stop;
    IF first.id THEN DO;
        enroll_start=enr_date;
        enroll_stop=end_date;
    END;
    ELSE IF enr_date-enroll_stop <= 1 THEN enroll_stop=end_date;
    ELSE DO;
        OUTPUT;
        enroll_start=enr_date;
        enroll_stop=end_date;
    END;
    IF last.id THEN OUTPUT;
RUN;

然后,此代码将仅保留那些住院前和入组前后365天的患者。如果hosp_claims数据集每位患者住院次数超过1次,则在此步骤后排序,然后按照每个ID的第一个障碍:

PROC SQL;
  CREATE TABLE hosp_enrolled AS
  SELECT DISTINCT a.id, a.hosp_dt, b.enroll_start, b.enroll_stop
  FROM hosp_claims AS a, enrollment AS b
  WHERE a.id=b.id AND b.enroll_start+365 <= a.hosp_dt <= enroll_stop-365;
QUIT;