东南大学公共卫生学院流行病与卫生统计学系(210009) 潘俊霞 王诗远 杨嘉莹 罗 栎 刘 沛
疫苗临床试验中,为了保证数据的准确性和完整性,在统计分析前需进行盲态核查。但盲态核查工作量较大,单纯人工操作耗费大量人力和时间,还会核查不全面,导致数据质量低,统计结果遭受质疑。SAS因其强大功能为解决这些问题提供了有力工具。SAS宏程序的使用能将程序编得更高效且便于维护,重复执行SAS程序明显提高了工作效率和质量[1]。利用在SAS中调用excel参数表的方式实现盲态核查批量操作,再利用SAS/AF(applications facility,AF)模块将复杂代码屏蔽而仅通过界面点击式操作实现盲态核查结果自动化输出,降低SAS使用门槛,规范且高效完成盲态核查工作。本文以开发疫苗临床试验盲态核查自动化输出软件为例,运用SAS 9.4中的AF模块结合SAS宏程序构建特定功能的AF界面,从而实现盲态核查结果可视化自动化输出。
在疫苗临床试验中,需要核查的内容多且繁琐,根据数据库中变量类型将可能出现的问题归纳为三大类,分别是单变量核查(缺失值、极端值和重复值等)、多变量逻辑核查(入选排除标准、年龄分组、是否超窗、变量前后信息是否匹配等)和汇总变量核查(合并用药、合并疫苗、不良反应等)。根据数据库中变量类型及可能出现的问题,我们设计出4个主要的SAS宏程序以实现上述盲态核查过程。分别是纵向列表变量转置成横向数据的宏程序,单变量核查宏程序,多变量逻辑核查宏程序和汇总变量核查宏程序,依次为% TransForm( )、% SingleVar()、% Logic( )和% IndexCheck( ),当然此处4个宏里面还套用了其他宏程序,此处不再赘述。
SAS 宏利用%macro开始一个宏,同时给出这个宏的名字,如:%macro SingleVar;用%mend 语句结束一个宏,其后给出宏的名字,如%mend SingleVar。调用这个宏只需要用%SingleVar()语句,括号内的变量称为宏参数,可在调用宏时指定参数值[2-3]。而为了实现上述宏程序且便于批量对宏参数进行赋值,可以在SAS中利用其与excel的结合,将宏参数写入excel中并在调用时对其赋值,该过程主要可通过在SAS中使用以下X命令来实现:
OPTIONS XWAIT XSYNC;
X "&ParOut..xlsx";
OPTIONS NOXWAIT NOXSYNC;
OPTIONS后的选项XWAIT 表示在执行时保持DOS命令窗口打开,NOXWAIT 则表示关闭DOS窗口;XSYNC表示在外部应用excel执行完之后再返回SAS中,NOXSYNC则表示外部应用执行完后不返回SAS。上述语句的主要功能是在SAS运行过程中打开&ParOut.位置下的excel参数表,在excel中填写完相应参数值,然后关闭excel继续回到SAS中运行后续程序。此法能实现SAS与excel的无缝衔接,更是实现盲态核查结果自动化、批量输出的关键。
SAS/AF模块是SAS母体下一个可用于实现可视化过程的工具。利用SAS/AF中框架(frame)可以对显示界面进行控制,利用SCL语言(SAS component language/SAS screen control language,SCL)则可对界面的性质以及运行过程进行控制[4]。当然配合SAS宏程序的使用可以使AF界面实现更多功能,比如可以将上述宏程序整合到AF界面中,制作一个用于盲态核查的完整界面,以实现无需复杂编程,只点击屏幕和填写excel参数表即可实现盲态核查结果自动化和可视化输出的功能[5]。
为了对某流感疫苗临床试验数据进行盲态核查,该项目入组2400人,其中3岁以下年龄组1200人,3岁以上年龄组1200人;包含2个CRF库,其中3岁以下组包含930个变量(2针次),3岁以上组包含551个变量(1针次),变量又分成各种类型,主要包含基本信息、访视信息、汇总信息。如果手工编程进行核查需要对上千个变量进行单独的核查,其工作量和复杂程度不言而喻。为了对上述项目进行盲态核查并使其结果能自动化和可视化输出,可在本软件中执行如下步骤:(1)标准化数据入口,(2)纵向列表变量转置,(3)单变量核查,(4)多变量核查(包含汇总变量核查),(5)盲态核查结果报告。具体过程是先对从Epidata或EDC中导出的数据进行变量名、变量标签和值标签的标准化,并对纵向列表变量数据(主要指不良反应、合并用药、合并疫苗等信息)进行转置,继而对完整数据库进行单变量、多变量、汇总变量的核查,最后将所有的核查结果进行汇总以excel和RTF格式输出询问表和盲态核查报告。受篇幅所限,此处仅以横向数据结果输出界面为例说明SAS/AF与SAS宏的结合使用。
图1 疫苗临床试验盲态核查软件结果输出界面
由于目前处于EDC系统和Epidata数据库都在使用的阶段,图1所示横向数据界面代表Epidata数据库,我们也另外设计了纵向数据的界面以适用EDC系统的数据,此处不再赘述。图1所示界面运行过程是通过左上方的下拉菜单可以选择核查次数和病例报告表(case report form,CRF)的具体值,接下来选择项目名称后点击选中按钮可在选择已有数据集栏中显示前面核查界面该项目中产生的所有核查结果数据集,选择某个数据集如:Checkr.Missing后点击查看按钮可以在右侧视窗中查看该次核查出现的缺失值的问题,受页面限制,仅显示了一半,可水平和竖直滑动视窗进行结果查看。随后点击报告可在规定的路径下产生上述单变量、逻辑核查及汇总变量核查有问题的RTF文件,点击下一步可以将这些RTF单表合并成一份盲态核查报告,而点击询问表则可以产生名为询问表的excel文件,如图2所示。部分实现程序如下:
Check:
if display2.selectedItem ne "" then do;
displayTable=display2.selectedItem;
end;
sasdataset1.table=displayTable;
return;
/*以上程序是查看按钮的SCL语言,把用户选择的已有数据集中的某个数据集赋值displayTable并在右侧视窗中查看该数据集*/
Quetable:
submit continue;
%ResultOutput(ParOut=%str(&ROOT.casefile&casenameoutput&cs),type=excel);
endsubmit;
return;
以上程序是询问表按钮的SCL语言,它将宏%ResultOutput()写进submit continue和endsubmit之间即可在SCL中调用SAS宏,以实现SCL功能的拓展。(宏里面type如选择word可输出RTF格式的结果)。
图2 盲态核查结果显示(节选)
目前已有学者发表过临床试验盲态核查的操作过程与常用的SAS宏程序等文章,研究表明盲态核查工作量大,通过SAS宏程序可提高工作质量和效率[1,6]。本文提出的按照变量类型开展盲态核查的方法与既往报道的研究思路不同。本文不仅限于介绍SAS宏程序的应用,还注重SAS与excel结合实现盲态核查结果自动化、批量输出以及SAS/AF模块与SAS宏结合实现可视化呈现的效果,从而在保证核查规范和提高核查效率的前提下,降低SAS使用门槛。对于不熟悉SAS编程或者希望较快进行核查的实际工作者,可通过界面引导快捷方便地使用本软件,由此可见该软件具有实际应用价值。
在SAS/AF模块显示出其在SAS中的各种优势之后,目前国内对其研究依旧较少。可能的原因是它仍存在着画面不够优美等瑕疵使得人们更喜欢用VB或者java等软件制作界面。不过对于进行临床试验的统计工作人员而言,实用较美观更为重要,因此SAS/AF模块更值得推崇。一是它与SAS宏程序是无缝连接,软件出现故障(BUG)的概率小;二是它属于SAS组件,因此对了解SAS者,相较于学习一种新的编程语言,SAS/AF的学习时间更短、更容易掌握。