欢迎关注,SAS茶谈!
Hy's 定律是Hyman Joseph Zimmerman 博士在1978年首先提出的一个判断药物性肝损伤(Drug-Induced Liver Injury, DILI)发病率和病死率的标准。
这篇文章会介绍Hy's定律内容以及相关编程处理,涉及SDTM、ADaM、相关Table的内容介绍,其中ADaM编程相对复杂,Table输出可以参考SAS编程-Table:频数汇总表的总结 。
如果读者工作中遇到相关内容,希望这篇文章能够给你带来帮助。
1. Hy's 定律的内容
在FDA的《药物上市前肝损伤临床评估指南》(Drug-Induced Liver Injury: Premarketing Clinical Evaluation | FDA)中,Hy's 定律有3个要点:
- 药物引起地肝细胞损伤,通常表现在ALT(谷丙转氨酶)或AST(谷草转氨酶)上,检测值高达正常值上限的3倍以上;
- 在这些转氨酶升高的受试者中,某些患者还会伴有TBL(总胆红素)大于正常值上限的2倍以上,但是早期未出现胆汁淤积(ALP(碱性磷酸酶) 不增高);
- 转氨酶和总胆红素同时升高,但原因不明,比如已经排除甲、乙、丙型肝炎、其他原有的肝脏疾病以及其他能药物引起的肝损伤。
研究表明,对于满足以上3个要点的受试者(Subjects with any elevated AT of >3xULN, ALP <2xULN, and associated with an increase in bilirubin >2xULN),严重药物性肝损伤(Severe DILI)的发生率预计超过10%。在2009年,Hy's定律被FDA写入《肝损伤临床评估指南》,作为美国新药研发评估肝脏毒性的参考标准。
指南中提及,在新药临床试验申请(NDA)与生物制品许可申请(BLA)递交中,需要包含Hy's 定律案例相关内容。
这里给出一张示例表格:
Hy's 定律用于评估肝损伤,涉及指标的所有观测记录都会纳入分析判断,包括Unscheduled和Follow-up的访视,这一点在编程中需要注意。
接下来,介绍SDTM、ADaM、Table中对Hy's定律的处理。
2. SDTM中的处理
根据Hy's 定律的内容,定律涉及到的指标有4个:ALT, AST, TBL, ALP。在SDTM Mapping中,TBL对应的LBTESTCD值为BILI。
这些指标都保存在SDTM.LB中,与LB其他指标相比,没什么特别,无需额外处理。
3. ADaM中的处理
对于ADaM,通常会新建一个数据集用于保存Hy's 定律相关记录,与ADLB进行区分,例如,ADLBHY。所需数据直接从ADLB中获取,对应主题变量paramcd = "HYLAW"
。当受试者记录同时满足以下3个条件时,avalc = "Y"
;反之,avalc = "N"
。
- ALT or AST >3xULN
- TBL >2xULN
- ALP <2xULN
为方便表格输出,ADaM数据集中还会输出各指标值与正常值上限比值的最大值(max(aval/lbstresn)
)。
ADLBHY的Parameter如下:
- MXRUAT, Maximum Ratio of ULN-Aminotransferase
- MXRUALT, Maximum Ratio of ULN-Alanine Aminotransferase
- MXRUAST, Maximum Ratio of ULN-Aspartate Aminotransferase
- MXRUBILI, Maximum Ratio of ULN-Total Bilirubin
- MXRUALP, Maximum Ratio of ULN-Alkaline Phosphatase
- HYLAW, Total Bilirubin >2xULN and Transaminase>3x ULN and Alkaline Phosphatase <2xULN
总共6个Paramter,其中ALT、AST、BILI、ALP的与正常值上限比值最大值的记录可以直接从ADLB中筛选获取;而ALT or AST 的比值最大值以及HYLAW对应的记录需要单独Derive。
下面介绍相关ADaM编程。
3.1 从ADLB中获取数据;
直接从ADLB获取对应的Param记录,不需要筛选记录。如果ADLB中没有生成检测值与正常值上限的比值(r2ahi
),就需要新建这个变量。
***1. Get data from ADLB;
data adlbhy0;
set adam.adlb;
where paramcd in ("ALT" "AST" "BILI" "ALP");
r2ahi = aval/lbstnrhi;
proc sort;
by usubjid subjid paramcd lbventyp avisitn adt adtm;
run;
3.2 新建变量用以区分基线以及基线后观测
在输出Table中,访视分为基线前和基线后,需要提前处理判断进行划分。处理完毕后,数据集进行排序,方便下一步获取4个参数的最大取值。
***2. Derive Parameters;
**2.1 Create variable for post-baseline records;
data base;
set adlbhy0;
where ablfl = "Y";
rename adt=baseadt adtm=baseadtm;
keep usubjid subjid paramcd lbventyp adt adtm;
proc sort;
by usubjid subjid paramcd lbventyp baseadt baseadtm;
run;
data adlbhy1;
merge adlbhy0(in=a) base;
by usubjid subjid paramcd lbventyp;
if a;
length aevlint $40;
if ablfl="Y" then do;
aevlintn=0;
aevlint="BASELINE";
end;
else if adt>baseadt or adtm>baseadtm then do;
aevlintn=1;
aevlint="POST-BASELINE";
end;
else delete;
drop aval;
proc sort;
by usubjid subjid paramcd aevlintn r2ahi descending adt;
run;
3.3 获取数据集中4个参数的最大值记录
升序排序,筛选出对应By变量组的最后一条记录,即是组内最大值记录。同时,更新对应的Paramcd值。
这里使用Data步获取最大值记录,是为了保留数据集中的其他相关变量。如果使用SQL的聚合函数(max)实现,其他变量的保留就相对繁琐。
**2.2 Get maximum for each paramcd;
data adlbhy2;
set adlbhy1;
by usubjid subjid paramcd aevlintn;
if last.aevlintn;
if paramcd="ALT" then paramcd="MXRUALT";
else if paramcd="AST" then paramcd ="MXRUAST";
else if paramcd="BILI" then paramcd ="MXRUBILI";
else if paramcd="ALP" then paramcd ="MXRUALP";
format AVAL 8.3;
aval=r2ahi;
run;
3.4 ALT or AST 最大值处理
上一步ALT、AST各自的最大值记录已经获取,这一步只需要将两者比较取较大的那一个值,即是ALT or AST最大值的记录。
**2.3 Derive maximum for ALT or AST;
data at1;
set adlbhy2;
where paramcd in ("MXRUALT" "MXRUAST") ;
proc sort;
by usubjid subjid aevlintn r2ahi;
run;
data at;
set at1;
by usubjid subjid aevlintn;
if last.aevlintn;
paramcd = "MXRUAT";
run;
data adlbhy3;
set adlbhy2 at;
run;
3.5 Paramcd = "HYLAW"记录的生成
这一部分的记录生成,需要根据每个访视对应的4个指标进行判断,是否同时满足指定的3个条件。
这个过程比最值处理复杂一些,求最值只需要找到对应指标的最大值,本质上是单个指标处理;而Hy's定律的3个判断条件,需要将4个指标整合在一起进行判断。
关键问题是,如何处理使得4个指标可以同时进行判断?在ADLB中,4个指标的记录是按访视纵向排列,SAS中纵向数据处理比较麻烦,考虑将其转置成横向数据进行处理。
**2.4 Derive paramcd = "HYLAW";
proc sort data=adlbhy1 out = hylawl;
by usubjid subjid lbventyp aevlintn avisitn avisit visitnum visit anl01fl;
run;
proc transpose data = hylawl out = hylaw2_r2ahi prefix=r2ahi_;
by usubjid subjid lbventyp aevlintn avisitn avisit visitnum visit anl01fl;
id paramcd;
var r2ahi;
run;
proc transpose data = hylawl out = hylaw2_adt prefix=adt_;
by usubjid subjid lbventyp aevlintn avisitn avisit visitnum visit anl01fl;
id paramcd;
var adt;
run;
proc transpose data = hylawl out = hylaw2_ady prefix=ady_;
by usubjid subjid lbventyp aevlintn avisitn avisit visitnum visit anl01fl;
id paramcd;
var ady;
run;
data hylaw2;
merge hylaw2_r2ahi (drop=_name_ _label_)
hylaw2_adt (drop=_name_ _label_)
hylaw2_ady (drop=_name_ _label_);
by usubjid subjid lbventyp aevlintn avisitn avisit visitnum visit anl01fl;
run;
程序中,转置的By变量组,保留了许多变量。这是因为,Hy's定律的判定需要保留涉及指标的所有记录,这与常规一个AVISIT只取一条记录不同。当前的By变量保证了,转置时对应组别中变量paramcd
无重复值,Transpose过程步正常运行不报错。
程序中除了转置r2ahi
变量,还转置了 adt
、ady
变量。这是因为,对于符合Hy's定律的记录(paramcd="HYLAW"; avalc="Y";
),规定adt
取4个指标中最小的那一个。
同时,为确保指标共同比较具有说服力,规定4个指标的检测时间两两相距不超过7天,程序中需要对此进行判断。
具体程序如下:
data hylaw2;
merge hylaw2_r2ahi (drop=_name_ _label_)
hylaw2_adt (drop=_name_ _label_)
hylaw2_ady (drop=_name_ _label_);
by usubjid subjid lbventyp aevlintn avisitn avisit visitnum visit anl01fl;
adt_y = min (of adt_:);
ady_y = min (of ady_:);
if (r2ahi_sgot>3 or r2ahi_sgpt>3) and r2ahi_bili_tl>2 and r2ahi_alp<2 and
abs(ady_sgot-ady_bili_tl) <=7 and abs(ady_sgpt-ady_bili_tl) <=7 and abs(ady_alp-ady_bili_tl) <=7 and
abs(ady_sgot-ady_alp) <=7 and abs(ady_sgpt-ady_alp) <=7
then hylaw = "Y";
else hylaw = "N";
proc sort;
by usubjid subjid aevlintn;
run;
只要有一条记录满足3个标准,就可以判定该受试者满足Hy's定律。若有多条记录满足,取发生时间最早的那一条。
proc sort data=hylaw2 out=hylaw_y(keep = usubjid subjid aevlintn hylaw adt_y ady_y);
by usubjid subjid aevlintn adt_y;
where hylaw = "Y";
run;
data hylaw_y;
set hylaw_y;
by usubjid subjid aevlintn;
if first.aevlintn;
run;
如果受试者的记录都不满足3个条件,AVALC赋值为“N”,对应的时间变量置空。
data hylaw;
merge hylaw2 (in = a drop=hylaw)
hylaw_y;
by usubjid subjid aevlintn;
if a;
if hylaw ne "Y" then hylaw = "N";
paramcd = "HYLAW" ;
avalc = hylaw;
if hylaw = "Y" then do;
adt = adt_y;
ady = ady_y;
end;
length aevlint $40;
if aevlintn = 0 then aevlint = "BASELINE";
if aevlintn = 1 then do;
aevlintn = 7;
aevlint = "POST-BASELINE WITHIN 7 DAYS";
end;
if hylaw = "N" then call missing (adt, ady, adtm);
keep usubjid subjid aevlintn aevlint paramcd avalc adt ady;
proc sort nodupkey;
by usubjid subjid aevlintn;
run;
paramcd = "HYLAW"
记录生成后与之前生成的5个Paramcd进行拼接,同时对其他变量进行处理。
**2.5 Combine dataset;
data adlbhy4;
set adlbhy3 hylaw;
length param $200 avalcat1 $50;
if paramcd = "MXRUAT" then param = "Maximum Ratio of ULN - Aminotransferase";
else if paramcd = "MXRUALT" then param = "Maximum Ratio of ULN - Alanine Aminotransferase";
else if paramcd = "MXRUAST" then param = "Maximum Ratio of ULN - Aspartate Aminotransferase";
else if paramcd = "MXRUBILI" then param = "Maximum Ratio of ULN - Total Bilirubin";
else if paramcd = "MXRUALP" then param = "Maximum Ratio of ULN - Alkaline Phosphatase";
else if paramcd = "HYLAW" then param = "Total Bilirubin > 2 x ULN and Transaminase > 3 x ULN and Alkaline Phosphatase < 2 x ULN";
keep usubjid subjid paramed adt ady aevlint aevlintn aval avalc ;
proc sort;
by usubjid subjid aevlintn descending paramcd;
run;
部分变量输出如下:
每个受试者在两类访视下的6个Parameter输出完毕,可以基于此数据输出示例Table。
4. Table中的处理
表格中,N为分析人群人数,N1为访视各中分析参数不为空的人数,小n为访视中符合条件的人数。发生率与一般Table不同,为 n/N1。
Hy's定律输出表格本质上是频数汇总表,参考SAS编程-Table:频数汇总表的总结 ,这张表属于第一类——分子为固定类别,编程思路是将多变量条件转化为单变量条件处理。
与常规频数表不同,这里的分母(N1)也是固定类别,做法与小n相同。程序中分别计算小n、N1后,两结果数据集拼接构建所需要的频数百分比样式。
分析数据集处理时,将不同的变量条件转化为一个条件变量catn
。catn
取值可以构建层级(10, 20, 30),对应表格不同部分。首行文字部分可以通过preloadfmt
和multilabel
选项新增汇总行进行占位实现。
这里只展示分析数据的整理,具体频数计算参考频数汇总表的总结。
**2.1 Get data for BigN;
data adsl;
set adam.adsl;
where saffl = "Y";
run;
**2.2 Get data for small n;
data adlbhy_n;
set adam.adlbsum;
if paramcd = "MXRUAT" and aevlint = "BASELINE" and aval > 3 then catn = 11;
if paramcd = "MXRUAT" and aevlint = "POST-BASELINE" and aval > 3 then catn = 12;
if paramcd = "MXRUBILI" and aevlint = "BASELINE" and aval > 3 then catn = 21;
if paramcd = "MXRUBILT" and aevlint = "POST-BASELINE" and aval > 3 then catn = 22;
if paramcd = "HYLAW" and aevlint = "BASELINE" and avalc = "Y" then catn = 31;
if paramcd = "HYLAW" and aevlint = "POST-BASELINE" and avalc = "Y" then catn = 32;
if saffl = "Y" and catn ne .;
proc sort nodupkey;
by usubjid catn;
run;
**2.2 Get data for small N1;
data adlbhy_n1;
set adam.adlbsum;
if paramcd = "MXRUAT" and aevlint = "BASELINE" and aval ne . then catn = 11;
if paramcd = "MXRUAT" and aevlint = "POST-BASELINE" and ne . then catn = 12;
if paramcd = "MXRUBILI" and aevlint = "BASELINE" and ne . then catn = 21;
if paramcd = "MXRUBILI" and aevlint = "POST-BASELINE" and ne . then catn = 22;
if paramcd = "HYLAW" and aevlint = "BASELINE" and avalc ne "" then catn = 31;
if paramcd = "HYLAW" and aevlint = "POST-BASELINE" and avalc ne "" then catn = 32;
if saffl = "Y" and catn ne .;
proc sort nodupkey;
by usubjid catn;
run;
总结
这篇文章介绍了评估药物性肝脏损伤的Hy's定律,以及对应的SDTM、ADaM、Table的处理。其中,ADaM编程会复杂一些,涉及到多个指标转置合并的处理。Table与常规的频数表略有不同,具体编程可参考之前频数汇总表的总结。
感谢阅读, 欢迎关注:SAS茶谈!
若有疑问,欢迎评论交流!