原文載點:http://www2.sas.com/proceedings/forum2008/382-2008.pdf
在配對分析裡面,McNemar's test一直是主要被拿來使用的統計分析,但這個方法有個先天上的限制是只支援二項資料。一旦資料成為多項資料時,就必須使用Generalized McNemar's test (或稱Stuart-Maxwell test)或者是Bhapkar's test。其中,Bhapkar's test是有被SAS/STAT內的程序所支援,但Generalized McNemar's test則無。Xuezheng Sun和Zhao Yang在2008年發表了一篇技術文件裡面,敘述了如何使用既有的SAS程序來執行Bhapkar's test,並且公佈了一個自製的巨集程式來執行Generalized McNemar's test。
公告
[公告]
2014/01/17
由於已經是faculty的關係,不太有足夠時間寫部落格。因此更新的速度會相當緩慢。再加上近幾年來SAS GLOBAL FORUM沒有出現讓我覺得驚艷的技術文件,所以能分享的文章相對也減少許多。若有人推薦值得分享的SAS技術文件,請利用『問題討論區』告知。
2013/07/19
臉書留言板的功能因為有不明原因故障,因此特此移除。而intensedebate的留言板因管理不易,也一併移除。目前已經開啟內建的 G+ 留言系統,所以請有需要留言的朋友,可直接至『問題討論區』裡面留言。
2014年12月18日 星期四
2012年5月5日 星期六
Everything in Its Place: Efficient Geostatistical Analysis with SAS/STAT ® Spatial Procedures
原文載點:http://support.sas.com/resources/papers/proceedings10/337-2010.pdf
SAS 在處理空間統計和空間模型上一向相當薄弱,根據這幾年全球最大的統計會議 Joint Statistical Meeting 所顯示,越來越多人在做空間統計分析(我自己也是)。所以特別利用這一篇文章來介紹一份 2010 年發表的 SAS 技術文件,來介紹在 SAS 裡面到底開怎麼樣進行空間統計分析。
SAS 在處理空間統計和空間模型上一向相當薄弱,根據這幾年全球最大的統計會議 Joint Statistical Meeting 所顯示,越來越多人在做空間統計分析(我自己也是)。所以特別利用這一篇文章來介紹一份 2010 年發表的 SAS 技術文件,來介紹在 SAS 裡面到底開怎麼樣進行空間統計分析。
2012年3月31日 星期六
Computation of Correlation Coefficient and Its Confidence Interval in SAS®
原文載點:http://www2.sas.com/proceedings/sugi31/170-31.pdf
在一些特殊的情況下,相關係數需要搭配信賴區間。PROC CORR程序不像其他程序語法一樣在後面的選項加上一個 CL 就可以自動生出信賴區間,而是需要用別的選項語法才能產生。而且,這個功能是只有 SAS v9.1.3 之後的版本才有,舊版本則需要靠使用者自己寫程式去算。David Shen 和 Zaizai Lu 在 SUGI31 發表了一篇技術文件來解說如何在新舊版本下算出相關係數的信賴區間。
在一些特殊的情況下,相關係數需要搭配信賴區間。PROC CORR程序不像其他程序語法一樣在後面的選項加上一個 CL 就可以自動生出信賴區間,而是需要用別的選項語法才能產生。而且,這個功能是只有 SAS v9.1.3 之後的版本才有,舊版本則需要靠使用者自己寫程式去算。David Shen 和 Zaizai Lu 在 SUGI31 發表了一篇技術文件來解說如何在新舊版本下算出相關係數的信賴區間。
2012年3月24日 星期六
Mixed Model Influence Diagnostics
原文載點:http://www2.sas.com/proceedings/sugi29/189-29.pdf
在進行混合模型的估計中,模型檢定也是不可忽略的一個重要步驟,雖然 SAS 有現成的語法可以執行,但因為所產生的報表和圖型落落長,不熟悉的人根本不會知道哪些圖或報表是代表什麼意義。SAS 內部工作人員利用官方的資料和程式發表了一篇技術文件,詳盡地解說每一張圖表在混合模型檢定中的意義。
在進行混合模型的估計中,模型檢定也是不可忽略的一個重要步驟,雖然 SAS 有現成的語法可以執行,但因為所產生的報表和圖型落落長,不熟悉的人根本不會知道哪些圖或報表是代表什麼意義。SAS 內部工作人員利用官方的資料和程式發表了一篇技術文件,詳盡地解說每一張圖表在混合模型檢定中的意義。
2012年3月13日 星期二
Count Data Models in SAS®
原文載點:[LINK]
在統計應用領域,我們經常會遇到所謂的"計數資料"(count data),比方說就診人數,死亡人數,顧客人數等等。在分析這些計數資料時,最常使用的模型莫過於卜瓦松模型(Poisson model)。但在實際的應用上,使用者經常需要面對兩大問題:一是過度離散(overdispersion)問題,二是觀測值有太多零(excess zeros)的問題。這些問題通常都會導致卜瓦松模型估計的結果有偏誤。因此 WenSui Liu 和 Jimmy Cela 在 2008 年 SAS Global Forum 發表了一篇技術文件,介紹一些其他比較適合處理計數資料的模型。
在統計應用領域,我們經常會遇到所謂的"計數資料"(count data),比方說就診人數,死亡人數,顧客人數等等。在分析這些計數資料時,最常使用的模型莫過於卜瓦松模型(Poisson model)。但在實際的應用上,使用者經常需要面對兩大問題:一是過度離散(overdispersion)問題,二是觀測值有太多零(excess zeros)的問題。這些問題通常都會導致卜瓦松模型估計的結果有偏誤。因此 WenSui Liu 和 Jimmy Cela 在 2008 年 SAS Global Forum 發表了一篇技術文件,介紹一些其他比較適合處理計數資料的模型。
2011年6月25日 星期六
Expanding PROC EXPAND
原文載點:http://support.sas.com/resources/papers/proceedings11/417-2011.pdf
PROC EXPAND 程序是 SAS/ETS 裡面其中一個語法,提供許多跟時間相關資料的簡便處理。比方說,將日資料累加成月資料,月資料累加成季資料或年資料,也可以倒過來把季/年資料變成月資料,月資料變成日資料。若遇到缺漏值,該程序可用內插法將資料補齊。也可進行諸如moving average的資料轉換。Bruce Gilsen 在 2011 年的 SAS Global Forum 發表了一篇技術文件,介紹了兩個用 PROC EXPAND 運作的例子。
PROC EXPAND 程序是 SAS/ETS 裡面其中一個語法,提供許多跟時間相關資料的簡便處理。比方說,將日資料累加成月資料,月資料累加成季資料或年資料,也可以倒過來把季/年資料變成月資料,月資料變成日資料。若遇到缺漏值,該程序可用內插法將資料補齊。也可進行諸如moving average的資料轉換。Bruce Gilsen 在 2011 年的 SAS Global Forum 發表了一篇技術文件,介紹了兩個用 PROC EXPAND 運作的例子。
2011年6月4日 星期六
Creating Forest Plots from Pre-computed Data using PROC SGPLOT and Graph Template Language
原文載點:http://support.sas.com/resources/papers/proceedings10/195-2010.pdf
Forest plot 是研究環境流行病學的人經常會用到的一種圖表,主要是可以將許多變數或樣本的參數估計值以及信賴區間畫成一條一條的橫線,以供其他人易於判讀相對大小以及有無顯著。我在自己的博士論文裡面也放了相當多這種圖型,但之前我都是自己用 R 寫程式畫的,過程挺複雜的,沒想到 SAS 裡面有現成的語法可以畫這種圖。
Forest plot 是研究環境流行病學的人經常會用到的一種圖表,主要是可以將許多變數或樣本的參數估計值以及信賴區間畫成一條一條的橫線,以供其他人易於判讀相對大小以及有無顯著。我在自己的博士論文裡面也放了相當多這種圖型,但之前我都是自己用 R 寫程式畫的,過程挺複雜的,沒想到 SAS 裡面有現成的語法可以畫這種圖。
2011年5月21日 星期六
Practicalities of Using ESTIMATE and CONTRAST Statements
原文載點:http://support.sas.com/resources/papers/proceedings10/269-2010.pdf
在 PROC GLM 和 PROC MIXED 裡面,最令一般 SAS 使用者感到頭痛的不是模型的檢定而是事後分析(post hoc test)。這牽涉到 contrast 和 estimate 兩個語法。在我接觸過所有非統計科班出身但需要用到線性模型以及事後分析的人,沒有人不對這兩個語法感到聞風喪膽。多年人我曾經試圖用各種方法來教人如何使用這兩種語法,但效果都不怎麼顯著。簡單來講,Contrast 和 estimate 無論是在 PROC GLM 還是 PROC MIXED 裡面,功能完全一樣,語法內的選項也一樣,而兩者之間唯一的差別是,contrast 可以只能算出 p-value,而 estimate 可以把指定的點估計量及其 p-value 一次輸出。David J. Pasta 在 SAS Global Forum 2010 發表了一篇技術文件將這兩種語法做一個詳盡的介紹,堪稱一大貢獻。在本文中,我會介紹幾個比較實用的範例。
在 PROC GLM 和 PROC MIXED 裡面,最令一般 SAS 使用者感到頭痛的不是模型的檢定而是事後分析(post hoc test)。這牽涉到 contrast 和 estimate 兩個語法。在我接觸過所有非統計科班出身但需要用到線性模型以及事後分析的人,沒有人不對這兩個語法感到聞風喪膽。多年人我曾經試圖用各種方法來教人如何使用這兩種語法,但效果都不怎麼顯著。簡單來講,Contrast 和 estimate 無論是在 PROC GLM 還是 PROC MIXED 裡面,功能完全一樣,語法內的選項也一樣,而兩者之間唯一的差別是,contrast 可以只能算出 p-value,而 estimate 可以把指定的點估計量及其 p-value 一次輸出。David J. Pasta 在 SAS Global Forum 2010 發表了一篇技術文件將這兩種語法做一個詳盡的介紹,堪稱一大貢獻。在本文中,我會介紹幾個比較實用的範例。
2011年5月14日 星期六
Updates to SAS® Power and Sample Size Software in SAS/STAT® 9.2
Link: http://www2.sas.com/proceedings/forum2008/368-2008.pdf
PROC POWER程序從SAS 9.1版發表出來後,讓許多power和樣本計算的過程不需要靠使用者自行寫程式才能完成。但一開始的功能並不完備,不過在SAS 9.2版釋出後,PROC POWER 內建的功能就逐漸被補齊了。Wayne Watson 於 SAS Global Forum 2008 發表了一份技術文件,整理了 SAS 9.2版的 PROC POWER 一些新增的功能。
PROC POWER程序從SAS 9.1版發表出來後,讓許多power和樣本計算的過程不需要靠使用者自行寫程式才能完成。但一開始的功能並不完備,不過在SAS 9.2版釋出後,PROC POWER 內建的功能就逐漸被補齊了。Wayne Watson 於 SAS Global Forum 2008 發表了一份技術文件,整理了 SAS 9.2版的 PROC POWER 一些新增的功能。
2011年3月15日 星期二
ROC Hard? No, ROC Made Easy!
SAS 裡面並沒有內建繪製 ROC 曲線的程序和語法,這和目前其他統計軟體都已經內建繪製 ROC 曲線的功能的情況比較起來,顯得相當奇怪。使用者在 SAS 的環境底下,必須先用 PROC LOGISTIC 程序將模型估計出來,再將一些報表另存新的檔案,然後才能根據這些新的資料來繪製 ROC 曲線並且計算 AUC 面積。SAS 官網有一段教學,詳情可參照 http://support.sas.com/kb/25/018.html,但繪製出來的圖形不甚美觀。Kriss Harris 在 SAS Global Forum 2010 發表了一篇技術文件,提供了一個相當實用的巨集程式 %ROC_CUTOFF 讓使用者可以在 SAS 裡面迅速且美觀地畫出 ROC 曲線。
2010年8月2日 星期一
Automatically Run Fisher's Exact Test When the Chi-square Test Might Not Be Valid
Link: http://support.sas.com/resources/papers/proceedings10/096-2010.pdf
在使用PROC FREQ執行卡方檢定時,如果看到列聯表下面出現warning的訊息,就表示這個列聯表有50%以上的期望值小於五,因此程式會建議使用Fisher's exact test。然後使用者必須回到程式裡面,在tables statement後面加上一個exact的選項,再重跑一次PROC FREQ才能得到Fisher's exact test的結果。Wei Xu於SAS GLOBAL FORUM 2010發表了一個macro程式,讓電腦自動幫使用者判斷要不要進行Fisher's exact test,若需要的話會順便把Fisher's exact test的結果跑出來,使用者不需再去重新執行PROC FREQ一次。
在使用PROC FREQ執行卡方檢定時,如果看到列聯表下面出現warning的訊息,就表示這個列聯表有50%以上的期望值小於五,因此程式會建議使用Fisher's exact test。然後使用者必須回到程式裡面,在tables statement後面加上一個exact的選項,再重跑一次PROC FREQ才能得到Fisher's exact test的結果。Wei Xu於SAS GLOBAL FORUM 2010發表了一個macro程式,讓電腦自動幫使用者判斷要不要進行Fisher's exact test,若需要的話會順便把Fisher's exact test的結果跑出來,使用者不需再去重新執行PROC FREQ一次。
2010年7月23日 星期五
Stupid Human Tricks with PROC EXPAND®
Link: http://support.sas.com/resources/papers/proceedings10/093-2010.pdf
鮮少有人知道 SAS/ETS 裡面有個叫做 PROC EXPAND 的程序。這個程序主要是用來整理時間序列資料,比方說可以自己定義時間區間後再來做一些次數量表的製作。David L. Cassell 利用這個程序進行了一些平常使用者可以用來做資料處理的功能,並發表了一篇教學文件在 SAS GLOBAL FORUM 2010 上。讓我們來看看如何用 PROC EXPAND 程序來取代一些複雜的資料操作。
鮮少有人知道 SAS/ETS 裡面有個叫做 PROC EXPAND 的程序。這個程序主要是用來整理時間序列資料,比方說可以自己定義時間區間後再來做一些次數量表的製作。David L. Cassell 利用這個程序進行了一些平常使用者可以用來做資料處理的功能,並發表了一篇教學文件在 SAS GLOBAL FORUM 2010 上。讓我們來看看如何用 PROC EXPAND 程序來取代一些複雜的資料操作。
2009年11月24日 星期二
User-Written DATA Step Functions
原文載點:User-Written DATA Step Functions
這是一個 SAS V9.2 版新釋出的功能,類似 macro,可自行定義 SAS 沒有的函式(function),並可在不用重複呼叫的情況之下,自由使用於每個 data step 裡面。這個自行定義函式的功能,是由 PROC FCMP 來完成。
這是一個 SAS V9.2 版新釋出的功能,類似 macro,可自行定義 SAS 沒有的函式(function),並可在不用重複呼叫的情況之下,自由使用於每個 data step 裡面。這個自行定義函式的功能,是由 PROC FCMP 來完成。
Stopping stepwise: Why stepwise and similar selection methods are bad, and what you should use
原文連結:Stopping Stepwise: Why Stepwise Selection Methods are Bad and What you Should use Instead
從事統計諮詢工作多年,經常遇到這樣的問題:為什麼經過stepwise過後的線性迴歸結果與預期的相差很大,無法有效解釋。這類問題也反應出理論統計和實際應用上的出入。SAS 在選擇變數的過程中,只能藉由讀進去的數字來套用公式,但每個變數的背後意義,在 SAS 還沒演化成「天網」Skynet 之前,應該是猜不出來。以往的解決方式,通常是希望使用者根據經驗法則,從電腦挑出的變數裡面刪除研究內不會去討論到的變數,或者是從刪除掉的變數裡面強迫加入研究內會討論到的變數。但這些比較主觀的方法,總是有點失去科學性。這篇教學文件主要是回答諸多常用線性迴歸做研究的人內心的疑惑,並使用 PROC GLMSELECT 來解決這個問題。
從事統計諮詢工作多年,經常遇到這樣的問題:為什麼經過stepwise過後的線性迴歸結果與預期的相差很大,無法有效解釋。這類問題也反應出理論統計和實際應用上的出入。SAS 在選擇變數的過程中,只能藉由讀進去的數字來套用公式,但每個變數的背後意義,在 SAS 還沒演化成「天網」Skynet 之前,應該是猜不出來。以往的解決方式,通常是希望使用者根據經驗法則,從電腦挑出的變數裡面刪除研究內不會去討論到的變數,或者是從刪除掉的變數裡面強迫加入研究內會討論到的變數。但這些比較主觀的方法,總是有點失去科學性。這篇教學文件主要是回答諸多常用線性迴歸做研究的人內心的疑惑,並使用 PROC GLMSELECT 來解決這個問題。
2009年6月11日 星期四
Using PROC SGPLOT for Quick High-Quality Graphs
原文載點:http://support.sas.com/resources/papers/proceedings09/158-2009.pdf
雖然不曉得有多少人已經拿到 SAS V9.2,不過由於我已經拿到了,所以之後會開始陸續介紹一些新版的功能。
首先先來展示一個 V9.2 最新的繪圖程序—PROC SGPLOT。舊版的 SAS 雖然有提供繪圖程序,但是他們都分散在不同的程序裡面,反而造成使用者的不便。此外,他們的老毛病還是存在,那就是畫出來的圖品質不佳,後來雖然有 ODS 的協助,稍微改善了這方面的缺失,不過 V9.2 版把這些舊的繪圖程序都打包在 PROC SGPLOT 裡面。SGPLOT 顧名思義就是 sophisticated graphical plot 的縮寫,讓我們先來看看這個新繪圖程序的功能。
雖然不曉得有多少人已經拿到 SAS V9.2,不過由於我已經拿到了,所以之後會開始陸續介紹一些新版的功能。
首先先來展示一個 V9.2 最新的繪圖程序—PROC SGPLOT。舊版的 SAS 雖然有提供繪圖程序,但是他們都分散在不同的程序裡面,反而造成使用者的不便。此外,他們的老毛病還是存在,那就是畫出來的圖品質不佳,後來雖然有 ODS 的協助,稍微改善了這方面的缺失,不過 V9.2 版把這些舊的繪圖程序都打包在 PROC SGPLOT 裡面。SGPLOT 顧名思義就是 sophisticated graphical plot 的縮寫,讓我們先來看看這個新繪圖程序的功能。
2009年4月27日 星期一
Updates to SAS® Power and Sample Size Software in SAS/STAT® 9.2
原文載點:http://www2.sas.com/proceedings/forum2008/368-2008.pdf
SAS V9.2 釋出已經有一段時間,雖然仍舊有很多學校機關沒有升級到最新的版本,而仍舊沿用 V9.1.3,不過我已經用新版差不多快四個月的時間,所以之後會慢慢來介紹 V9.2 的新功能。這篇技術文件首先是來介紹新版的 proc power 以及 proc glmpower 所帶來的新的功能。
SAS V9.2 釋出已經有一段時間,雖然仍舊有很多學校機關沒有升級到最新的版本,而仍舊沿用 V9.1.3,不過我已經用新版差不多快四個月的時間,所以之後會慢慢來介紹 V9.2 的新功能。這篇技術文件首先是來介紹新版的 proc power 以及 proc glmpower 所帶來的新的功能。
2008年5月17日 星期六
PROC FACTOR: How to Interpret the Output of a Real-World Example
原文載點:http://www2.sas.com/proceedings/sugi22/STATS/PAPER268.PDF
在網路上面看到有許多論文是做實證研究的人使用 factor analysis,但一方便不懂其理論,另一方面蠻幹式地去跑程式,當然跑出來的報表是有看沒有懂。每次一直重複解答同樣的問題也讓回應者感到很煩,所以在這邊就對 PROC FACTOR 做個簡單描述。我引用 Rachel J. Goldberg 所發表的技術文件,但不知道是哪一年發表的,也不曉得是在哪一期的 SUGI 發表的。不過該篇文章確實放在 SUGI 的資料庫裡面,所以就拿出來做一個簡易的範例教學。
在網路上面看到有許多論文是做實證研究的人使用 factor analysis,但一方便不懂其理論,另一方面蠻幹式地去跑程式,當然跑出來的報表是有看沒有懂。每次一直重複解答同樣的問題也讓回應者感到很煩,所以在這邊就對 PROC FACTOR 做個簡單描述。我引用 Rachel J. Goldberg 所發表的技術文件,但不知道是哪一年發表的,也不曉得是在哪一期的 SUGI 發表的。不過該篇文章確實放在 SUGI 的資料庫裡面,所以就拿出來做一個簡易的範例教學。
2008年2月28日 星期四
Quick and Easy Visualization of Longitudinal data with the WEBFRAME
[公告] 如果本篇文章內的圖檔打不開來,表示其存放空間因本月流量爆表所以無法再顯示。請下載原文比對裡面的圖表。
原文載點:http://analytics.ncsu.edu/sesug/2004/CC06-Delaney.pdf
在做長期趨勢資料分析,尤其在使用 mixed model 的時候,許多人可能會需要將 individual-level 的趨勢圖畫出來。不過大家都會遇到 subject 過多而浪費很多時間在整合圖形上面的問題。Kevin P. Delaney 發現了 SAS 裡面有個超級好用的工具,並將心得分享在 SESUG 裡面。
原文載點:http://analytics.ncsu.edu/sesug/2004/CC06-Delaney.pdf
在做長期趨勢資料分析,尤其在使用 mixed model 的時候,許多人可能會需要將 individual-level 的趨勢圖畫出來。不過大家都會遇到 subject 過多而浪費很多時間在整合圖形上面的問題。Kevin P. Delaney 發現了 SAS 裡面有個超級好用的工具,並將心得分享在 SESUG 裡面。
2008年1月1日 星期二
Histogram of Numeric Data Distribution from the UNIVARIATE Procedure
原文載點:http://www.nesug.info/Proceedings/nesug07/np/np12.pdf
很多人要畫直方圖時,會直覺地想到使用 PROC GCHART。不過其實在 PROC UNIVARIATE 程序裡面已經包含了畫直方圖的指令,語法更簡單,功能更強大。Chauthi Nguyen 在 NESUG 2007 發表了一篇簡單的技術文件來說明如何使用這套語法。
本次範例所使用的資料如下所示:

