SAS编程-Table:受试者处置中止理由频数汇总

1. 具体实例

T14-1.1
1.1 Table内容

受试者处置信息汇总表,这是张频数汇总表。Table的纵向是试验组的信息,横向是具体的处置信息。这张Table的主体分为两部分,第一部分是试验用药的完成信息,第二部分是研究完成信息

在SDTM中,受试者处置信息保存在DS数据集中;基于分析需求,这一部分内容又做到了ADSL里。

这个项目在设计ADSL变量时,有一点不合理。通常,对于多阶段用药的试验,设计变量名时才会添加序号后缀。这个1期试验不涉及多阶段用药,“EOT01”当初应改为“EOT”比较好。

在SDTMIG v3.3中,在DSCAT="DISPOSITION EVENT"情况下,对应的DSSCAT变量给了两个参考值: "STUDY TREATMENT","STUDY PARTICIPATION"。这两个值就是对应,给药完成情况和试验完成情况。有的公司--SCAT的取值参考CRF Form名称,因此DSSCAT对应值,也可能是"END OF STUDY", "END OF TREATMENT",具体要看公司的要求。

1.2 人群说明

在Table的Title会有人群描述,这一张对应的是Full Analhysis Set。SAP中一般具体的分析人群有说明,同时也会描述对应的试验分组。

对于Full Analysis Set,一般包括所有参与随机化的受试者,对于没有随机化的试验,一般是指入组的受试者。对于Full Analyssi Set,分析基于受试者的计划分组,不管受试者实际用药情况,即分组变量选择trtp

对于Safety Analysis Set,一般包括接受至少1次给药的随机化人群。对于Safety Analysis Set,分析基于受试者的实际用药情况,即分组变量选择trta

2. SAS编程

首先,先贴一下,我的QC“5段论”:

***1. Create formats for output;
***2. Get data for analysis;
***3. Calculate statistics;
***4. Create dataset for QC;
***5. Compare;

2.1 用于Preloadfmt选项的试验组变量Format

这是一个Ongoing的1期剂量扩大试验,计划有6个试验组,目前数据中只有前4个试验组的信息。缺失组别的内容,我会使用Means过程步中的preloadfmt选项补充缺失组别的信息,具体参考SAS编程:频数汇总时如何处理分析分组种类不全的情况?

Shell中要求这张Table有汇总组(Total),这个我会采用Format过程步中multilabel选项进行实现,具体内容可以参考SAS编程:生成Table时,汇总组(Total)组如何处理?

基于上面两点考虑,部分Format可以这样设置:

***1. Craete Formats for output;
proc format;
  value trt01pn(notsorted multilabel)
    1 = 1
    2 = 2
    3 = 3
    4 = 4
    5 = 5
    6 = 6
    1-6 = 99 /*For total*/
  ;
run;
2.2 用于计算BigN的数据

剩下的Format暂时不明确,先继续往下写,获取分析数据。用于计算BigN的数据,比较简单,直接筛选人群:

***2. Get data for analysis;

**2.1 Get data for BigN;
data adsl;
  set adam.adsl;
  where fasfl = "Y";

  *flag for count;
  flag = 1;
run;
2.3 用于计算小n的数据

获取用于计算小n的数据,就需要提前规划一下。因为涉及到不同的变量、不同的条件,而且具体条数也有很大可能为空,处理方法也通常为2种。第一,每个条目单独计算生成;第二,新建一个新变量,将所有条目条件汇总到一个变量上

第一种方法,通常会写个宏,每个条目都用宏处理,然后将结果竖向拼接在一起。

第二种方法,是需要新生成记录数。由于涉及到多个变量,这就不能使用multilabel进行生成新组,只能使用Data步中的Output语句。

也可以从另一个角度理解,多个变量说明分组变量条件在多个列,multilabel选项只能在单列内进行处理操作。理论上,多个列也是可以通过Transpose来转化为单列进行操作,但是基于这个示例,转置比较复杂,不再进一步探讨。

我采用第二种方法进行演示。

