直接看一个项目中EG domain中 EGBLFL 的编程逻辑:
Latest non missing measurement (EGDTC if EGSTRESC is not missing) on or before first dose date(DM.RFSTDTC) then set to 'Y', otherwise set to missing
意思是,将EGDTC离RFSTDTC最近的非缺失观测,设为基线。这里有两个限定条件:
整个编程逻辑很清楚,先将DM中的RFSTDTC拼接到EG的观测中,在满足以上两个限定条件后,将时间最晚的记录设为基线。我们来看一下具体的编程代码:1). <EGDTC<=RFSTDTC ;
2) not missing(EGSTRESC) 。
标黄的语句,定义了一个FL的变量,用来表明两个限定条件。这里代码有待改进,只单单表达了 . <EGDTC <= RFSTDTC 这个条件,另外一个条件在 EGBLFL 赋值时补充了,相同作用的代码没有集中在一起,会显得杂乱、不简洁。可以这样修改,一次性满足两个限定条件:
if not missing(egdtc) and egdtcn <= rfstdtcn and not missing(egstresc) then fl = 1;
EGBLFL定义的是每个受试者每一个EGTEST的基线,即每一个受试者、每一类EGTEST都有一个基线。数据集观测按照 USUBJID、EGTESTCD、FL、EGDTC、VISITNUM 排序。前四个排序变量很好理解,每一个受试者的一类EGTESTCD中,满足条件(FL=1)的记录会排在后面,在这些记录中 EGDTC 也是升序排列,最迟时间的记录也会排在最后。但为什么要再加 VISITNUM 这个排序变量呢?因为这个项目原始数据有一些问题,很多观测的 EGDTC 值相同,即时间相同。这样按时间变量排序就很可能无法选出最晚的观测了,于是用 VISITNUM 来担任时间变量的角色。
整个BLFL的处理,简单讲就只有两部分:
1)确定操作观测的范围(FL=1/满足两个限定条件);
2)在符合条件的观测中找到时间最迟的记录,赋值BLFL='Y'。
在理解BLFL的含义及生成逻辑之后,SAS代码的编写就水到渠成了。