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,最简单的逻辑用图表表示就是:

img

这里的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,此时需要分阶段进行判断,写程序时可以用数组进行遍历计算,具体内容可参考相关资料文章。

img

相关参考资料

文件名

发表年份

文章总结

PharmaSUG-2019-PO-277.pdf

2019

针对多period/phase问题,通过遍历各治疗周期,解决TEAE标记问题。

PharmaSUG-2017-IB031773555091336.pdf

2017

聚焦TEAE标记四大场景:洗脱期AE归因、严重程度变化判断、单治疗部分日期处理、交叉研究部分日期处理。

PharmaSUG-China-2014-PT11.pdf

2014

AE合并规则及代码,提供了完整SAS代码实现流程,是TEAE标记前的数据清洗关键步骤。

PharmaSUG-2015-PO011773554943709.pdf

2015

全面讨论TEAE标记的五大易错场景:洗脱期处理、交叉研究标志设计、严重程度恶化与改善区分、部分日期插补规则。强调开始/结束日期差异化插补避免逻辑冲突,提供TEAE衍生前的自查清单和编程建议。

PharmaSUG-2012-CC211773554818975.pdf

2012

开发%MCONTEAE宏通过日期特异性识别TEAE和合并用药,采用保守原则除非能证明否则标记为治疗期间。支持ISO 8601格式和部分日期比较,提供CMPVAR参数验证SAP插补规则合理性,发现潜在逻辑漏洞。