在 PROC UNIVARIATE 中,有個叫做 histogram 的 statement,就是可以直接拿來畫直方圖,並且可利用一個叫做 normal 的 option 順道把常態曲線一併繪製上去。程式語法如下:
這道程式就是簡單地把變數 weight 的直方圖和常態曲線圖繪製在同一張圖表上。結果如下所示:

SAS/GRAPH 有個很大的缺點,就是畫出來的圖和 export 出來的圖品質差很多。作者也提供了一段小小的程式碼來加強輸出圖檔的品質。程式碼如下:
上述的程式碼會產生一個 html 檔,而把圖形(gif 檔)鑲入在這個網頁檔中。
接著,還有其他的語法可以把圖畫的更漂亮。如下所示:
其中,histogram statement 後面的 option CFILL 可以讓直方圖裡面填進顏色(如本例的ltgray)。INSET statement 則是可以將一些統計量插入到圖形裡面,至於後面的 position option 則是宣告插入圖表的位置(ne 表示 northeast)。結果如下:

更炫的是,他可以一次把兩張直方圖並排在一起。以此例來講,如果要針對性別來分別畫一張 male 的直方圖和 female 的直方圖,則簡單地利用大家都會用的 CLASS statement 來完成:
此處將 sex 安置在 class statement 後面,所以 PROC UNIVARIATE 程序會一次畫兩張圖出來。特別提醒一點的是,在做這個動作前,一定要先用 PROC SORT 將 sex 變數重新排序一遍。此範例沒有列出那段程式碼,因此在這邊特別強調。在 histogram statement 後面有多了幾個 option。其中,COLOR=red 是設定常態曲線的顏色是紅色,CTEXT=blue 是設定圖形上的一切文字的顏色都是藍色。結果如下:

