宏程序在我們?nèi)粘>幊讨斜黄毡槭褂米萘酢m椖恐械暮芏噍敵鰞?nèi)容都是相同的標(biāo)準(zhǔn)和模板缩幸,如果每次都手動編寫程序朋譬,這樣的效率未免有些低下音同。我寫宏程序這系列文章的目的,就是將工作中可能遇到的宏程序積累下來矿酵,以方便下次調(diào)用只嚣。這一系列要寫多少以及怎么寫腻贰,我自己也不太確定叹侄,就先開始寫起來巩搏。
相同的輸出可以通過不同的程序來實(shí)現(xiàn),與之對應(yīng)的宏程序的實(shí)現(xiàn)也并非固定趾代。我先盡量為每種輸出形式完成一種形式贯底,至于豐富實(shí)現(xiàn)方法,以后再補(bǔ)充撒强。文章的框架是先以普通的SAS程序?qū)崿F(xiàn)輸出禽捆,最后將程序封裝成宏程序,方便使用飘哨。
我先介紹輸出描述性統(tǒng)計量的宏程序胚想。描述性統(tǒng)計量的輸出在臨床試驗統(tǒng)計分析中非常普遍,每一個臨床試驗的SAP中都應(yīng)該有類似的語句:
Descriptive statistics on continuous measurements will include means, medians, standard deviations, quartiles(Q1, Q3) and minimum and maximum, while categorical data will be summarized using frequency counts and percentages.
至于如何實(shí)現(xiàn)描述性統(tǒng)計量的輸出杖玲,從我接觸的項目中來看顿仇,大致有3種實(shí)現(xiàn)途徑:
- Proc Means
- Proc Univariate
- Proc Summary
今天我來介紹Proc Summary的實(shí)現(xiàn)方法,我以SASHELP.CLASS數(shù)據(jù)集作為分析數(shù)據(jù)集摆马,輸出不同性別同學(xué)的身高的描述性統(tǒng)計量臼闻。首先,我們先看一下描述性統(tǒng)計量的模板囤采,關(guān)于模板各個公司應(yīng)該大同小異:
我這邊就不介紹具體的SAS語法了述呐,直接看程序如何實(shí)現(xiàn):
proc summary data = sashelp.class;
class sex;
var height;
output out=height1 n=n mean=mean median=median std=std min=min max=max q1=q1 q3=q3;
run;
以上代碼將各分組以及分組匯總的統(tǒng)計量輸出到Height1數(shù)據(jù)集中:
描述性統(tǒng)計量獲取后,需要整理成模板顯示的形式蕉毯。顯然乓搬,模板顯示的豎向排列,而輸出的數(shù)據(jù)集中是橫向排列的代虾。這里實(shí)現(xiàn)的方法一般有兩種进肯,第一,Proc Tranpose語句將橫向數(shù)據(jù)轉(zhuǎn)變?yōu)榭v向數(shù)據(jù)棉磨;第二江掩,在Data步中使用Ouput語句實(shí)現(xiàn)縱向輸出。
這里乘瓤,我采用Proc Tranpose進(jìn)行實(shí)現(xiàn)环形。關(guān)于各個統(tǒng)計量的保留的小數(shù)位數(shù),不同的公司可能有不同的要求衙傀,在這里min抬吟、max先保留一位,mean统抬、std火本、q1、q3先保留兩位聪建。小數(shù)位數(shù)在最后的宏程序中可以使用宏參數(shù)進(jìn)行控制发侵。
data height2;
set height1;
where not missing(sex);
length v1-v6 $50;
if n >. then v1=strip(put(n, 4.0)); else v1 = "0";
if mean >. then v2=strip(put(mean,8.2)); else v2="-";
if std>. then v3=strip(put(std,8.2)); else v3="-";
if median>. then v4=strip(put(median,8.2)); else v4="-";
if nmiss(q1,q3) =0 then v5=strip(put(q1,8.2))||", "||strip(put(q3,8.2)); else v5="-, -";
if nmiss(min,max) =0 then v6=strip(put(min,8.1))||", "||strip(put(max,8.1)); else v6="-, -";
run;
proc transpose data = height2 out=height3;
var v1 -v6;
run;
輸出結(jié)果如下:
這里輸出的整體內(nèi)容已經(jīng)很完善了,但是第一列沒有具體統(tǒng)計量名稱妆偏,需要進(jìn)一步補(bǔ)充刃鳄,這里可以通過建立Format進(jìn)行實(shí)現(xiàn)。
proc format;
value $stat
"v1" = "n"
"v2" = "Mean"
"v3" = "SD"
"v4" = "Median"
"v5" = "Q1, Q3"
"v6" = "Min, Max"
;
run;
data out;
set height3;
_name_ = put(_name_, $stat.);
run;
以上就是整個輸出描述性統(tǒng)計量的過程钱骂,這是一個整體的框架叔锐,一些細(xì)節(jié)可能不同公司有不同要求,具體細(xì)節(jié)讀者可以自行補(bǔ)充见秽∮淅樱考慮到一張Table可能出多個變量的描述性統(tǒng)計量,可以添加一個變量記錄表屬于具體的表的第幾部分解取,也可以增加記錄同一部分中的統(tǒng)計量排列順序的變量步责。
將以上程序封裝成宏程序,具體如下:
%macro Summary(indt=, outdt=, trtvar=, anavar=, dplace=, sec=);
proc summary data = &indt.;
class &trtvar.;
var &anavar.;
output out=&anavar.1 n=n mean=mean median=median std=std min=min max=max q1=q1 q3=q3;
run;
data &anavar.2;
set &anavar.1;
where not missing(&trtvar.);
length v1-v6 $50;
%let dplace1 = %eval(&dplace. +1);
if n >. then v1=strip(put(n, 4.0)); else v1 = "0";
if mean >. then v2=strip(put(mean,8.&dplace1.)); else v2="-";
if std>. then v3=strip(put(std,8.&dplace1.)); else v3="-";
if median>. then v4=strip(put(median,8.&dplace1.)); else v4="-";
if nmiss(q1,q3) =0 then v5=strip(put(q1,8.&dplace1.))||", "||strip(put(q3,8.&dplace1.)); else v5="-, -";
if nmiss(min,max) =0 then v6=strip(put(min,8.&dplace.))||", "||strip(put(max,8.&dplace.)); else v6="-, -";
run;
proc transpose data = &anavar.2 out=&anavar.3;
var v1 -v6;
run;
data &outdt;
set &anavar.3;
_name_ = put(_name_, $stat.);
sec = &sec.;
rownum=_n_;
run;
%mend;
%Summary(indt=sashelp.class, outdt=out, trtvar=sex, anavar=height, dplace=1, sec=1);
輸出結(jié)果如下:
以上。
若有疑問蔓肯,歡迎評論區(qū)交流遂鹊!