徐 凱 孫瑞華 李 歡 郭銳敏 肖 暢 虞康達 吳婉玲 黃 傲 王雨萌
1.北京中醫(yī)藥大學管理學院(100029)
2.中日友好醫(yī)院科研處
△通信作者:孫瑞華,E-mail:sunruihua@263.net126.com
·計算機應用·
臨床試驗中定性指標統(tǒng)計分析報表的SAS宏實現(xiàn)
徐 凱1孫瑞華2△李 歡1郭銳敏1肖 暢1虞康達1吳婉玲1黃 傲1王雨萌1
SAS軟件是業(yè)界公認的一款統(tǒng)計分析軟件,在臨床試驗的統(tǒng)計分析中應用十分廣泛。應用其強大的宏程序功能,可以高效快捷地實現(xiàn)報表的自動化輸出,使統(tǒng)計結果直接生成Word統(tǒng)計報表,避免了以往手工粘貼統(tǒng)計結果出現(xiàn)錯誤的問題[1-2]。根據統(tǒng)計分析報告中常用的格式,本文將編寫一套較為通用的定性指標(結果變量有序或者無序)的統(tǒng)計分析SAS宏程序。
根據統(tǒng)計學原理,常用頻數、百分比/構成比等指標對計數資料進行統(tǒng)計學描述。統(tǒng)計分析時,需根據資料是否有序,合理選擇統(tǒng)計分析方法。成組設計的列聯(lián)表資料,結果變量為無序時,組間比較需選用卡方檢驗,若樣本例數<40或理論頻數<5時則采用Fisher精確概率法;結果變量為多項且有序時,需根據計數資料的結果變量數目,合理選擇統(tǒng)計分析的方法。統(tǒng)計分析需選用兩組間Wilcoxon秩和檢驗進行比較[3]。為直接得到結果變量有序的表1和結果變量無序的表2所示的統(tǒng)計分析報表結果,結合SAS宏程序的強大功能,編寫相應的定性指標的統(tǒng)計分析SAS宏程序。
表1 組間有效率分析
表2 組間性別比較分析
在宏程序中定義了六個宏變量,即&dataset、&sfyx、&group、&yx、&position、&fmt,分別為分析數據集、結果變量有序判定、組別、待分析的結果變量、文件保存位置、定義輸出格式。
%macro jishu(dataset,sfyx,group,yx,position,fmt);
利用SAS的數據傳輸系統(tǒng)(ods)將列聯(lián)表的統(tǒng)計描述數據輸入到指定的SAS數據集中,對指定數據集進行拆分后使每組統(tǒng)計描述結果處于一列,再進行橫向合并操作。
/*利用freq程序輸出統(tǒng)計描述部分結果到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組的統(tǒng)計描述的結果合并在ms數據集中*/
data ms;
merge psa psb;
by &yx;
run;
利于在方法和結果的選擇,對前面生成的chisq1和fisherexact1數據集進行處理,生成卡方統(tǒng)計量及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數據集,挑選出卡方統(tǒng)計量和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;
根據不同的條件,選擇合適的統(tǒng)計分析方法及其結果,需首先判斷結果變量有序與否。若結果變量為無序,則程序會根據樣本總例數和最小理論頻數輸出不同的統(tǒng)計分析結果。樣本總例數≥40且最小理論頻數≥5時,則會自動輸出卡方分析結果,否則輸出fisher精確概率法的結果。若結果變量為有序時,則程序會自動輸出兩組間Wilcoxon秩和檢驗的結果。
/*結果變量為無序時,執(zhí)行以下輸出結果操作*/
%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程序輸出統(tǒng)計分析結果到WilcoxonTest數據集中,執(zhí)行以下輸出結果操作*/
%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 ′統(tǒng)計量和P值′
#4 @2 97*′_′;
run;
%mend biaotou;
%macro biaowei(position);
data _null_;
file &position mod;
put @2 97*′_′;
run;
%mend biaowei;
將以上所有宏程序提交運行,提交以下程序后,即可輸出表1和表2所示的統(tǒng)計分析三線表格。
/*需事先設定好格式化,使結果變量更加直觀地輸出;設置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有極其強大的統(tǒng)計分析功能,在國內外很多統(tǒng)計學專業(yè)人士采用SAS對新藥臨床試驗的數據進行數據管理和統(tǒng)計分析[4],加之SAS宏程序快捷方便,已成為業(yè)界公認的統(tǒng)計分析軟件之一。本文基于SAS自帶的ODS輸出傳送系統(tǒng)將統(tǒng)計分析結果以rtf富文本的格式輸出三線表。同時根據結果變量的有序與否,利用SAS宏程序的強大功能,使其能夠根據設置自動地選擇恰當的統(tǒng)計分析方法,并自動輸出相應的統(tǒng)計報表。本文介紹了簡單實用的SAS宏程序,其結果已經過驗證準確可靠,適合結果變量有序與否的定性資料的組間比較。
[1] 李子建,苗青,劉元東.疫情Word報表的SAS編程實現(xiàn).解放軍預防醫(yī)學雜志,2005,23(3):216-218.
[2] 王雨萌,孫瑞華,黃傲,等.單因素多水平臨床試驗定量指標統(tǒng)計分析報表的SAS宏實現(xiàn).中國衛(wèi)生統(tǒng)計,2016,33(4):712-714.
[3] 孫振球.醫(yī)學統(tǒng)計學.第3版.北京:人民衛(wèi)生出版社,2010:141.
[4] 童新元,張高魁,姚晨.定性指標的SAS統(tǒng)計分析報表——SAS軟件在新藥臨床試驗統(tǒng)計分析中的應用(一).中國衛(wèi)生統(tǒng)計,2003,20(1):50-51.
(責任編輯:張 悅)