如果想把常態曲線下面所涵蓋的面積填滿顏色,並讓常態曲線變粗,則可使用下列程式:
FILL option 是要把常態曲線下的面積填滿,W option 則是拿來增加常態曲線的寬度。結果如下:

如果只要常態曲線圖,不要直方圖,則可以用下面的程式來做修正:
在 histogram statement 後面加上一個 NOBARS 的 option 就可以輕鬆的把直方圖給去除。除此之外,VAXISLABEL 是設定 Y 軸的標籤。CGRID 是設定在 Y 軸的 main trick 上面劃上橫線,且設定成黑色(=black)。OUTHISTOGRAM 則是把繪製這張圖有關的數據全部另存於 _outhist 這個新的資料集裡面。結果如下:

_outhist 資料集列印出來的結果如下:

使用 PROC UNIVARIATE 來畫直方圖的好處是不用再額外設定諸如 PATTERNS, AXIS1, AXIS2 之類的部分,而可以簡單地在 histogram statement 後面的 option 來搞定。這個額外獨立出 PROC GPLOT、PROC GCHART 或 PROC G3D 程序的繪圖方式算是 SAS 的一大突破。希望將來類似 boxplot 也可以在 PROC UNIVARIATE 裡面來完成。
CONTACT INFORMATION
Chauthi Nguyen
GlaxoSmithKline Pharmaceutical, Inc.
2301 Renaissance Boulevard, King of Prussia, PA 19406
Work phone: (610) 787 - 3853
E-mail: Chauthi.Nguyen@gsk.com
很多人要畫直方圖時,會直覺地想到使用 PROC GCHART。不過其實在 PROC UNIVARIATE 程序裡面已經包含了畫直方圖的指令,語法更簡單,功能更強大。Chauthi Nguyen 在 NESUG 2007 發表了一篇簡單的技術文件來說明如何使用這套語法。
本次範例所使用的資料如下所示:

