临床试验中定性指标统计分析报表的SAS宏实现
2017-11-07孙瑞华郭锐敏虞康达吴婉玲王雨萌
徐 凯 孙瑞华 李 欢 郭锐敏 肖 畅 虞康达 吴婉玲 黄 傲 王雨萌
1.北京中医药大学管理学院(100029)
2.中日友好医院科研处
△通信作者:孙瑞华,E-mail:sunruihua@263.net126.com
·计算机应用·
临床试验中定性指标统计分析报表的SAS宏实现
徐 凯1孙瑞华2△李 欢1郭锐敏1肖 畅1虞康达1吴婉玲1黄 傲1王雨萌1
SAS软件是业界公认的一款统计分析软件,在临床试验的统计分析中应用十分广泛。应用其强大的宏程序功能,可以高效快捷地实现报表的自动化输出,使统计结果直接生成Word统计报表,避免了以往手工粘贴统计结果出现错误的问题[1-2]。根据统计分析报告中常用的格式,本文将编写一套较为通用的定性指标(结果变量有序或者无序)的统计分析SAS宏程序。
资料与统计方法
根据统计学原理,常用频数、百分比/构成比等指标对计数资料进行统计学描述。统计分析时,需根据资料是否有序,合理选择统计分析方法。成组设计的列联表资料,结果变量为无序时,组间比较需选用卡方检验,若样本例数<40或理论频数<5时则采用Fisher精确概率法;结果变量为多项且有序时,需根据计数资料的结果变量数目,合理选择统计分析的方法。统计分析需选用两组间Wilcoxon秩和检验进行比较[3]。为直接得到结果变量有序的表1和结果变量无序的表2所示的统计分析报表结果,结合SAS宏程序的强大功能,编写相应的定性指标的统计分析SAS宏程序。
表1 组间有效率分析
表2 组间性别比较分析
定义宏及宏变量
在宏程序中定义了六个宏变量,即&dataset、&sfyx、&group、&yx、&position、&fmt,分别为分析数据集、结果变量有序判定、组别、待分析的结果变量、文件保存位置、定义输出格式。
%macro jishu(dataset,sfyx,group,yx,position,fmt);
生成定性资料的统计描述结果
利用SAS的数据传输系统(ods)将列联表的统计描述数据输入到指定的SAS数据集中,对指定数据集进行拆分后使每组统计描述结果处于一列,再进行横向合并操作。
/*利用freq程序输出统计描述部分结果到CrossTabFreqs1 数据集中,并输出卡方检验结果到chisq1数据集,将精确概率法结果输出到fisherexact1数据集,并将CrossTabFreqs1 数据集拆分为psa和psb,经过处理后再横向合并成ms数据集*/
ods output CrossTabFreqs=CrossTabFreqs1 chisq=chisq1 fishersexact=fisherexact1;
proc freq data=&dataset;
tables &yx*&group/chisq expected fisher;
/*对CrossTabFreqs1数据集分别拆分成A组描述数据集psa、B组描述数据集psb,并横向组合处理*/
data Crosstabfreqs;
set Crosstabfreqs1;
keep & yx&group Frequency colpercent;
data psa psb;
set Crosstabfreqs1;
if&group="A" then output psa;else output psb;
data psa;
set psa;
if colpercent=.then colpercent=100;
if &yx=.then &yx=99;
colpercent=round(colpercent,0.01);
psa=cat(Frequency,"(",colpercent,")");
keep &yx psa;
data psb;
set psb;where &group="B";
if &yx=.then &yx=99;
if colpercent=.then colpercent=100;
colpercent=round(colpercent,0.01);
psb=cat(Frequency,"(",colpercent,")");
keep &yx psb;
/*将A、B组的统计描述的结果合并在ms数据集中*/
data ms;
merge psa psb;
by &yx;
run;
抓取样本总例数和理想频数的最小值
利于在方法和结果的选择,对前面生成的chisq1和fisherexact1数据集进行处理,生成卡方统计量及P值数据集chisq1,生成精确概率法P值数据集fisherexact。
/*抓取总样本例数和理想频数最小值的宏变量*/
data expected;
set crosstabfreqs1;
keep expected frequency;
proc summary data=expected;
var expected frequency;
output out=expmin min(expected)=expmin max(frequency)=n;
data expected;
set expmin;
call symput (′expmin′,expmin);
call symput (′n′,n);
/*处理chisq1数据集,挑选出卡方统计量和P值,生成chisq1数据集*/
data chisq1;
set chisq1;
by table;
if first.table;
value=round(value,0.01);
prob=round(prob,0.0001);
value1=cat("卡方=",value);
prob1=cat("P=",prob);
keep value1 prob1;
/*处理fisherexact1数据集,挑选出精确概率法的P值,生成fisherexact数据集*/
data fisherexact;
set fisherexact1;
by table;
if first.table;
if label1^="" then label1="精确概率法";
cvalue1=round(cvalue1,0.0001);
cvalue=cat(label1,"=",cvalue1);
keep cvalue;
选择统计方法及其对应的结果
根据不同的条件,选择合适的统计分析方法及其结果,需首先判断结果变量有序与否。若结果变量为无序,则程序会根据样本总例数和最小理论频数输出不同的统计分析结果。样本总例数≥40且最小理论频数≥5时,则会自动输出卡方分析结果,否则输出fisher精确概率法的结果。若结果变量为有序时,则程序会自动输出两组间Wilcoxon秩和检验的结果。
/*结果变量为无序时,执行以下输出结果操作*/
%if &sfyx="无序" %then %do;
data kf;
if & n>=40 and &expmin>=5 then do;
merge ms chisq1;
file & position mod;
put @10 &yx @29 psa @53 psb @ 75 value1 @85 prob1;
format & yx.&fmt..;
end;
else if &n<40 or &expmin<5 then do;
merge ms fisherexact;
file &position mod;
put @10 &yx @29 psa @53 psb @75 cvalue;
format &yx.&fmt..;end;
run;
%end;
/*结果变量为有序时,用npar1way程序输出统计分析结果到WilcoxonTest数据集中,执行以下输出结果操作*/
%if &sfyx="有序" %then %do;
Ods Output WilcoxonTest=WilcoxonTest1;
proc npar1way wilcoxon data=&dataset;
var &yx;
class &group;
run;
data WilcoxonTest;
set WilcoxonTest1;
where Name1="Z_WIL" or Name1="P2_WIL";
if Name1="P2_WIL" then Name1="P值";
cvalue1=round(cvalue1,0.0001);
cvalue=cat(name1,"=",cvalue1);
keep cvalue;
data kf;
merge ms WilcoxonTest;
file &position mod;
put @10 &yx @29 psa @53 psb @ 75 cvalue;
format &yx.&fmt..;
run;
%end;%mend jishu;
输出表头、表尾及表格线
%macro biaotou(title,position);
data _null_;
long="&title";left=int((96-length(long))/2);
file &position mod;
put #1@left "&title"
#2 @2 97*′_′
#3 @10 ′指标项′ @29 ′A组′ @53 ′B组′ @75 ′统计量和P值′
#4 @2 97*′_′;
run;
%mend biaotou;
%macro biaowei(position);
data _null_;
file &position mod;
put @2 97*′_′;
run;
%mend biaowei;
运行宏程序
将以上所有宏程序提交运行,提交以下程序后,即可输出表1和表2所示的统计分析三线表格。
/*需事先设定好格式化,使结果变量更加直观地输出;设置title的表格名称;人为判断待分析的结果变量有序与否,若结果变量为有序则应将sfyx设置为“有序”,否则应将sfyx设置为“无序”;将所有的position设置,其代表的是:三线表格rtf文件名及其存储的位置*/
proc format;
value fmt 1=′显效 N(%)′ 2=′有效 N(%)′ 3=′无效 N(%)′ 99="合计";
value sexf 1=′男 N(%)′ 2=′女 N(%)′ 99="合计";
run;
%biaotou(title=表格1 组间有效率分析,position=′test.rtf′);
%jishu(dataset=data1,sfyx="有序",group=group,yx=yx,position=′test.rtf ′,fmt=fmt);
%biaowei(position=′test.rtf′);
%biaotou(title=表格2 组间性别比较分析,position=′test.rtf′);
%jishu(dataset=data1,sfyx="无序",group=group,yx=sex,position=′test.rtf ′,fmt=sexf);
%biaowei(position=′test.rtf′);
讨 论
SAS有极其强大的统计分析功能,在国内外很多统计学专业人士采用SAS对新药临床试验的数据进行数据管理和统计分析[4],加之SAS宏程序快捷方便,已成为业界公认的统计分析软件之一。本文基于SAS自带的ODS输出传送系统将统计分析结果以rtf富文本的格式输出三线表。同时根据结果变量的有序与否,利用SAS宏程序的强大功能,使其能够根据设置自动地选择恰当的统计分析方法,并自动输出相应的统计报表。本文介绍了简单实用的SAS宏程序,其结果已经过验证准确可靠,适合结果变量有序与否的定性资料的组间比较。
[1] 李子建,苗青,刘元东.疫情Word报表的SAS编程实现.解放军预防医学杂志,2005,23(3):216-218.
[2] 王雨萌,孙瑞华,黄傲,等.单因素多水平临床试验定量指标统计分析报表的SAS宏实现.中国卫生统计,2016,33(4):712-714.
[3] 孙振球.医学统计学.第3版.北京:人民卫生出版社,2010:141.
[4] 童新元,张高魁,姚晨.定性指标的SAS统计分析报表——SAS软件在新药临床试验统计分析中的应用(一).中国卫生统计,2003,20(1):50-51.
(责任编辑:张 悦)