首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAS:根据多线诊断排除患者,并计算发病率。

SAS:根据多线诊断排除患者,并计算发病率。
EN

Stack Overflow用户
提问于 2017-08-09 02:38:04
回答 1查看 84关注 0票数 1

我有数百万患者遭遇的大型数据集,其中包括诊断、时间戳、patientID和人口统计信息。

对于每个病人,他们的诊断被列在多个线上。我需要排除有特定诊断的病人(282.1),并计算2014年其他疾病的发病率。

代码语言:javascript
复制
IF diagnosis NE 282.1; 

这在数据步骤中不起作用,因为它没有考虑到其他行上的其他诊断。

如果可能的话,我也想按疾病计算发病率。

这是数据外观的一个例子。有多条有多种诊断的线路。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-09 21:32:04

双读解

直进版

你说你先对数据进行排序,可能是这样

代码语言:javascript
复制
proc sort data=MYLIB.DIAGNOSES;
    by PatientID;
run;

假设您的数据是由patientID排序的,您可以先处理每一个带有诊断的数据以排除数据。

代码语言:javascript
复制
data WORK.NOT_HAVING_282_1;
    set MYLIB.DIAGNOSES (where=(diagnosis EQ 282.1)) 
        MYLIB.DIAGNOSES (where=(diagnosis NE 282.1));
    by PatientID;

我们需要按年份,而不是按日期报告:

代码语言:javascript
复制
year = year(Date);

下一步是排除不需要的诊断,因此需要记住是否发生了不必要的诊断:

代码语言:javascript
复制
    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的病人的其他诊断

代码语言:javascript
复制
    else if not has_282_1 then output;
run;

接下来,您可以使用SQL来计算所需的内容。

代码语言:javascript
复制
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,我们只需要知道谁曾被诊断过:

代码语言:javascript
复制
proc sort noduplicates
    data=MYLIB.DIAGNOSES (where=(diagnosis EQ 282.1))
    out=WORK.HAVING_282_1 (keep=PatientID);
    by PatientID;
run;

关于其他诊断,我们也需要这一年,在这里:

代码语言:javascript
复制
data WORK.VIEW_OTHER / view=WORK.VIEW_OTHER;
    set MYLIB.DIAGNOSES (where=(diagnosis NE 282.1));
    year = year(Date);
    keep PatientID year Diagnose;
run;

但是,在使用视图之前,我们不实际读取和计算任何内容:

代码语言:javascript
复制
proc sort noduplicates
    data=WORK.VIEW_OTHER (where=(diagnosis EQ 282.1))
    out=WORK.OTHER_DIAGNOSES;

    by PatientID year Diagnose;
run;

现在事情变得更简单了。我们使用临时变量excludeother来指示数据的来源。

代码语言:javascript
复制
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;

备注:此代码未进行测试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45580795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档