在 PROC UNIVARIATE 中,有個叫做 histogram 的 statement,就是可以直接拿來畫直方圖,並且可利用一個叫做 normal 的 option 順道把常態曲線一併繪製上去。程式語法如下:
TITLE 'Summary of Weight Variable (in pounds)';
PROC UNIVARIATE DATA = sashelp.class NOPRINT;
HISTOGRAM weight / NORMAL;
RUN;這道程式就是簡單地把變數 weight 的直方圖和常態曲線圖繪製在同一張圖表上。結果如下所示:

SAS/GRAPH 有個很大的缺點,就是畫出來的圖和 export 出來的圖品質差很多。作者也提供了一段小小的程式碼來加強輸出圖檔的品質。程式碼如下:
FILENAME outfig "C:\NESUG2007\histogram.html";
GOPTIONS RESET=all CTITLE=cx000080 FTEXT=swiss ROTATE CTEXT=black
HTEXT=0.85 HTITLE=2.5 DEVICE=html GSFNAME=outfig SFMODE=replace;上述的程式碼會產生一個 html 檔,而把圖形(gif 檔)鑲入在這個網頁檔中。
接著,還有其他的語法可以把圖畫的更漂亮。如下所示:
PROC UNIVARIATE DATA = sashelp.class;
HISTOGRAM weight / NORMAL CFILL = ltgray;
INSET N = 'Number of students' MEDIAN (8.2) MEAN (8.2) STD=’Standard Deviation’ (8.3) / POSITION = ne;
RUN; 其中,histogram statement 後面的 option CFILL 可以讓直方圖裡面填進顏色(如本例的ltgray)。INSET statement 則是可以將一些統計量插入到圖形裡面,至於後面的 position option 則是宣告插入圖表的位置(ne 表示 northeast)。結果如下:

