【问题标题】:enrollment date 12 months before and after a specific date入学日期 特定日期前后 12 个月
【发布时间】:2016-02-06 19:26:22
【问题描述】:

enter image description here我正在尝试通过 id 查找在住院日期前 12 个月和住院日期后 12 个月连续注册的人。每个成员将有一排。 这是在美国使用索赔数据库。任何帮助表示赞赏。 数据集示例: ID Enr_date End_Date hosp_date 1 2004 年 1 月 5 日 2008 年 1 月 6 日 2006 年 2 月 2 日 2 ....等等 3 4 id start_e end_e date_h 1 2005 年 1 月 1 日 2006 年 1 月 1 日 2008 年 2 月 8 日 1 2006 年 2 月 3 日 2013 年 4 月 5 日 2 2005 年 5 月 7 日 2006 年 8 月 8 日 2007 年 4 月 5 日 2 2007 年 1 月 1 日 2012 年 2 月 2 日 3 2005 年 5 月 9 日 2007 年 5 月 9 日 2007 年 1 月 1 日 3 2008 年 6 月 4 日 2012 年 7 月 7 日

【问题讨论】:

  • 您只是在寻找:hosp-date - enr_date > 12 个月和 end_date - hosp_date > 12 个月?
  • 是的,但我希望在不中断服务的情况下连续注册。还有一些患者有多行。所以他们可以有不同的注册期。
  • 您需要更好地提出您的问题。服务不中断和多排如何发挥作用?如果你能展示一个完整的数据集和更好地描述你的问题,这可能会有所帮助
  • 请查看顶部的链接。一个患者可以有多个登记行,因为他们可能有 2 个月的承保,然后是承保缺口。然后他们可能会以不同的开始和结束日期开始另一次注册。我所说的服务不中断是指存在覆盖缺口。如果您看一下我发布的示例,应该只包括患者 2。任何帮助表示赞赏。
  • 请输入您的数据并将其包含在问题中,它为人们提供了一些可以使用的东西。此时要处理您的数据,我必须将其输入。您可以通过 sql 和日期使用自联接来生成您的解决方案。招生问题是一个常见的问题。在 lexjansen.com 或 community.sas.com 搜索许多类似的问题和答案。

标签: date sas subset


【解决方案1】:

假设我的最后一个 cmets 有答案,您可以通过多种方式做到这一点。一开始可能很难让外部联接、交叉联接等以易于理解的方式工作。使用 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;                                                                                                                              

【讨论】:

    【解决方案2】:

    我从事理赔数据方面的工作,我想我理解您想问的问题。我建议制作一张包含“精简”注册范围的表格,另一张包含住院日期的表格。然后你可以将它们合并在一起,只保留那些符合你标准的患者。以下代码将压缩注册范围(假设记录良好):

    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 取第一个 obs:

    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;
    

    【讨论】:

    • 谢谢戴夫和 DCR。由于我正在处理索赔数据库,因此第二个答案最适合我的数据,它有效!欣赏它
    猜你喜欢
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多