【问题标题】:SAS: Exclude patients based on diagnoses on multiple lines and calculate incidence ratesSAS:根据多行诊断排除患者并计算发病率
【发布时间】:2018-01-16 18:14:22
【问题描述】:

我有数百万患者遭遇的大型数据集,其中包括诊断、时间戳、患者 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

【问题讨论】:

  • 您需要与 282.1 不同的几种疾病的发病率还是很多?
  • @DirkHorsten 我需要很多疾病的发病率,不同于 282.1
  • 您需要什么发病率:每次诊断和患者 ID 的就诊/治疗次数每次诊断的就诊/治疗次数每次诊断的不同患者 ID ?可能您可以添加一些您希望结果看起来如何的片段。
  • @DirkHorsten 我需要的发病率是给定年份中每次诊断的不同 PatientID。例如,我想制作一张表格,其中包含一系列疾病及其发病率。
  • 如果某人在2013年诊断为282.1,您是否需要排除他/她对2011年其他疾病的诊断? 2015 年呢?

标签: sas bioinformatics frequency


【解决方案1】:

双读解决方案

直截了当的版本

你说你先对数据进行排序,大概是这样的

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; 

然后对于没有 282.1 的患者保留 2014 年的其他诊断

    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;

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

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;

备注:此代码未经测试

【讨论】:

  • @DickHorsten 如果数据不是按 PatientID 排序的,这还能用吗?
  • No,就像上面写的那样,只有在数据排序后才有效。 您的数据是否按PatientID 排序?如果不是,是按患者分组的观察结果,还是来自不同患者的数据混合你有什么格式的数据:sas 数据集、文本文件还是数据库?
  • 不同患者的数据是混杂的,但是我做了PROC SORT;通过患者 ID。数据为 .sas7bdat 格式
猜你喜欢
  • 2018-03-12
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 2018-01-04
相关资源
最近更新 更多