TEAE(Treatment Emergent Adverse Event)笔记
TEAE(Treatment Emergent Adverse Event)指的是治疗期出现的不良事件,指首次给药之后发生的不良事件或者给药前已经存在、但给药后严重程度增加的不良事件。
临床试验关心研究药物是否安全,而TEAE能够帮助我们探索用药的安全性。在撰写临床研究报告安全性部分时,绝大多数AE相关表格都在计算和汇总发生率最高的AE、导致停药的AE、严重不良事件,而这些都是基于TEAE来分析的,因此药物安全性分析中TEAE是非常重要的部分。
TEAE的衍生规则
一般情况下,统计分析计划(SAP)会详细描述TEAE的衍生规则。
我们在ADAE的数据集中,常用TRTEMFL (Treatment Emergent Analysis Flag)来标识TEAE,最主要的衍生逻辑就是对比AE的开始时间和用药的开始/结束时间,只要ASTDT(已填补的AESTDTC)发生在TRTSDT 至 TRTEDT + N days期间即可判断是TEAE,最简单的逻辑用图表表示就是:
这里的N天是一个安全观察窗口,指的是用药的洗脱期和半衰期,停止用药后药物仍需要在体内代谢一段时间才能完全排除,延长几天能更科学的覆盖药物在体内的代谢期和延迟毒性,确保对药物安全性评估的完整和准确。具体根据SAP定,一般为30天。
判断严重程度增加
这里需要说明一个情况,AE在收集时可能采取log line的动态表单收集方式,因此同一个受试者的同一个AE从发生、加重到结束可能存在多条记录,在Rave EDC数据中这样的同一个AE会以AESPID变量标记,在后续做进SDTM时我们会用AEREFID/AELNKID标注,因此同一个USUBJID/AEREFID就视为同一个AE,可能存在多条。
合并AE
有时非肿瘤项目若只关注AE的最坏结果、不关注AE的变化过程,根据执行公司偏好等原因会将同一个AE的多条记录合并,此时多条记录取最早开始/结束时间以及最差结果,这类AE就不用考虑严重程度增加判断为TEAE的情况。这样做的好处是,在后续TFL时会更好、减少数据处理的复杂程度。
不合并AE
关注AE在时间线上变化过程的项目,如肿瘤试验等就会选择不合并AE的做法。这样的做法能够更好的关注到给药后的AE变化过程、观察药物安全性、精确对应剂量调整。
这样一来写程序时就我们需要将AE在首次用药前发生、但用药期间严重程度增加的情况视为TEAE。在程序里要判断用药后 AETOXGR是否增加、AESER是否变严重,而严重程度减轻则不需要判断为TEAE。
proc delete data=work._all_;run;quit;
/* 1. 建立测试数据集 */
data work.ae;
length usubjid $10 subjid $3 aerefid $8 aeterm $20 aetoxgr $1 aeser $1 aestrtpt $10;
format astdt aendt trtsdt trtedt date9.;
trtsdt = '01JAN2024'd; trtedt = '31JAN2024'd;
/* 场景 1: 完全在用药期间发生的新 AE (期望:Y) */
usubjid='S-001'; subjid='001'; aerefid='AE001'; aeterm='Headache';
astdt='10JAN2024'd; aendt='15JAN2024'd; aetoxgr='1'; aeser='N'; aestrtpt=''; output;
/* 场景 2: 跨越用药期,但严重程度【未增加】 (期望:两条记录都是空) */
usubjid='S-001'; subjid='001'; aerefid='AE002'; aeterm='Nausea';
astdt='25DEC2023'd; aendt='04JAN2024'd; aetoxgr='2'; aeser='N'; aestrtpt=''; output; /* 用药前 */
astdt='05JAN2024'd; aendt='10JAN2024'd; aetoxgr='2'; aeser='N'; aestrtpt=''; output; /* 用药后没加重 */
/* 场景 3: 跨越用药期,且 Grade 【增加】 (期望:用药前为空,用药后为 Y) */
usubjid='S-002'; subjid='002'; aerefid='AE001'; aeterm='Rash';
astdt='28DEC2023'd; aendt='14JAN2024'd; aetoxgr='1'; aeser='N'; aestrtpt=''; output; /* 用药前 Grade 1 */
astdt='15JAN2024'd; aendt='20JAN2024'd; aetoxgr='3'; aeser='N'; aestrtpt=''; output; /* 用药后 Grade 3 */
/* 场景 4: 跨越用药期,Grade没变,但 AESER 变为【严重】 (期望:用药前为空,用药后为 Y) */
usubjid='S-002'; subjid='002'; aerefid='AE002'; aeterm='Fever';
astdt='30DEC2023'd; aendt='19JAN2024'd; aetoxgr='2'; aeser='N'; aestrtpt=''; output; /* 用药前不严重 */
astdt='20JAN2024'd; aendt='25JAN2024'd; aetoxgr='2'; aeser='Y'; aestrtpt=''; output; /* 用药后变严重 */
/* 场景 5: 同一天发生,第一条发生在用药【前】(BEFORE),第二条发生严重程度没变 (期望:全为空) */
usubjid='S-003'; subjid='003'; aerefid='AE001'; aeterm='Cough';
astdt='01JAN2024'd; aendt='09JAN2024'd; aetoxgr='1'; aeser='N'; aestrtpt='BEFORE'; output;
astdt='10JAN2024'd; aendt='15JAN2024'd; aetoxgr='1'; aeser='N'; aestrtpt=''; output;
/* 场景 6: 停药后 30 天内发生的 新AE (期望:Y) */
usubjid='S-003'; subjid='003'; aerefid='AE002'; aeterm='Fatigue';
astdt='15FEB2024'd; aendt='20FEB2024'd; aetoxgr='1'; aeser='N'; aestrtpt=''; output;
/* 场景 7: 停药 30 天后才发生的 新AE (已超出时间窗) (期望:空) */
usubjid='S-004'; subjid='004'; aerefid='AE001'; aeterm='Pain';
astdt='15MAR2024'd; aendt='20MAR2024'd; aetoxgr='1'; aeser='N'; aestrtpt=''; output;
run;
proc sort data=work.ae out=work.adae_sorted;
by usubjid subjid aerefid astdt aendt;
run;
data work.adae_teae;
set work.adae_sorted;
by usubjid subjid aerefid;
length teaefl $1;
length _max_pre_gr 8 _max_pre_ser $1;
retain _max_pre_gr _max_pre_ser;
if first.aerefid then do;
_max_pre_gr = .;
_max_pre_ser = '';
end;
teaefl = '';
/* --- 1. set last date --- */
length _rfendt 8;
format _rfendt date9.;
_rfendt = .;
if not missing(trtedt) then do;
/* Dynamic setting of the washout period */
if aeser = "N" then _rfendt = trtedt + 30;
else if aeser = "Y" then _rfendt = trtedt + 90;
end;
/* --- 2. time window --- */
length _in_te_window 8;
_in_te_window = 0;
if (. < trtsdt <= astdt) or (. < trtsdt = astdt and aestrtpt ^= "BEFORE") then do;
if missing(_rfendt) then _in_te_window = 1;
else if astdt <= _rfendt then _in_te_window = 1;
end;
/* --- 3. severity and grade increase --- */
length _num_toxgr 8;
_num_toxgr = input(aetoxgr, best.);
if _in_te_window = 1 then do;
if missing(_max_pre_gr) then teaefl = 'Y';
else do;
if (_num_toxgr > _max_pre_gr and not missing(_num_toxgr)) then teaefl = 'Y';
else if (aeser = 'Y' and _max_pre_ser = 'N') then teaefl = 'Y';
end;
end;
/* --- 4. update baseline --- */
if astdt < trtsdt or (. < astdt = trtsdt and aestrtpt = "BEFORE") then do;
if missing(_max_pre_gr) or _num_toxgr > _max_pre_gr then
_max_pre_gr = _num_toxgr;
if aeser = 'Y' then _max_pre_ser = 'Y';
else if missing(_max_pre_ser) and aeser = 'N' then _max_pre_ser = 'N';
end;
drop _: ;
run;
/* 后续把teaefl='Y'的条目用hash抓回主数据集,将符合的subjid/aerefid标记为TRTEMFL,代码略 */多个period
对于多阶段用药的项目设计,TEAE的判定会更复杂一些,我们需要判断AE时在哪个用药期间发生的,因此在做数据集时,用药阶段根据研究赋值为TRxxSDT-TRxxEDT,此时需要分阶段进行判断,写程序时可以用数组进行遍历计算,具体内容可参考相关资料文章。