关于SDTM编程的一些想法(1) --Trial Design、
根据SDTM IG,SDTM数据集共分为三大类:Special-Purpose,General Observation,Trial Design。我们熟知的Interventions、Events、Findings、Findings About,是General Observation之下的子类别。既然是划分为各个类别,每个类别中的必然有其相似性,不同类别之间必然有其特殊性。考虑到这种情况,我就从SDTM数据集的分类角度,谈一谈我对SDTM编程步骤的一些想法。
一般步骤
从一般性角度来看,SDTM数据集编程,必然涉及到以下这3个步骤:
- 获取原始数据;
- 生成变量;
- 输出数据集。
前两个步骤是我们SDTM SAS编程的主体,绝大部分的编程时间集中在这两步。对于第3步,一般都会有相应的SAS宏程序读取SDTM说明文档的信息,完成对数据集以及变量的属性设置;如果没有相应的宏程序,那只能手动编程进行设置,很简单,只是过程有些繁琐。
分享一个手动设置变量属性的代码,其中的label、length的内容其实是从SDTM说明文档中直接复制的。宏变量keepvars
、sortvars
, 是在程序开始就手动定义好的。一般各个公司都有处理这一块内容的宏程序,以后会在其他文章中分享宏程序处理这部分内容的逻辑。
***Finalize dataset;
data sdtm.dm(encoding="asciiany");
attrib
STUDYID label="Study Identifier" length=$20
DOMAIN label="Domain Abbreviation" length=$2
USUBJID label="Unique Subject Identifier" length=$30
SUBJID label="Unique Subject Identifier" length=$10
RFSTDTC label="Subject Reference Start Date/Time" length=$20
RFENDTC label="Subject Reference End Date/Time" length=$20
RFXSTDTC label="Date/Time of First Study Treatment" length=$20
RFXENDTC label="Date/Time of Last Study Treatment" length=$20
RFICDTC label="Date/Time of Informed Consent" length=$20
DTHDTC label="Date/Time of Death" length=$20
DTHFL label="Subject Death Flag" length=$1
SITEID label="Study Site Identifier" length=$10
BRTHDTC label="Date/Time of Birth" length=$20
AGE label="Date/Time of Birth"
AGEU label="Age Units" length=$10
SEX label="Sex" length=$6
RACE label="Race" length=$10
RACEOTH label="Race, Other" length=$50
ARMCD label="Planned Arm Code" length=$8
ARM label="Description of Planned Arm" length=$40
ACTARMCD label="Actual Arm Code" length=$8
ACTARM label="Description of Actual Arm" length=$40
COUNTRY label="Country" length=$10
;
set dm2 ;
keep &keepvars.;
proc sort;
by &sortvars.;
run;
Trial Design数据集
试验设计数据集的内容一般直接来自Protocol,数据集的完整变量信息会保存到特定的EXCEL文件中,SAS编程时直接读取EXCEL文件,设置下格式就可以直接输出试验设计数据集。以某个项目中的TE为例,EXCEL文件中的内容,就是输出数据集中的内容。
TESpecial-Purpose数据集
特殊目的类主要有4个数据集:DM、SV、SE和CO。
DM
先介绍DM的编程思路,我一般将DM变量分为以下几类,在编程过程中集中处理同一类变量。
- 人口学信息相关变量 (AGE、SEX、RACE、ETHNIC、BRTHDTC、COUNTRY)
- 给药时间相关变量 (RFXSTDTC、RFXENDTC)
- 试验处置相关变量 (RFICDTC、DTHDTC)
- 研究地区或研究者相关变量 (SITEID、INVID、INVNAM)
- 受试者分组相关变量 (ARM、ARMCD、ACTARM、ACTARMCD)
- 参照时间相关变量 (RFSTDTC、RFENDTC、RFPENDTC)
人口学信息相关变量
人口学相关变量的原始信息通常来源于CRF中Demographics页,直接引用原始变量值,就可以完成变量的生成。
给药时间相关变量
研究治疗的首次、末次时间(RFXSTDTC、RFXENDTC),来源于CRF中Investigtional Product Administration页。这里于人口学变量直接引用原始值不同,这两个变量需要对治疗时间进行排序,筛选出最早或最迟时间进行赋值。
试验处置相关变量
知情同意签署时间(RFICDTC)信息一般来源于CRF中的Subject Enrollment页,这一页的信息也会保存到DS数据集中的PROTOCOL MILESTONE
的类别中。死亡时间(DTHDTC)信息的来源一般有两个CRF页:Adverse Event 和 End of Study,这两页中会有死亡相关信息的记录,编程时引用这个原始数据集的变量。
研究地区或研究者相关变量
研究地区或研究者相关变量信息,一般原始数据中会提供,根据数据集中的关键变量进行拼接(例如,SITEID)就可获取。
受试者分组相关变量
受试者分组相关变量,分为两部分:计划分组(ARM、ARMCD) 和实际分组(ACTARM、ACTARMCD)。计划分组的信息通常会来源于CRF中 Enrollment页,例如,Cohort信息;或者是Vendor提供的针对每个受试者分组信息的特定数据集,计划分组信息在受试者入组时确定。
实际分组信息是根据受试者实际用药情况进行判定的,而实际用药信息来源于CRF中Investigtional Product Administration页。在生成实际分组变量时,要考虑一些特殊情况。对绝大多数受试者来讲,计划分组和实际分组是一致的。但也有部分受试者由于各种原因,误服了其他计划药物(与计划分组不一致) 、服用试验计划外药物(ACTARM=“Unplanned Treatment”) 或者未服药(ACTARM=“Not Treated”)。这些情况,在实际编程过程中要具体处理。
参照时间相关变量
参照开始时间(RFSTDTC),通常为第一次给药时间(RFXSTDTC)。若首次给药时间为空,一般会用受试者进行随机化的时间进行替代。对于所有参与随机化的受试者,RFSTDTC不能为空;若受试者筛选失败或未分组,RFSTDTC为空。
参照结束时间(RFENDTC),通常为研究结束时间,这个信息来源与CRF中End of Study页;也常等于受试者最后一次给药时间。对于所有参与随机化的受试者,RFSTDTC不能为空;若受试者筛选失败或未分组,RFSTDTC为空。
参与结束时间(RFPENDTC),方案中定义的受试者结束参与或结束随访的时间,对应最后一次接触受试者的时间。这个变量的编程过程,相对复杂一点。我们需要将受试者所有活动的时间整理到一个数据集中,排序选出最晚的那一个时间进行赋值。这过程中有两个注意点,第一,关于受试者的“所有活动”不能有遗漏,否则丢失的那个时间可能恰好是RFPENDTC;第二,保存受试者各项活动信息的数据集收集的时间变量的格式可能不同,在编程过程中需要转换成相同的格式,进行排序筛选。
以上是SDTM数据集编程时的一些想法,后面会持续更新。
若有疑问,欢迎评论区讨论!