临床试验:评估肝脏损伤的Hy's定律

欢迎关注,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个要点:

  1. 药物引起地肝细胞损伤,通常表现在ALT(谷丙转氨酶)AST(谷草转氨酶)上,检测值高达正常值上限的3倍以上;
  2. 在这些转氨酶升高的受试者中,某些患者还会伴有TBL(总胆红素)大于正常值上限的2倍以上,但是早期未出现胆汁淤积(ALP(碱性磷酸酶) 不增高);
  3. 转氨酶总胆红素同时升高,但原因不明,比如已经排除甲、乙、丙型肝炎、其他原有的肝脏疾病以及其他能药物引起的肝损伤。

研究表明,对于满足以上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 Law

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 Terminology 2022-03-25

这些指标都保存在SDTM.LB中,与LB其他指标相比,没什么特别,无需额外处理。

3. ADaM中的处理

对于ADaM,通常会新建一个数据集用于保存Hy's 定律相关记录,与ADLB进行区分,例如,ADLBHY。所需数据直接从ADLB中获取,对应主题变量paramcd = "HYLAW" 。当受试者记录同时满足以下3个条件时,avalc = "Y";反之,avalc = "N"

  1. ALT or AST >3xULN
  2. TBL >2xULN
  3. 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变量,还转置了 adtady变量。这是因为,对于符合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中的处理

Hy's Law

表格中,N为分析人群人数,N1为访视各中分析参数不为空的人数,小n为访视中符合条件的人数。发生率与一般Table不同,为 n/N1。

Hy's定律输出表格本质上是频数汇总表,参考SAS编程-Table:频数汇总表的总结 ,这张表属于第一类——分子为固定类别,编程思路是将多变量条件转化为单变量条件处理

与常规频数表不同,这里的分母(N1)也是固定类别,做法与小n相同。程序中分别计算小n、N1后,两结果数据集拼接构建所需要的频数百分比样式。

分析数据集处理时,将不同的变量条件转化为一个条件变量catncatn取值可以构建层级(10, 20, 30),对应表格不同部分。首行文字部分可以通过preloadfmtmultilabel选项新增汇总行进行占位实现。

这里只展示分析数据的整理,具体频数计算参考频数汇总表的总结。

**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茶谈!
若有疑问,欢迎评论交流!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342