我遇到了在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;
任何线索都会有所帮助。谢谢。