CDISC 标准(三)——SDTM 标准初试

总结

  • 第一次尝试仔细阅读 SDTM IG 文件中的一个 domain 变量信息;
  • 通过 SAS 代码初试按照 SDTM 标准输出标准化的数据集。

本章要开始使用 SAS,并结合 SDTM 标准,看看如何让目标数据集符合 IG 文件里面的标准。

使用的目标 Domain 是 IG 文件 64-65 页介绍的,最重要的 Domain 之一—— DM Domain,具体变量说明表如下:

Snipaste_2023-04-30_22-57-38.png

DM 是 Demographics 的缩写,代表人口统计学信息。所有人类参与的临床实验都需要 DM Domain,内容包括实验参与者的年龄、性别、种族、国籍、实验分组、实验开始日期和结束日期等等等等数据

DM 数据集往往是接手某个项目最先阅读的数据集,可以查看和了解参与实验的患者的所有信息。在临床实验中,有几个患者参与,那么 DM 数据集中就需要包括几条观测数据。比如,有 10 名患者参与了临床实验,收集了原始数据,那么 DM Domain 中就应该包括 5 条观测。

接下来就是初学 SDTM 标准的学习方法:仔细阅读 SDTM IG 文件中对于每一条变量的说明,并且按照对应的要求,在 SAS 中处理数据集。处理过程中,需要注意以下几个重点:

  • 注意每一条变量的 Type,字符型或者数值型,一定要在 SAS 中按照对应的格式存储,不符合的需要进行转换(INPUT 或者 PUT);
  • 日期型的变量一定要注意按照规定的 ISO8601 格式
  • 变量顺序和变量的 Label 要按照表中规定的要求;
  • 多多检查。

从 SDTM IG 表慢慢看起:

  • STUDYID:实验的编号,每个临床实验都有的唯一编号;
  • DOMAIN:固定取值 DM;
  • USUBJID:患者的唯一编号,Notes 里写明了格式为 STUDYID-SITEID-SUBJID;
  • RFSTDTC、RFENDTC:实验开始和结束的时间;在一些药物实验中,往往将患者第一次吃药作为实验开始的时间,将患者最后一次吃药为实验结束的时间;
  • RFICDTC:介绍里是“date/time of informed consent”,代表患者正式签署或者参与临床实验协议的时间,往往也是收集到的第一个日期;
  • RFPENDTC:参与的最后一个日期,往往是实验结束后跟踪随访的最后一次日期;如果患者出现失联或者去世等失访的情况,那就是失访前最后一次联系的日期;
  • DTHDTC、DTHFL:和患者死亡相关,如果有死亡的患者,记录死亡的日期和 FLAG = Y;
  • SITEID:研究站点/中心的编号;
  • INVID、INVNAM:调查研究者的编号和名称;
  • BIRTHDTC:患者的出生日期;
  • AGE、AGEU:患者的年龄和年龄的单位(一般取值 YEARS);
  • SEX 为性别,取值为 M 或 F;
  • RACE、ETHIC:种族 / 是否为拉丁裔或者西班牙裔;
  • ARMCD、ARM:计划的患者分组以及对应的描述;
  • ACTARMCD、ACTARM:实际的实验分组以及对应的描述,根据实验要求可能不一样,需要仔细阅读 SAP 来决定;
  • COUNTRY:国籍,要求里写明要遵守国际标准 ISO 3166-1,比如中国采用名称 CHN;
  • DMDTC、DMDY:DM 数据是在什么日期收集的,距离实验开始有多少天。

接下来给出部分的进行 SDTM 标准的 SAS 代码:

libname learn "D:\CDISC标准\raw_data_files\";

* 完成 STUDYID, DOMAIN, USUBJID, SUBJID 的设置;
data dm1;
  set learn.dmmr;
  length studyid $10.;
  studyid = 'XYZ-001';
  domain = 'DM';
  usubjid = strip(studyid) || '-' || strip(subject);
  subjid = subject;
run;

* 完成 RFSTDTC RFENDTC 的设置;
data ex;
  set learn.exto;
  exdtc = put(input(compress(reportdt), date9.), yymmdd10.);
run;
proc sort data=ex;
  by subject exdtc;
run;

data ex1 ex2;
  set ex;
  by subject;
  if first.subject then output ex1;
  if last.subject then output ex2;
run;

data dm2;
  merge dm1 ex1(keep=subject exdtc rename=(exdtc=rfstdtc))
              ex2(keep=subject exdtc rename=(exdtc=rfendtc));
  by subject;
run;

* 完成 DTHDTC, DTHFL 的设定;
data dth1;
  set learn.dth;
  dthdtc = put(input(compress(dthdat_raw), date9.), yymmdd10.);
  dthfl = 'Y';
  keep subject dthdtc dthfl;
run;

* 完成 SITEID, BRTHDTC, AGE, AGEU, SEX, RACE, ARM, ARMCD, ACTARM, ACTARMCD, COUNTRY 的设定;
data dm3;
  merge dm2(drop=siteid) dth1;
  by subject;
  *siteid = substr(subject, 1, 4);
  siteid = scan(subject, 1, '-');
  brthdtc = strip(put(brthdat_yyyy, best.)) ||'-'|| strip(put(brthdat_mm, z2.)) ||'-'|| strip(put(brthdat_dd, z2.));
  age =.;age_raw='';
  age = int((input(rfstdtc, yymmdd10.)-input(brthdtc, yymmdd10.)) / 365.25);
  ageu = 'YEARS';
  sex = substr(sex, 1, 1);
    length race $50;
  if american_indian = 1 then race = 'American Indian';
  if asian=1 then race = 'Asian';
  if black = 1 then race = 'Black';
  if naticve_hawaiian = 1 then race = 'Native Hawaiian';
  if white = 1 then race = 'White';
  if other = 1 then race = 'Other';
  
  length arm $20 armcd $8 actarm $20 actarmcd $8;
  if substr(siteid, 1, 1) eq '1' then do;
    arm = 'Treatment';
    armcd = 'TRT';
  end;
  else if substr(siteid, 1, 1) eq '3' then do;
    arm = 'Placebo';
    armcd = 'PLA';
  end;
  actarm = arm;
  actarmcd = armcd;

  COUNTRY = 'CHN';

run;

* 规范 VARIABLE LABEL 以及变量顺序;
data dm4;
  retain studyid domain usubjid subjid ......;
  set dm3;
  label  studyid="Study Identifier";
       domain="Domain Abbreviation";
  ......