2.4 汇总变量的考虑

将这些条目的条件汇总到一个变量中,通常用带有顺序的数值变量来表示。这个数值变量也不是简单的递增序列,可以根据输出内容的层级进行构建分级

例如,这张Table有两部分,每个部分各有三个层级,可以使用3位整数,按如下顺序进行构建。这样处理,排列顺序、层级结构一目了然。

Catn

对于100-140、200-220的条目,每一个都有明确的条件,可以直接建立。而对于具体的中止理由,这一块通常在做ADaM时,会根据TFLShell的位置信息为变量做一个顺序变量,例如EOSN、EOTN,直接引用对应的数字就好。这类似与Parcat1n、Paramn,方便Table的输出。

很可惜,这个项目没有对应的数字描述。于是,我只能通过查看Define文件中的CT值来构建这个汇总变量。这里需要注意一点,SDTM为了符合CDISC的CT标准,都会尽量将编码值设置为与标准CT一致,但TFL输出可能与标准CT值不同,所以需要处理。这可以在ADaM中处理,也可以在TFL编程中进行处理

编号100和200,是不需要计数的,但可以先随意附上一个条件参与计数,在Final数据集中再将计数置空。这样可以不用额外构建对应的数据集。

**2.2 Get data for small n; 
data adsl_n;
  set adsl;

  *EOT;
  if 1 then do; catn = 100; output; end;
  if tr01sdtc = "" then do; catn = 110; output; end; 
  if tr01sdtc ne "" then do; catn = 120; output; end;
  if eot01 = "COMPLETED" then do; catn = 130; output; end; 
  if eot01 ne "COMPLETED" then do; catn = 140; output; end;
  if eot01 = "INELIGIBILITY DETERMINED" then do; catn = 141; output; end; 
  if eot01 = "PROTOCOL DEVIATION" then do; catn = 142; output; end;
  if eot01 ="NON-COMPLIANCE WITH STUDY DRUG" then do; catn = 143; output; end; 
  if eot01 = "ADVERSE EVENT" then do; catn = 144; output; end;
  if eot01 = "WITHDRAWAL BY SUBJECT" then do; catn = 145; output; end; 
  if eot01 ="PROGRESSIVE DISEASE" then do; catn = 146; output; end; 
  if eot01 ="DECISION BY SPONSOR" then do; catn = 147; output; end; 
  if eot01 = "LOST TO FOLLOW-UP" then do; catn = 148; output; end; 
  if eot01 ="DEATH" then do; catn = 149; output; end;
  if eot01 = "REOUIREMENT FOR ALTERNATIVE THERAPY" then do; catn = 150; output; end;
  if eot01 ="PROTOCOL-SPECIFIED WITHDRAWAL CRITERION MET" then do; catn = 151; output; end;
  if eot01 = "PREGNANCY" then do; catn = 152; output; end;
  if eot01 = "REIMBURSEMENT" then do; catn = 153; output; end; 
  if eot01 = "OTHER" then do; catn = 154; output; end;

  *EOS;
  if 1 then do; catn = 200; output; end;
  if eos = "COMPLETED" then do; catn = 210; output; end; 
  if eos ne "COMPLETED" then do; catn = 220; output; end;
  if eos = "PROTOCOL-SPECIFIED WITHDRAWAL CRITERION MET" then do; catn = 221; output; end;
  if eos ="WITHDRAWAL OF CONSENT FROM STUDY" then do; catn = 222; output; end; 
  if eos ="DECISION BY SPONSOR" then do; catn = 223; output; end; 
  if eos ="LOST TO FOLLOW-UP" then do; catn = 224; output; end; if eos = "DEATH" then do; catn = 225; output; end; 
run;
2.5 分类变量各条目Format的建立

小n数据集整理完毕后,就可以建立preloadfmt选项对应的catn的Format,以及最后的展示Shell中内容的format。

