临床试验会针对Efficacy Endpoints进行Efficacy分析,这些分析是针对特定的Efficacy Paramters。纳入Efficacy分析的人群,通常是基线以及基线后至少一次访视值不为空 (With non-missing values at baseline and at least on post-baseine visit)。
在SAP中,分析人群会有明确定义。在ADaM中,会建立特定Flag变量来标识每一个分析人群。例如,Full Analysis Set对应参与随机化或参与入组的人群,对于符合条件的受试者,变量FASFL赋值为“Y”。
1. Efficacy Analysis Flag说明
Efficacy分析是基于Parameter-Level的,即针对受试者的特定Paramter进行。只要特定Paramter满足,基线以及基线后至少一次访视值不为空的条件,就将受试者的这个Paramter纳入分析。对于历时较长或多阶段试验,Efficacy分析可能是分阶段进行。
基线值保存在Base变量中,访视检测值保存在AVAL变量中,只要基线后访视中,有一条记录这两个变量都不为空,即n(base, aval)=2
或者chg ne .
,该受试者的Paramter就满足条件,纳入Efficacy分析。(chg = aval - base)
以一个3期试验举例,该试验主体研究为3年时间,对应的访视值AVISIT为Baeline、Month 12、Month 24、Month 36,对应的AVISITN为0、12、24、36,生成4个Efficacy Flag:
- EFFPFL: Efficacy Parameter-Level Flag
- EPM12FL: Eff Parameter-Level Flag at Month12
- EPM24FL: Eff Parameter-Level Flag at Month24
- EPM36FL: Eff Parameter-Level Flag at Month36
这篇文章介绍两种生成Efficacy Analysis Flag的方法,分别使用Data步和Proc SQL进行实现。
2. 方法1:Data步
获取Efficacy Analysis Flag的整体思路是,在per usubjid per paramcd的维度下,筛选出基线后访视AVAL和BASE值都不为空的记录,将对应的Flag赋值为“Y”,然后再将Flag拼接回原数据集中。
Efficacy分析只会针对特定的Paramter,SAP中会规定好,一般也都有具体条件进行筛选,例如parcat1 = "XXXXX"
,paramcd in ("XX1" "XX2" "XX3")
,举例代码中就不再演示。
Data 步实现的思路是,筛选出符合条件的USUBJID-PARAMCD组合,为其赋上对应的Flag,然后去重,最后拼接回数据集。
演示代码如下:
**effpfl;
data effpfl;
set adxx;
where avisitn > 0 and chg ne.;
effpfl = "Y";
keep usubjid paramcd effpfl;
proc sort nodupkey;
by usubjid paramcd;
run;
**epm12fl;
data epm12fl;
set adxx;
where 0<avisitn<=12 and chg ne.;
epm12fl= "Y";
keep usubjid paramcd epm12fl;
proc sort nodupkey;
by usubjid paramcd;
run;
**epm24fl;
data epm24fl;
set adxx;
where 0<avisitn<=24 and chg ne.;
epm12fl= "Y";
keep usubjid paramcd epm24fl;
proc sort nodupkey;
by usubjid paramcd;
run;
**epm36fl;
data epm24fl;
set adxx;
where 0<avisitn<=36 and chg ne.;
epm36fl= "Y";
keep usubjid paramcd epm36fl;
proc sort nodupkey;
by usubjid paramcd;
run;
**Combine flags above;
data adxx1;
merge adxx effpfl epm12fl epm24fl epm36fl;
by usubjid paramcd;
run;
整个过程,看起来长了些,但是条理清晰,容易理解。
3. 方法2:Proc SQL
获取Efficacy Analysis Flag的整体思路肯定不会变,但是基于自身语法的特性,SQL实现起来比较简洁。
主体程序依旧是左拼接,只不过各个Flag的生成聚合在子查询中,通过group by
以及聚合函数max
实现了去重的功能。
proc sql noprint;
create table adxx2 as
select a.*, b.effpfl, b.epm12fl, b.epm24fl, b.epm36fl
from adxx as a
left join
(
select usubjid, paramcd, "Y" as effpfl,
max(case when avisitn<=3012 then "Y" else " " end) as epm12fl,
max(case when avisitn<=3024 then "Y" else " " end) as epm24fl,
max(case when avisitn<=3036 then "Y" else " " end) as epm36fl
from adxx
where avisitn > 0 and chg ne.
group by usubjid, paramcd
) as b
on a.usubjid = b. usubjid and a.paramcd = b.paramcd
group by a.usubjid, a.paramcd, a.avisitn
;
quit;
若只生成EFFPFL变量,子查询中需添加distinct
选项去重。因为对于保留下来的EFFPFL记录,值都为“Y”,聚合函数会直接保留 1条记录,没有聚合函数,就需要添加去重选项。
SQL程序,浓缩简洁,易读性上差了点。
这里注意一个小点,这个点不常遇到,SQL拼接生成新变量时,新变量名不能在原数据中存在,如果存在会造成赋值失败。
总结
文章介绍了Efficacy Analysis Flag,以及对应的两种生成方式——Data步和Proc SQL。两种方法,各有特点,编程时按自己喜好使用。
感谢阅读, 欢迎关注!
若有疑问,欢迎评论交流!