【问题标题】:SAS: Count number of a particular type of disease with patient data on multiple linesSAS:使用多行患者数据计算特定类型疾病的数量
【发布时间】:2018-03-12 23:43:16
【问题描述】:

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

我们发现,一种特定类型的疾病经常与一种常见疾病共存。

我想计算每个患者患有此类疾病的数量,然后创建一个直方图,显示有多少人患有 1、2、3、4 等其他疾病。

这是数据的格式。

PatientID   Diagnosis   Date    Gender  Age
1           282.1       1/2/10      F   25
1           282.1       1/2/10      F   87
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           282.1       12/15/13    M   41
2           232.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           601.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

一般来说,我在考虑 DO 循环,但我不确定从哪里开始,因为数据集中有重复项,例如患者 1(282.1 被列出两次)。我不确定如何解释这一点。有什么想法吗?

要计数的目标诊断为 282.1、232.1、250.02。在此示例中,患者 1 的计数为 3,患者 2 的计数为 2,依此类推。

编辑: 这是我使用的,但输出在输出的多行上显示每个 PatientID。

PROC SQL;
create table want as
select age, gender, patientID,
       count(distinct diagnosis_description) as count
   from dz_prev
   where diagnosis in (282.1, 232.1)
   group by patientID;
quit;

这是输出表的样子。为什么这个患者 ID 会出现这么多次?

Obs AGE GENDER PATIENTID count
1 55 Male 107828695 1
2 54 Male 107828695 1
3 54 Male 107828695 1
4 54 Male 107828695 1
5 54 Male 107828695 1

【问题讨论】:

  • 发布你的尝试。
  • 您的下一个问题将是哪些疾病和哪些群体,因此请确保您的方法现在考虑到这一点。
  • @Reeza 我已经更新了帖子以显示我尝试过的内容和结果。
  • 您所包含的变量(agegender)既不是组变量也不是聚合统计信息。将它们添加到 GROUP BY 或从选定变量列表中删除它们。

标签: sas frequency medical


【解决方案1】:

如果您包含既不是分组变量也不是汇总统计的变量,那么 SAS 会很乐意将您的汇总统计重新与所有源记录重新合并。这就是您获得多条记录的原因。如果您的数据集涵盖多年,AGE 通常会有所不同。如果您的数据混乱,性别也可能会有所不同。因此,为了快速分析,您可以尝试这样的操作。

create table want as
select patientID
     , min(age) as age_at_onset
     , min(gender) as gender
     , count(distinct diagnosis_description) as count
   from dz_prev
   where diagnosis in (282.1, 232.1)
   group by patientID
;

【讨论】:

  • 非常感谢!我将如何显示哪些人有 0 个我们正在寻找的诊断?
  • 你需要改变方法,因为你不能使用 WHERE 来消除观察。而是使用 CASE 语句将其移动到 COUNT() 函数中。 count(distinct case when (diagnosis in (282.1,232.1)) then diagnosis_description end)
  • PS 您将在数字变量中存储诊断代码时遇到麻烦。 ICD10 代码都是以字母开头的,ICD9 中也有 V 和 E 代码也是以字母开头的。
  • 我完全同意将诊断代码存储为数字变量。我没有在示例数据 sn-p 中包含 ICD 10 代码,但它们在那里。您建议的替代方案是什么?
  • 它并没有真正影响这个查询的逻辑,而是将代码存储为字符串。因此,您对特定值的查询需要使用字符串文字而不是数字文字。
【解决方案2】:

我认为你可以用一条 SQL 语句得到你想要的

PROC SQL NOPRINT;
create table want as
select PatientID,
       count(distinct Diagnosis) as count
   from have
   where Diagnosis in (282.1, 232.1, 250.02)
   group by PatientID;
quit;

这仅过滤您感兴趣的诊断,通过 PatientID 计算它们被看到的不同时间,并将结果保存到新表中。

【讨论】:

  • 非常感谢您的建议!我已经尝试过了,它在输出中给了我多行相同的患者 ID。我已经更新了上面的帖子。有什么想法吗?
  • @Kevin,如果您按所示编码,上面的解决方案可以正常工作。如果您在代码中使用年龄/性别,则不会。请注意,您的问题中没有一个关于年龄/性别的词,因此根据您的要求,此答案是正确的。这就是为什么展示你在做什么很重要的原因。
  • 根据您更新的问题,Tom 所拥有的将起作用。另一种选择是对显示的代码进行编码,并在单独的连接中添加年龄和性别信息。
猜你喜欢
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多