***1. Craete Formats for output;
proc format;
  value catn 
  100=100
  110=110
  120=120
  130=130
  140=140
  141=141
  142=142
  143=143
  144=144
  145=145
  146=146
  147=147
  148=148
  149=149
  150=150
  151=151
  152=152
  153=153
  154=154
  200=200
  210=210
  220=220
  221=221
  222=222
  223=223
  224=224
  225=225
;

value cat
 100 = "Investigational product accounting"
 110 = "Subjects who never received investigational product"
 120 = "Subjects who received investigational product"
 130 = "Subjects who completed investigational product"
 140 = "Subjects who discontinued investigational product"
 141 = "Ineligibility determined"
 142 = "Protocol deviation"
 143 = "Noncompliance"
 144 = "Adverse event"
 145 = "subiect request"
 146 = "Disease progression"
 147 = "Decision by sponsor"
 148 = "Lost to follow-up"
 149 = "Death"
 150 = "Requirement for alternative therapy"
 151 = "Protocol-specified criteria"
 152 = "Pregnancy"
 153 ="Reimbursement"
 154 = "other"
 200 = "study completion accounting"
 210 = "Subiects who completed study"
 220 = "Subjects who discontinued study"
 221 = "Protocol-specfied criteria"
 222 = "withdrawal of consent from study"
 223 = "Decision by sponsor"
 224 = "Lost to follow-up"
 225 = "Death"
run;
2.6 BigN的获取

用于分析的数据、对应的格式整理完毕后,就可以开始统计量的计算。先计算BigN。

在Means过程步中使用preloadfmt选项,需要提前给对应的变量设置Format。设置试验组Format时,还使用了multilabel选项,要发挥其作用,class语句中还需要添加mlf。BigN结果中会有汇总组出现。

BigN保存到宏变量之后,我习惯把宏变量的结果输出到数据集中,方便后续比较查看。

***3. Calculate statistics;

**3.1 Derive BigN and save them to macro vars; 
proc means data =adsl nway completetypes;
  format trt01pn trt01pn.;
  class trt01pn / preloadfmt mlf order = data; 
  var flag;
  output n = bign nmiss = nmiss out = BigN; 
run;

data _null_;
  set BigN;
  call symputx("N_"||strip(trt01pn), put(bign,best.)); 
run;

data check_bign;
  set sashelp.vmacro;
  where index(name, "N_") and length(name)<=6;
  keep name value; 
run;
2.7 小n以及百分比的获取

小n频数的获取,需要考虑分类维度。第1个,是试验组trt01pn;第2个,新建的条目分类catn变量。

因为,要保证所有分类的完整,这里对2个分类变量都要使用preloadfmt的选项分2个Class语句进行设置

BigN直接通过数据集拼接获取,这个比直接调用对应的宏变量要方便。

**3.2 Calculate small n and percentage;

*Get small n;
proc means data = adsl_n nway completetypes;
  format trt01pn trt01pn.;
  class trt01pn / preloadfmt mlf order = data;

  format catn catn.;
  class catn / preloadfmt order = data;

  var flag;
  output n = count nmiss = nmiss out = count1; 
run;

*Get percentage; 
data count2;
  merge count1 bign; 
  by trt01pn;
  length freq $200;
  if bign ne 0 then freq = strip(put(count,best.))||" ("||strip(put(count/bigN*100,8.1)) ||")";
  else freq = "0 (-)";

  proc sort;
    by catn trt01pn;
run;

*Transpose results;
proc transpose data = count2 out = count3 prefix= trt_ ;
  by catn; 
  var freq; 
  id trt01pn; 
run;

这张Table的主体部分就是这些,后续的处理就不再介绍了。

总结

这张表介绍了对于多条目Table的处理,通过新建一个变量汇总所有条件进行处理。为处理缺失组别以及Catn变量条目的完整,使用了Means过程步的preloadfmt选项。使用Format中的Multilabel选项构建汇总组。

新数值变量的构建,使用3位整数,用于体现Table条目的层级关系。

感谢阅读!若有疑问,欢迎评论区交流!

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

推荐阅读更多精彩内容