如何获得所需的输出数据以确定治疗模式?

时间:2017-07-09 17:21:58

标签: sql sas

我遇到了在sas中创建所需输出数据的问题。

我必须确定最初21天内使用过的药物,并制定初始治疗方案。但以下规则适用于最终确定治疗方案。

开始日期将首先使用任何药物,无论核心或无核心

结束日期将是最后一次使用任何核心药物的最后结束日期

如果在初始治疗结束日期后60天内发现来自初始治疗线的任何核心药物,则初始治疗线的结束将更新至该鉴定核心药物的结束日期。我必须再检查60天的差距等等。

如果在初始批次结束日期之前确定了一种新的核心药物(初始治疗线以外的核心药物除外),那么第一批次将在新核心药物开始日期前一天结束。第二条治疗方法将是从新核心药物的开始日期开始。

如果在初始治疗结束日期的60天内没有来自初始治疗的核心药物,则将开始第二治疗线并且将应用相同的上述规则来寻找第三批或后续批次。 如果有任何重叠病例如核心药物C1在第二线治疗开始后几天继续,并且在第二线治疗开始后的任何时间再次发现,那么第二线治疗将包含来自第二线的药物治疗以及c1。结束日期将是最新使用任何核心药物的结束。

我有数据

patient_id         drug_name       drug_type      start           end

A11                            N1               Non_core       23-Apr-14   21-May-14

A11                        C1                 Core         27-Apr-14   25-May-14

A11                        C1                 Core         3-May-14   31-May-14

A11                        N1               Non_core   10-May-14   7-Jun-14

A11                        C2                  Core        11-May-14    8-Jun-14

A11                        N2               Non_core   12-May-14    9-Jun-14

A11                        C1                 Core         10-Jul-14      7-Aug-14

A11                        C1                 Core         15-Jul-14    12-Aug-14

A11                        C3                 Core         29-Jul-14     26-Aug-14

A11                        N4              Non_core     8-Sep-14       6-Oct-14

A11                        N2              Non_core     9-Sep-14      7-Oct-14

A11                        C1                Core           12-Sep-14    10-Oct-14

A11                        C1                Core           15-Sep-14    13-Oct-14

A11                        C1                Core           27-Sep-14     25-Oct-14

A11                        C3                Core            1-Jan-15        29-Jan-15

A11                        C1                 Core           3-Jan-15       31-Jan-15

A11                        C1                 Core            5-Jan-15       2-Feb-15

A11                        C1                 Core           10-Jan-15      7-Feb-15

A11                        N1              Non_core       15-Jan-15    12-Feb-15

A11                        N2              Non_core       18-Jan-15     15-Feb-15

我想要的数据

patient_id           drug                       start               end             lot

A11                 C1+N1+C2+N2       23-Apr-14      28-Jul-14        1

A11                  C3+C1+N4+N2      29-Jul-14       25-Oct-14        2

A11                 C3+C1+N1+N2        1-Jan-15       15-Feb-15       3

这里很多代表治疗方法

在此数据中,最初21天内发现的药物为N1,c1,c1,n1,c2,n2,批次1的初始开始日期为2014年4月23日,初始结束日期为最新使用时间核心药物是6/8/2014

接下来,我需要检查初始批次结束后60天内是否有来自初始批次的核心药物。批次1的c1在60天内有。所以新的结束日期将更新为2014年8月7日。我需要查找60天的标准。我发现c1在60天内可用。所以新的结束日期将是2014年8月12日。但是根据上述规则,在初始治疗结束之前有一种新的核心药物(初始批次的核心药物除外)。所以第一行治疗将在新确定的核心药物开始日期前一天结束。然后第一批的结尾是7/28/2014。

第二线治疗从2014年7月29日开始。上述规则同样适用于确定结束日期.21天内发现的药物为C3,C1,N4,N2,C1。初始结束日期将是10/13/2014。来自批次1的重叠药物(C1)因为C1的最新使用是8/7/2014,是在第2批的开始之后,并且在批次2的开始之后的任何时候再次发现。然后第二批的结束日期将是10/25/2014。

由于在第二批结束的6o天内没有找到药物,第三批将从2015年1月1日开始。将适用上述规则。

我已经尝试过以下代码,但它没有提供所需的输出。它给出了以下输出。

patient_id start_date end_date药物批次

A11 27-Apr-14 11-May-14 C1 + N1 + C2 1

A11 10-Jul-14 8-Sep-14 C1 + C3 2

A11 12-Sep-14 26-Sep-14 C1 3

A11 1-Jan-15 17-Jan-15 C3 + C1 + C1 4

data want (keep=patient_id drug start_date end_date lot);
  set have;
  by patient_id;
  retain start_date end_date drug end60;
  format start_date end_date date9.;
  set have ( firstobs = 2 keep = start drug_type drug_name 
              rename = (start = next_start drug_type=next_type drug_name=next_drug) )
      have (      obs = 1 drop = _all_ );
  next_start = ifn(last.patient_id, (.), next_start );
  if first.patient_id or counter eq 0 then do;
    start_date=start;
    end_date=end;
    if drug_type eq 'Core' then do;
      counter=1;
      drug=drug_name;
      end60=end+60;
    end;
    else do;
      drug='';
      counter=0;
    end;
  end;
  else if start le Start_Date+21 then do;
    if counter=0 then do;
      if drug_type eq 'Core' then do;
        drug=drug_name;
        counter=1;
        end60=end;
      end;
    end;
    else do;
      if not findw(drug,drug_name) then drug=catx('+',drug,drug_name);
      if drug_type eq 'Core' then do;
        counter+1;
        end_date=end;
      end;
    end;
  end;
  else if Start_Date le end60 and findw(drug,drug_name) and drug_type eq 'Core' then do;
    end60=end+60;
  end;
  if counter gt 0 and
     (next_start gt End60 or
     (counter gt 0 and
      not findw(drug,next_drug) and
      next_type eq 'Core' and
      next_start gt start_date+21)) or
      last.patient_id then do;
    end_date=start-1;
    lot+1;
    output;
    drug='';
    core='';
    counter=0;
  end;
run;

任何线索都会有所帮助。谢谢。

0 个答案:

没有答案