如何在SAS中按家庭识别队列数据集的索引病例?
按家庭标记最早发病的索引病例(SAS实现)
我是SAS新手,正在处理一项队列数据集:该数据集招募的家庭均有成员确诊呼吸道疾病阳性,每个成员有独立的PTID(受试者ID)和HouseholdID(家庭ID),同户成员的HouseholdID一致。我需要定义索引病例:在同一家庭中,将OnsetDate(发病日期)最早的成员标记为索引病例(值为1),其余成员标记为0。我尝试编写了如下代码,但无法正常运行:
data house; set house; if householdID==householdID and min(onsetdate) then index=1; else if index = 0; run;
原数据集
| PTID | HouseholdID | OnsetDate |
|---|---|---|
| 10 | 1 | 10/11/2022 |
| 11 | 1 | 10/14/2022 |
| 12 | 1 | 10/9/2022 |
| 13 | 2 | 10/11/2022 |
| 14 | 2 | 10/12/2022 |
目标处理结果
| PTID | HouseholdID | OnsetDate | IndexCase |
|---|---|---|---|
| 10 | 1 | 10/11/2022 | 0 |
| 11 | 1 | 10/14/2022 | 0 |
| 12 | 1 | 10/9/2022 | 1 |
| 13 | 2 | 10/11/2022 | 1 |
| 14 | 2 | 10/12/2022 | 0 |
可行的SAS代码实现
方法1:DATA步+BY分组处理
先对数据集按家庭ID和发病日期排序,再利用SAS的first.变量标记同家庭中最早发病的成员:
/* 按家庭ID和发病日期升序排序,确保同家庭内日期最早的排在第一位 */ proc sort data=house; by householdID onsetdate; run; /* 生成带索引病例标记的数据集 */ data house_index; set house; by householdID; /* 当是当前家庭的第一行(即发病日期最早)时标记为1,其余为0 */ indexcase = ifn(first.householdID, 1, 0); run;
方法2:PROC SQL窗口函数
无需提前排序,直接用窗口函数计算每个家庭的最早发病日期并对比:
proc sql; create table house_index as select ptid, householdID, onsetdate, /* 对比当前成员发病日期是否等于家庭内最早日期,是则标记1,否则0 */ case when onsetdate = min(onsetdate) over (partition by householdID) then 1 else 0 end as indexcase from house; quit;
内容的提问来源于stack exchange,提问作者Jeb
相关产品推荐
相关产品推荐

