SAS:根据多行诊断排除患者并计算发病率
SAS: Exclude patients based on diagnoses on multiple lines and calculate incidence rates
我有数百万患者就诊的大型数据集,其中包括诊断、时间戳、患者 ID 和人口统计信息。
对于每位患者,他们的诊断都列在多行中。我需要排除具有某种诊断(282.1)的患者并计算2014年其他疾病的发病率。
IF diagnosis NE 282.1;
这在数据步骤中不起作用,因为它没有考虑其他线路上的其他诊断。
如果可以的话,我也想按病种计算发病率
这是数据的示例。有多条线有多个诊断。
PatientID Diagnosis Date Gender Age
1 282.1 1/2/10 F 25
1 232.1 1/2/10 F 87
1 250.02 1/2/10 F 41
1 125.1 1/2/10 F 46
1 90.1 1/2/10 F 58
2 140 12/15/13 M 57
2 132.3 12/15/13 M 41
2 149.1 12/15/13 M 66
3 601.1 11/19/13 F 58
3 231.1 11/19/13 F 76
3 123.1 11/19/13 F 29
4 282.1 12/30/14 F 81
4 130.1 12/30/14 F 86
5 230.1 1/22/14 M 60
5 282.1 1/22/14 M 46
5 250.02 1/22/14 M 53
双读解决方案
直截了当的版本
你说先把数据排序,大概是这样的
proc sort data=MYLIB.DIAGNOSES;
by PatientID;
run;
假设您的数据按 patientID
排序,您可以处理每个数据并首先排除诊断。
data WORK.NOT_HAVING_282_1;
set MYLIB.DIAGNOSES (where=(diagnosis EQ 282.1))
MYLIB.DIAGNOSES (where=(diagnosis NE 282.1));
by PatientID;
因为我们需要按年而不是按日期报告:
year = year(Date);
下一步是排除那些你不需要的,所以你需要记住是否发生了不需要的诊断:
retain has_282_1;
if first.PatientID then has_282_1 = 0;
if diagnosis EQ 282.1 then has_282_1 = 1;
然后在 2014 年为没有 282.1 的患者保留其他诊断
else if not has_282_1 then output;
run;
接下来你可以SQL数一数你需要什么
proc sql:
create table MYLIB.STATISTICS as
select year, Diagonsis, count(distinct PatientID) as incidence
from WORK.NOT_HAVING_282_1
group by year, Diagonsis;
quit;
改进
上述解决方案将需要更多的处理能力:
- 您从 diks 读取
DIAGNOSES
,然后将 FIRST_282_1 写入磁盘,只是为了再次读回
- 您可以在同一年的不同日期对同一患者进行多次观察,因此您需要
count(distinct PatientID)
,这是一项代价高昂的操作。
关于诊断282.1,我们只需要知道曾经诊断过谁:
proc sort noduplicates
data=MYLIB.DIAGNOSES (where=(diagnosis EQ 282.1))
out=WORK.HAVING_282_1 (keep=PatientID);
by PatientID;
run;
关于其他诊断,我们还需要年份,这里是:
data WORK.VIEW_OTHER / view=WORK.VIEW_OTHER;
set MYLIB.DIAGNOSES (where=(diagnosis NE 282.1));
year = year(Date);
keep PatientID year Diagnose;
run;
但是当我们使用一个视图时,我们并没有真正读取和计算任何在视图被用于这种情况之前:
proc sort noduplicates
data=WORK.VIEW_OTHER (where=(diagnosis EQ 282.1))
out=WORK.OTHER_DIAGNOSES;
by PatientID year Diagnose;
run;
现在事情变得简单了。我们使用临时变量 exclude
和 other
来指示数据的来源
data WORK.NOT_HAVING_282_1;
set WORK.HAVING_282_1 (in=exclude)
WORK.OTHER_DIAGNOSES (in=other);
by PatientID;
retain has_282_1;
if first.PatientID then has_282_1 = exclude;
if other and not has_282_1 then output;
run;
proc sql:
create table MYLIB.STATISTICS as
select year, Diagonsis, count(*) as incidence
from WORK.NOT_HAVING_282_1
group by year, Diagonsis;
quit;
备注:此代码未经测试
我有数百万患者就诊的大型数据集,其中包括诊断、时间戳、患者 ID 和人口统计信息。
对于每位患者,他们的诊断都列在多行中。我需要排除具有某种诊断(282.1)的患者并计算2014年其他疾病的发病率。
IF diagnosis NE 282.1;
这在数据步骤中不起作用,因为它没有考虑其他线路上的其他诊断。
如果可以的话,我也想按病种计算发病率
这是数据的示例。有多条线有多个诊断。
PatientID Diagnosis Date Gender Age
1 282.1 1/2/10 F 25
1 232.1 1/2/10 F 87
1 250.02 1/2/10 F 41
1 125.1 1/2/10 F 46
1 90.1 1/2/10 F 58
2 140 12/15/13 M 57
2 132.3 12/15/13 M 41
2 149.1 12/15/13 M 66
3 601.1 11/19/13 F 58
3 231.1 11/19/13 F 76
3 123.1 11/19/13 F 29
4 282.1 12/30/14 F 81
4 130.1 12/30/14 F 86
5 230.1 1/22/14 M 60
5 282.1 1/22/14 M 46
5 250.02 1/22/14 M 53
双读解决方案
直截了当的版本
你说先把数据排序,大概是这样的
proc sort data=MYLIB.DIAGNOSES;
by PatientID;
run;
假设您的数据按 patientID
排序,您可以处理每个数据并首先排除诊断。
data WORK.NOT_HAVING_282_1;
set MYLIB.DIAGNOSES (where=(diagnosis EQ 282.1))
MYLIB.DIAGNOSES (where=(diagnosis NE 282.1));
by PatientID;
因为我们需要按年而不是按日期报告:
year = year(Date);
下一步是排除那些你不需要的,所以你需要记住是否发生了不需要的诊断:
retain has_282_1;
if first.PatientID then has_282_1 = 0;
if diagnosis EQ 282.1 then has_282_1 = 1;
然后在 2014 年为没有 282.1 的患者保留其他诊断
else if not has_282_1 then output;
run;
接下来你可以SQL数一数你需要什么
proc sql:
create table MYLIB.STATISTICS as
select year, Diagonsis, count(distinct PatientID) as incidence
from WORK.NOT_HAVING_282_1
group by year, Diagonsis;
quit;
改进
上述解决方案将需要更多的处理能力:
- 您从 diks 读取
DIAGNOSES
,然后将 FIRST_282_1 写入磁盘,只是为了再次读回 - 您可以在同一年的不同日期对同一患者进行多次观察,因此您需要
count(distinct PatientID)
,这是一项代价高昂的操作。
关于诊断282.1,我们只需要知道曾经诊断过谁:
proc sort noduplicates
data=MYLIB.DIAGNOSES (where=(diagnosis EQ 282.1))
out=WORK.HAVING_282_1 (keep=PatientID);
by PatientID;
run;
关于其他诊断,我们还需要年份,这里是:
data WORK.VIEW_OTHER / view=WORK.VIEW_OTHER;
set MYLIB.DIAGNOSES (where=(diagnosis NE 282.1));
year = year(Date);
keep PatientID year Diagnose;
run;
但是当我们使用一个视图时,我们并没有真正读取和计算任何在视图被用于这种情况之前:
proc sort noduplicates
data=WORK.VIEW_OTHER (where=(diagnosis EQ 282.1))
out=WORK.OTHER_DIAGNOSES;
by PatientID year Diagnose;
run;
现在事情变得简单了。我们使用临时变量 exclude
和 other
来指示数据的来源
data WORK.NOT_HAVING_282_1;
set WORK.HAVING_282_1 (in=exclude)
WORK.OTHER_DIAGNOSES (in=other);
by PatientID;
retain has_282_1;
if first.PatientID then has_282_1 = exclude;
if other and not has_282_1 then output;
run;
proc sql:
create table MYLIB.STATISTICS as
select year, Diagonsis, count(*) as incidence
from WORK.NOT_HAVING_282_1
group by year, Diagonsis;
quit;
备注:此代码未经测试