TITLE 'Summary of Weight Variable (in pounds) - added a CLASS statement';
PROC UNIVARIATE DATA = sashelp.class NOPRINT;
CLASS sex;
HISTOGRAM weight / NORMAL (COLOR = red) CFILL = ltgray CTEXT = blue;
INSET N = 'Number of students' MEDIAN (8.2) MEAN (8.2) STD = 'Standard Deviation' (8.3) / POSITION = ne;
LABEL sex = 'Gender';
RUN;此處將 sex 安置在 class statement 後面,所以 PROC UNIVARIATE 程序會一次畫兩張圖出來。特別提醒一點的是,在做這個動作前,一定要先用 PROC SORT 將 sex 變數重新排序一遍。此範例沒有列出那段程式碼,因此在這邊特別強調。在 histogram statement 後面有多了幾個 option。其中,COLOR=red 是設定常態曲線的顏色是紅色,CTEXT=blue 是設定圖形上的一切文字的顏色都是藍色。結果如下:

PROC UNIVARIATE DATA = sashelp.class NOPRINT;
CLASS sex;
HISTOGRAM weight / NORMAL (COLOR = red NOPRINT FILL W=3)
CFILL = ltgray
CTEXT = blue;
INSET N = 'Number of students' MEDIAN (8.2) MEAN (8.2) STD = 'Standard Deviation' (8.3)/ POSITION = ne;
LABEL sex = 'Gender';
RUN;FILL option 是要把常態曲線下的面積填滿,W option 則是拿來增加常態曲線的寬度。結果如下:

