APP下载

临床试验中定性指标统计分析报表的SAS宏实现

2017-11-07孙瑞华郭锐敏虞康达吴婉玲王雨萌

中国卫生统计 2017年5期
关键词:卡方宏程序无序

徐 凯 孙瑞华 李 欢 郭锐敏 肖 畅 虞康达 吴婉玲 黄 傲 王雨萌

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.

(责任编辑:张 悦)

猜你喜欢

卡方宏程序无序
卡方检验的应用条件
卡方变异的SSA的FSC赛车转向梯形优化方法
车身无序堆叠零件自动抓取系统
卡方检验的应用条件
椭球槽宏程序编制及其Vericut仿真
张博庭:煤电不能再这么无序发展下去了
高速路上右行规则与无序行驶规则的比较研究
无序体系中的国际秩序
基于Vericut的四轴数控加工宏程序仿真研究
G代码B类宏程序在数控切割参数化图形库中的应用