SAS編程宏處理1--描述性統(tǒng)計量的輸出

宏程序在我們?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)途徑:

  1. Proc Means
  2. Proc Univariate
  3. Proc Summary

今天我來介紹Proc Summary的實(shí)現(xiàn)方法,我以SASHELP.CLASS數(shù)據(jù)集作為分析數(shù)據(jù)集摆马,輸出不同性別同學(xué)的身高的描述性統(tǒng)計量臼闻。首先,我們先看一下描述性統(tǒng)計量的模板囤采,關(guān)于模板各個公司應(yīng)該大同小異:

描述性統(tǒ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ù)集中:


Height1

描述性統(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é)果如下:


Height2
Height3

這里輸出的整體內(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;

Out

以上就是整個輸出描述性統(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é)果如下:


Out

以上。
若有疑問蔓肯,歡迎評論區(qū)交流遂鹊!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蔗包,隨后出現(xiàn)的幾起案子秉扑,更是在濱河造成了極大的恐慌,老刑警劉巖调限,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舟陆,死亡現(xiàn)場離奇詭異,居然都是意外死亡耻矮,警方通過查閱死者的電腦和手機(jī)秦躯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裆装,“玉大人踱承,你說我怎么就攤上這事∶啄福” “怎么了勾扭?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铁瞒。 經(jīng)常有香客問我妙色,道長慧耍,這世上最難降的妖魔是什么身辨? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮芍碧,結(jié)果婚禮上煌珊,老公的妹妹穿的比我還像新娘。我一直安慰自己泌豆,他們只是感情好定庵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著踪危,像睡著了一般蔬浙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贞远,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天畴博,我揣著相機(jī)與錄音,去河邊找鬼蓝仲。 笑死俱病,一個胖子當(dāng)著我的面吹牛官疲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亮隙,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼途凫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咱揍?” 一聲冷哼從身側(cè)響起颖榜,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤棚饵,失蹤者是張志新(化名)和其女友劉穎煤裙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體噪漾,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡硼砰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了欣硼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片题翰。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖诈胜,靈堂內(nèi)的尸體忽然破棺而出豹障,到底是詐尸還是另有隱情,我是刑警寧澤焦匈,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布血公,位于F島的核電站,受9級特大地震影響缓熟,放射性物質(zhì)發(fā)生泄漏累魔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一够滑、第九天 我趴在偏房一處隱蔽的房頂上張望垦写。 院中可真熱鬧,春花似錦彰触、人聲如沸梯投。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽分蓖。三九已至,卻和暖如春俭茧,著一層夾襖步出監(jiān)牢的瞬間咆疗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工母债, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留午磁,地道東北人尝抖。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像迅皇,于是被迫代替她去往敵國和親昧辽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容