TITLE 'Summary of Weight - More options for enhancing the histograms';
PROC UNIVARIATE DATA = sashelp.class NOPRINT;
CLASS sex;
HISTOGRAM weight / NORMAL (COLOR=green FILL W=5)
CFILL = ltgray
CTEXT = red
NOBARS
VAXISLABEL = "Percentage of patients"
CGRID = black
OUTHISTOGRAM = _outhist;
INSET N = 'Number of students' MEDIAN (8.2) MEAN (8.2) STD= 'Standard Deviation' (8.3)/ POSITION = ne;
LABEL sex = 'Gender';
RUN;在 histogram statement 後面加上一個 NOBARS 的 option 就可以輕鬆的把直方圖給去除。除此之外,VAXISLABEL 是設定 Y 軸的標籤。CGRID 是設定在 Y 軸的 main trick 上面劃上橫線,且設定成黑色(=black)。OUTHISTOGRAM 則是把繪製這張圖有關的數據全部另存於 _outhist 這個新的資料集裡面。結果如下:


使用 PROC UNIVARIATE 來畫直方圖的好處是不用再額外設定諸如 PATTERNS, AXIS1, AXIS2 之類的部分,而可以簡單地在 histogram statement 後面的 option 來搞定。這個額外獨立出 PROC GPLOT、PROC GCHART 或 PROC G3D 程序的繪圖方式算是 SAS 的一大突破。希望將來類似 boxplot 也可以在 PROC UNIVARIATE 裡面來完成。
CONTACT INFORMATION
Chauthi Nguyen
GlaxoSmithKline Pharmaceutical, Inc.
2301 Renaissance Boulevard, King of Prussia, PA 19406
Work phone: (610) 787 - 3853
E-mail: Chauthi.Nguyen@gsk.com
2007年12月25日 星期二
A Simple Way to Combine Graphs and Text - DSGI
原文載點:http://www2.sas.com/proceedings/forum2007/157-2007.pdf
在使用 SAS/GRAPH 時,有時候需要把一些特定的表格、文字或統計量整理好列在一張圖表或數張圖表旁邊。PROC GREPLAY 和 PROC GSLIDE 程序雖然有提供合併圖表的功能,但沒有辦法順便合併大量的表格和文字。Tim Tian 在 SUGI 31 發表了一篇技術文章,教使用者如何用 PROC GPRINT 程序把表格和文字轉成圖檔,然後利用 DSGI 的技術將轉檔後的圖檔與其他圖檔合併。
首先來介紹在使用 DGSI 時,如何用 gset 函示將圖檔放置位置座標進行定位。假設有四張圖表要合併成一張,如下所示:

每個圖表都有其自己的座標。使用 gset 來做定位的語法如下:
裡面有幾個參數。第一個 viewport 只是要宣告這個 gset 函數要給該圖做座標定位。第二個參數(1, 2, 3, 4)只是分配一個整數給該圖的定位,當然這些數字是不能重複的。最後四個參數就是座標。這段程式要放在一個 data step 裡面來完成,接下來就用一個實例來解說。
假設要使用 PROC GCHART 程序畫一張圓餅圖和一張 3D 直方圖。繪製這兩張圖的詳細語法在此不多做說明。唯一要注意的地方是,在程式碼中,必須使用一個叫做「name」的選項將圖表命名以作為 DSGI 進行插入圖形時所要的圖檔名稱。這個觀念有點類似在 Word 同時插入數張圖形時,必須要開啟檔案總管去尋找檔名一樣。但在 SAS/GRAPH 中,如果沒有特定的輸出語法,這些畫好的圖形都只是一個暫存檔,會隨著 SAS 關閉而消失。由於是暫存檔,所以也沒有特定檔名,因此需要額外命名讓 DSGI 能夠順利抓到想要插入的圖形。
圓餅圖程式如下:
程式碼中的紅色部分即是需要替圖檔命名的重要動作。名稱可以自訂,此處使用 G1 來命名這個圓餅圖。圖形如下:

3D 立體長條圖的程式碼如下:
同樣地,紅色部分即是將這張圖命名為 G2。圖形如下:

第三張圖其實是個純文字表格。假設是用 PROC REPORT 做出來的,程式碼如下:
接下來的動作就是將這個純文字轉成圖檔。可用 PROC GPRINT 程序來完成。程式碼如下:
用 PROC GPRINT 轉檔後,一樣也是要替這張圖檔命名,此處使用 G3。圖形如下所示:

上圖看起來並不是那麼好看,應該是作者在轉檔前沒有做好對齊的工作。不過無論如何,現在想要把圓餅圖和 3D 長條圖上下合併後放在一張大圖的右側,然後把轉成圖檔的表格放在左側。程式碼如下:
這段程式碼要注意的地方有幾點:
最後的圖形長的像這樣:

CONTACT INFORMATION
Your comments and questions are values and encouraged. Contact the author at:
Tim Tian
Biogen Idec Inc.
14 Cambridge Center
Cambridge, MA 02142
Phone 617-679-6216
Email tim.tian@biogenidec.com
在使用 SAS/GRAPH 時,有時候需要把一些特定的表格、文字或統計量整理好列在一張圖表或數張圖表旁邊。PROC GREPLAY 和 PROC GSLIDE 程序雖然有提供合併圖表的功能,但沒有辦法順便合併大量的表格和文字。Tim Tian 在 SUGI 31 發表了一篇技術文章,教使用者如何用 PROC GPRINT 程序把表格和文字轉成圖檔,然後利用 DSGI 的技術將轉檔後的圖檔與其他圖檔合併。
首先來介紹在使用 DGSI 時,如何用 gset 函示將圖檔放置位置座標進行定位。假設有四張圖表要合併成一張,如下所示:

每個圖表都有其自己的座標。使用 gset 來做定位的語法如下:
DSGI=gset('viewport', 1, 0.00, 0.51, 0.49, 1.00);
DSGI=gset('viewport', 2, 0.51, 0.51, 1.00, 1.00);
DSGI=gset('viewport', 3, 0.00, 0.00, 0.49, 0.49);
DSGI=gset('viewport', 4, 0.51, 0.00, 1.00, 0.49);裡面有幾個參數。第一個 viewport 只是要宣告這個 gset 函數要給該圖做座標定位。第二個參數(1, 2, 3, 4)只是分配一個整數給該圖的定位,當然這些數字是不能重複的。最後四個參數就是座標。這段程式要放在一個 data step 裡面來完成,接下來就用一個實例來解說。
假設要使用 PROC GCHART 程序畫一張圓餅圖和一張 3D 直方圖。繪製這兩張圖的詳細語法在此不多做說明。唯一要注意的地方是,在程式碼中,必須使用一個叫做「name」的選項將圖表命名以作為 DSGI 進行插入圖形時所要的圖檔名稱。這個觀念有點類似在 Word 同時插入數張圖形時,必須要開啟檔案總管去尋找檔名一樣。但在 SAS/GRAPH 中,如果沒有特定的輸出語法,這些畫好的圖形都只是一個暫存檔,會隨著 SAS 關閉而消失。由於是暫存檔,所以也沒有特定檔名,因此需要額外命名讓 DSGI 能夠順利抓到想要插入的圖形。
圓餅圖程式如下:
title "Total Sale by Site";
footnote;
/* generate pie chart from TOTALS */
/* and create catalog entry PIE */
pattern1 value=solid color=cyan;
pattern2 value=solid color=green;
pattern3 value=solid color=red;
pattern4 value=solid color=yellow;
proc gchart data=totals ;
format sales dollar8.;
pie site
/ type=sum
sumvar=sales
midpoints='New York' 'Chicago' 'Atlanta' 'Seattle'
fill=solid
coutline=gray
angle=45
percent=inside
value=inside
slice=outside
noheading
name='G1';
run;程式碼中的紅色部分即是需要替圖檔命名的重要動作。名稱可以自訂,此處使用 G1 來命名這個圓餅圖。圖形如下:

3D 立體長條圖的程式碼如下:
title1 'Total Sales by Site and Department';
footnote;
axis1 label=none origin=(24,);
axis2 label=none order=(0 to 100000 by 20000) minor=(number=1)offset=(,0);
legend1 label=none shape=bar 3,3) cborder=black cblock=gray origin=(24,);
pattern1 color=lipk; pattern2 color=cyan;
pattern3 color=lime;
goptions hpos=75 vpos=30;
proc gchart data=totals;
format sales dollar8.;
vbar3d site / sumvar=sales subgroup=dept
inside=subpct
outside=sum
width=7 space=3
maxis=axis1 raxis=axis2
cframe=gray coutline=black
legend=legend1
name='G2';
run;同樣地,紅色部分即是將這張圖命名為 G2。圖形如下:

第三張圖其實是個純文字表格。假設是用 PROC REPORT 做出來的,程式碼如下:
filename tot 'tot.doc';
proc printto print=tot new;
run;
title;
footnote;
options linesize=64 pagesize=37 byline;
proc report data=tot2 split='\' center missing nowindows headline spacing=1;
column site dept tot;
define site / order order=data width=8 left flow "Site";
define dept / display width=13 left "Department";
define tot / display width=11 left " Sales" format= dollar11.2;
break before site/skip;
run;
proc printto;
run;接下來的動作就是將這個純文字轉成圖檔。可用 PROC GPRINT 程序來完成。程式碼如下:
title j=l ' Summary of Sales by Site and Department';
footnote;
goptions hpos=40 vpos=28 htext=3.5 ftext=swissx;
proc gprint fileref=tot name='G3';
run;用 PROC GPRINT 轉檔後,一樣也是要替這張圖檔命名,此處使用 G3。圖形如下所示:

上圖看起來並不是那麼好看,應該是作者在轉檔前沒有做好對齊的工作。不過無論如何,現在想要把圓餅圖和 3D 長條圖上下合併後放在一張大圖的右側,然後把轉成圖檔的表格放在左側。程式碼如下:
goptions htitle=4.5 display noborder;
title1 'XYZ Corporation Annual Earnings';
title2 'Fiscal Year 1999';
footnote;
options orientation=portrait topmargin=1 bottommargin=1 leftmargin=1 rightmargin=1;
ods listing close;
ods rtf file="&progname..rtf";
data _null_;
/* prepare SAS/GRAPH software */
/* to accept DSGI statements */
rc=ginit();
rc=graph('clear');
/* insert graph previously created ***Pie***/
rc=gset('viewport', 1, .42, 0, .90, .49);
rc=gset('window', 1, 0, 0, 100, 100);
rc=gset('transno', 1);
rc=graph('insert', 'G1');
/* insert graph previously created ***Plot***/
rc=gset('viewport', 2, .42, .51, .90, 1);
rc=gset('window', 2 0, 0, 100, 100);
rc=gset('transno', 2);
rc=graph('insert', 'G2');
/* insert text previously created ***Table***/
rc=gset('viewport', 3, 0, 0, .40, 1);
rc=gset('window', 3 0, 0, 100, 100);
rc=gset('transno', 3);
rc=graph('insert', 'G3');
/* display graph and end DSGI */
rc=graph('update');
rc=gterm();
run;
ods rtf close;
ods listing;這段程式碼要注意的地方有幾點:
- gset 函示所產生的資料檔檔名可以隨便命名,此處是用 _Null_,表示 SAS 並不會真的產生這個資料檔。
- 除了紅色部分需要依照實際情況進行修改以外,其他部分只是單純設定的動作,可以原封不動地 copy。
- 每張圖都用三個 gset 設定座標(使用參數 viewport)和比例大小(使用參數 window)。至於參數 transno 只是把 viewport 和 window 所設定好的數值打包起來,而後面那個參數一定要跟之前用 viewport 和 window 所使用的第二個參數相同。最後用 graph('insert','[name]') 這個函示把 [name] 所表示的圖檔放上去。
- 最後用 ODS 輸出時,就會看到只有一張包含這三張小圖的大圖出現。此外,本例用一個 macro 函數 &progname 來替輸出的 RTF 檔命名。但我遍尋不著他所真正代表的名稱,研判應該前面應該有個 「%let progname=xxxxx;」,可能作者忘記放了。
最後的圖形長的像這樣:

CONTACT INFORMATION
Your comments and questions are values and encouraged. Contact the author at:
Tim Tian
Biogen Idec Inc.
14 Cambridge Center
Cambridge, MA 02142
Phone 617-679-6216
Email tim.tian@biogenidec.com
訂閱:
文章 (Atom)