顯示具有 SAS 標籤的文章。 顯示所有文章
顯示具有 SAS 標籤的文章。 顯示所有文章

2012年12月16日

【SAS小技巧】一起使用快速鍵吧!(Using short-cut in SAS)

這一段時間沒什麼機會用寫程式,只好到處亂看技術文章,保持對程式的熱情!

SAS® Enhanced Editor: Efficient Techniques介紹才知道原來SAS有內建許多實用的快速鍵。

2012年11月18日

【SAS 小技巧】調整Log視窗的字型(Fonts)及大小(Size)

首先我要感謝圓哥給我這個機會,才會有這篇的產生…

圖1
《圖1》SAS Log Window

上面這個畫面每次開SAS都會看到的畫面之一,看也看了10多年,到不太在意美醜了。

最近開始使用SAS的圓哥來說,這樣的字型和大小卻不太和他的胃口。我原本也覺得大約沒辦法調吧?假日下午閒來無事,一邊喝著紅茶,一邊吃著薯條三兄弟(最後一包….泣…),一邊和Google大神對話,大神說,這有什麼難度,看看這些文章吧(1)

2012年11月13日

【SAS 9.3小技巧】將中文報表改回到英文報表

好吧,等讀完整篇後,必須先承認這真的是小技巧….

在安裝完SAS 9.3後很自然選擇開啟「SAS 9.3 (中文 (繁體))」,然後跑了幾程式後,看到中文化的報表,起初看到圖1的結果後,覺得不錯耶,對入門者很友善。

圖1
image

2012年10月14日

【SAS 9.3小技巧】SAS 9.3 64位元版匯入Excel?!

使用SAS 9.3 64位元版,可能會遇到匯入Excel檔案失敗的狀況。
舉例來說,用以下語法匯入Excel檔案:

PROC IMPORT OUT= WORK.ehouse1
DATAFILE= "D:\成交狀況.xlsx"
DBMS=EXCEL REPLACE;
RANGE="資料$";
SCANTEXT=YES;
USEDATE=YES;
SCANTIME=YES;
RUN;

在LOG(日誌)會出現以下的文字:
ERROR: Connect: 類別未登錄
ERROR: Error in the LIBNAME statement.
Connection Failed. See log for details.

在SAS使用手冊明明寫到32和64位元版均可以透過PROC IMPORT匯入Excel檔案了,但為什麼會失敗了?

2012年10月10日

【SAS 9.3小技巧】HTML結果無法清除?! (2012/10/23更新補充)

 

在SAS 9.3版明顯改變就是結果預設改為「HTML結果」(在視窗列下方英文名稱為Results Viewer),而不是傳統的報表結果。
HTML結果使用採用新的樣式Htmlblue,整體視覺效果相當亮眼,如果使用中文版,報表的說明也會改用中文,而非之前的英文。

clip_image002

但!使用下來卻發現一個問題,我沒辦法將HTML結果清除,報表就越來越長…越來越長…真的相當困擾。

2012年5月26日

「數字前補零」—以Data step和Macro為例(SAS Macro教學)


前幾天朋友又問了一個問題,朋友手上資料有一串數字,例如5、6、20等,希望能在數字前面補零,補成為005、006、020。因為他的資料很多,而且數字長度不一定,從1~9999都有可能,因此沒辦法用CAT系列函數將零組合到數字前面。
由這個問題,開始這篇第一個程式,建立範例資料(這是我的習慣,沒有資料我寫不出程式>"< )

data zero1_1;
   input num1;
   datalines;
   1
   25
   562
   9480
   X
  ;
proc print data=zero1_1;
run;

接下來不囉唆,直接使用Format就可以解決這個問題了,而這裡要使用的Format為Zw.d
data zero1_2;
   set zero1_1;
   format num1 z5.;
   run;
proc print data=zero1_2;
run;

結果為下圖
擷取
只要簡簡單單使用Z5.這個格式便可以處理了。Z後面接這個5是指數字的總長度,因此以第4個觀察值來說,原本的數字就有4位了,因此SAS會只補一個0了。

2012年1月29日

用SAS Macro表列九九乘法表 (SAS Macro入門教學)

表列出九九乘法表,我認為是很棒的迴圈入門,這個迴圈概念不論是用在SAS Data Step或SAS Macro都很適合。以下用SAS Macro做個簡單的說明。
這九九乘法程式就在下面了,有興趣的人可以直接丟到SAS執行看看,結果會在LOG視窗裡面喔!(在LOG,在LOG喔!!)
%macro A99;
%do A=1 %to 9;
    %put -----A=&A.-----;
    %do B=1 %to 9;
        %let C=&A X &B;
        %let D=%eval(&A * &B);
        %put &C = &D ;
    %end;
%end;
%mend A99;

%A99;


2011年9月27日

SAS PROC SQL入門 (Part A)


本篇應該是SAS PROC SQL的入門吧?哈~ ╯﹏╰
這在裡不會產生新的資料(Data),只介紹直接在報表中呈現結果,往下看就可以理解了。

PS:此篇 SQL入門介紹,在2008年就寫好了,有點不確定當初寫這一篇的目的,不過寫都寫了,就與大家分享 ^.^。  


PROC SQL指令介紹: PROC SQL常用的指令表列

PROC SQL 選項 ;
     CREATE 表格名稱 AS
     SELECT 變項(直行)
     FROM 表格名稱(資料檔名稱)
     WHERE 條件
     GROUP BY變項
     HAVING條件
     ORDER BY 變項 ;
QUIT ;


2010年3月15日

使用ODS GRAPHICS和PROC LIFETEST繪製存活曲線圖 (Survival Curve)

太久沒寫有的沒有的SAS程式了,這次來寫寫關於Kaplan-Meier Estimate、Log-Rank Test及KM Plot的心得吧。
這篇主要的目的為兩個,如何使用PROC LIFETEST進行存活資料的的分析(跳過統計理論的部分), 另一個為使用SAS 9.2新的ODS GRAPHICS,快速產生勘用的存活機率圖,並將圖檔自動放入RTF(Rich Text Format)檔中。

2009年7月19日

使用SAS 9.2 繪製ROC曲線和比較


在2008年4月的時候,曾經寫過一篇繪製ROC曲線和比較兩條ROC曲線下面積的小文章,這篇是以MACRO來畫圖和比較,而在新版的SAS 9.2中已經可以於PROC LOGISTICS直接繪製高品質的ROC曲線(Receiver Operating Characteristic Curves, ROC Curves)。

在SAS 9.2中ODS GRAPHICS支援的程序增加許多,其中也包括PROC LOGISTICS。

先產生一筆虛擬的資料 data Age_data;
input disease age bw@@;
datalines;
0 50 65  0 39 61  0 21 70  0 61 67
0 30 55  0 35 63  0 25 52  0 41 66
0 43 52  0 36 54  0 37 46  0 25 61
0 41 53  0 62 55  0 28 70  0 33 68
1 52 45  1 49 61  1 47 42  1 62 31
1 55 67  1 70 61  1 75 55  1 77 52
1 81 68  1 64 53  1 62 41  1 39 57
1 61 51  1 61 55  1 57 49  1 79 67
;
run;


接下來就直接套用繪製的ROC曲線的語法 ods graphics on;
proc logistic data=age_data plots(only)=(roc) rocoptions(id=prob) ;
model disease (event='1')=age;
run;
ods graphics off;


ods graphics on為宣告要繪製ods graphics的圖,而ods graphics off宣告結束,幾乎ods系列的語法都是類似的語法。
plots(only)=(roc):在proc logistic程序中,新增了幾個選項,plots為宣告要繪製統計圖,括號中的only為要求SAS只要畫出所需的圖就好,而在後面的【 (roc) 】和SAS說我們需要的圖為ROC曲線。
rocoptions(id=prob)表示在圖形上的點要放哪些資訊,目前有兩種可以選擇,【prob】為predicted probability ,而【obs】為observation number。
這幾個簡單的指令便可畫出高品質的ROC曲線。 而且還順便秀出AUC(Area Under Curve)的值。


ROCCurve32 

如果在model後面多放一個變項(BW),則畫出此模型(age和bw的模型)的ROC曲線。 ods graphics on;
proc logistic data=age_data plots(only)=(roc) rocoptions( id=prob) ;
model disease (event='1')=age bw;
run;
ods graphics off;

此模型的ROC曲線為下圖:

ROCCurve41

不過也許大家比較想看到的是,單圖age或bw的圖,或是一張圖裡面同時有age和bw「個別」的ROC曲線,而不是模型的結果。

ods graphics on;
proc logistic data=age_data plots(only)=(roc) rocoptions( id=prob) ;
model disease (event='1')=age bw;
roc '年齡' age;
roc '體重' bw;
run;
ods graphics off;

roc:個別宣告要繪製哪些變項的圖形,這裡我想個別看age及bw的ROC曲線。有單引號包住的文字,為宣告此圖形中變項的名稱,分別為「年齡」及「體重」。不過如果只使用這個語法的話,SAS同時還會多給一張model的圖,和age+bw+model的圖。

ROCCurve42 ROCCurve35 ROCCurve44

ROCOverlay15

上面這張圖,雖然多了一個model的曲線,但這不一定是每次都想見到的,我的經驗,大多臨床工作者,都不太瞭解model這條曲線的意義,即使解釋了很久都還是不會用,因此單純的age和bw的比較也許就很足夠了。這個時候將程式修改成下面的寫法即可。

ods graphics on;
proc logistic data=age_data plots(only)=(roc) rocoptions( id=prob) ;
model disease (event='1')=age bw/nofit;
roc '年齡' age;
roc '體重' bw;
run;
ods graphics off;

其實就只是多了一【nofit】,這會讓SAS不要做整個model估計,只分別對age和bw做兩個logisitc regression,此時Log視窗也會提醒,「NOTE: The NOFIT option is specified.  No parameters are estimated and all other MODEL statement options (except FIRTH ,LINK= ,NOINT ,OFFSET= ,ROC ,and TECHNIQUE=) are ignored.」。結果如下圖:

ROCOverlay16

最後就是比較age和bw的AUC有無統計上的差異了。

ods graphics on;
proc logistic data=age_data plots(only)=(roc) rocoptions( id=prob  ) ;
model disease (event='1')=age bw/nofit;
roc '年齡' age;
roc '體重' bw;
roccontrast  reference('體重')/ estimate e;
run;
ods graphics off;

roccontrast:比較ROC曲線。結果如下:

未命名 - 1

SAS 9.2此項新功能,我自己覺得使用上比MACRO直覺許多!

2009年6月28日

在SAS中使用已經整理好的統計量

實務上常遇到研究者只提供已算好的數字(統計量),例如列聯表中的個數和百分比或兩樣本的人數、平均數和標準差等,如果要利用這些統計量做某些檢定,例如卡方檢定或雙樣本T檢定等,可使用PROC FREQPROC TTEST處理僅有統計量的問題。

PROC FREQ

有兩群病患分別使用A藥和B藥,再觀察兩組實驗組症狀有無改善,結果如下表,如研究者想問A藥和B藥病患症狀改善的比率有無不同,可採用卡方檢定(Chi-square test)

  A藥 B藥
症狀無改善 9 12
症狀改善 21 18

當然第一步要先把資料輸入至SAS中,程式可以這樣寫:

DATA TRIAL_1;
INPUT DRUG $ EFFECT COUNT;
DATALINES;
A 0 9
A 1 21
B 0 12
B 1 18
;
RUN;
PROC SQL;
SELECT *
FROM TRIAL_1;
QUIT;

接下來是卡方檢定的部分

PROC FREQ DATA=TRIAL_1;
WEIGHT COUNT;
TABLE EFFECT*DRUG/CHISQ;
RUN;

PROC TTEST

同樣兩群病患使用A藥和B藥,使用後測量某個臨床指標(連續型變項),研究者欲使用T檢定,探討兩組病患的臨床指標平均值有無差異。資料如下表

  A藥(N=30) B藥(N=30)
臨床指標 89(12) 95(16)
mean(std)

因為這裡我們只有拿到兩組病患的人數、平均值和標準差,所以在輸入資料時要稍微複雜一點,必須符合SAS程式的規定,一定要有一個變項名稱為『_TYPE_』或『_STAT_』,在這個變項中,必須要放入‘N’、‘MEAN’、 ‘STD’這三筆資料,資料輸入程式如下

DATA TRIAL_2;
INPUT DRUG $ _TYPE_ $ EFFECT;
DATALINES;
A N 30
A MEAN 89
A STD 12
B N 30
B MEAN 95
B STD 18
;
RUN;

接下來執行PROC TTEST程序就簡單了,和一般寫法沒有太大差異

PROC TTEST DATA=TRIAL_2;
CLASS DRUG;
VAR EFFECT;
RUN;

以上程式可於SAS 9.1.3和SAS 9.2執行。

2008年11月22日

SAS Macro ( 巨集 ) 簡易教學

SAS的巨集雖然屬於P3等級的內容,不過對於實際分析資料的使用者來說,應該是相當實用的語法,且必要學習的。巨集沒有想像中的難,只是多了一些平常不會使用的符號,例如『%』或『&』等,這一篇教學將會舉一個簡單的例子,說明巨集的使用方式。


先來假設一個狀況,有4個資料檔{a1,a2,a3,a4},每個資料檔中均包含4個變項{y1,x1,x2,x3},而我想以PROC REG來分析4個資料檔中「y1和x1」、「y1和x2」及「y1和x3」的相關性。

第一步:先建立4個資料檔並包含3個變數。
先以do loop建立4個資料檔,而y1、x1、x2、x3的值將隨機由uniform分佈中抽取。程式如下:

data a1 a2 a3 a4 ;
do i=1 to 4;
do j=1 to 100;
y1=uniform(123);
x1=uniform(1234); x2=uniform(12345); x3=uniform(12345);
drop i j;
if i=1 then output a1;
else if i=2 then output a2;
else if i=3 then output a3;
else if i=4 then output a4;
end;
end;
run;


第二步:用傳統方式寫PROC REG程式。
當然可以傳統語法,逐筆將資料檔名稱和變項寫入程式中,以資料a1為範例:

proc reg data=a1;
model y1=x1;
run;
proc reg data=a1;
model y1=x2;
run;
proc reg data=a1;
model y1=x3;
run;

然後再將這一小段程式複製3次,將data分別改成a2、a3、a4即可。

第三步:改用巨集的語法。
其實可以很清楚的找到一個邏輯性;PROC REG的程式每次只需要修改下面藍色的部分就好,
proc reg data=a1;
model y1=x3;
run;

因此抓到這個邏輯以後,就可以寫出一段小小的巨集。

%macro My_reg (mydata, myvar);
proc reg data=&mydata;
model y1=&myvar;
run;
%mend My_reg;

這裡出現了奇怪的符號「%」和「&」。『%mcaro』為告訴SAS要開始寫一段巨集程式,有開始就會有結束,如同do loop會有do...end一樣,在巨集語法中結束即為『%mend』。

在『%macro』後面的My_reg為宣告這段巨集程式的名稱,為何要宣告,因為我們可能會同時使用上很多個巨集程式,如沒有宣告,SAS程式也搞不清楚現在要使用那個巨集程式。

接下來的『(mydata, myvar)』,就是在巨集有幾個「變數」會換(前面PROC REG藍色的2部分),並給這些變數一個名稱。

在被巨集程式的包裹住的語法,絕大部分都和之前寫的程式一樣,只有多了『&mydata』和『&myvar』這兩個,這個由『&』開頭的兩個部分稱為『巨集變項』,這為等一下要被取代的部分。

第四步:使用My_reg巨集。
已經寫好的巨集叫『My_reg』使用時,在巨集名稱前多加『%』,寫法如下:

%My_reg (a1,x1);
%My_reg (a1,x2);
%My_reg (a1,x3);

%My_reg (a2,x1);
%My_reg (a2,x2);
%My_reg (a2,x3);

%My_reg (a3,x1);
%My_reg (a3,x2);
%My_reg (a3,x3);

%My_reg (a4,x1);
%My_reg (a4,x2);
%My_reg (a4,x3);

在巨集名稱後面()要放入取代
巨集變項的「文字」,記得要以『,』區隔。執行後SAS便會將所寫入的文字逐步取代到『My_reg』巨集中,然後執行。

第五步:多一點的寫法。
這裡主要希望SAS能自己重複執行這個結果,不需要如第四步一樣手動改文字,此程式先不在這裡說明了,有興趣的請自行研究了。

%macro My_reg1 ;
%do i=1 %to 4;
%do j=1 %to 3;
proc reg data=a&i;
model y1=x&j;
run;
%end;
%end;
%mend My_reg1;
%My_reg1;


2008年10月5日

SAS Certified Base Programmer Credential for SAS 9

自從幾年前知道SAS有所謂全球認證考試的時候,就很想要試試,終於在前一段時間順利取得了,把一些個人的心得和大家分享。



參考書目方面,SAS Programming ISAS Programming IISAS Certification Review:Base Programming for SAS9(簡稱CRB),這三本SAS公司正式課程的講義是很棒的參考書目。當然能去上這3堂課可能會是更好的選擇,這3個課程我都上了,在老師的講解下,對以前比較模糊的概念重新釐清,對於考試老師應該也會有重點提示!如果時間真的不夠,那強烈推薦CRB課程一定要去

模擬試題,在CRB課程後面會有50題的試題,而網路上也可以找到所謂的「50題」和「123題」,其中的123題可能是某家補習班出的,而似乎有點過難,時間不夠可以考慮跳過。

「CRB」和「50題」如果的答題正確率有超過75或80%,正式考試的通過率應該不會太低了。不過我考試時當天可能運氣比較差,覺得正式的題目似乎比模擬題目難了一些。

準備考試,還是需要讀書的,因為會考一些平常比較少用的指令,例如PROC REPORT,可能需要用腦袋記下了。如果有幾個同伴一起準備,應該也會很有幫助,大家先以題目為主題討論,互相分享大加的讀書心得,如再加上已經自己有1年以上的SAS使用經驗,應該對考試更有相當大的幫助,因為有不少題目,用實務經驗判斷就好。

考試形式為
70單選題,正確率達65%便可取得證書,英文出題,考完當場就知道成績。

有興趣朋友可以參考下面兩個連結的內容,當然還有課程的費用(不要被嚇到!)

SAS台灣官網:
http://www.sas.com/offices/asiapacific/taiwan/index.html

SAS Global Certification Program:
http://support.sas.com/certify/

2008年4月20日

繪製ROC曲線和比較兩條ROC曲線下面積

SAS實用巨集簡介:繪製ROC曲線和比較兩條ROC曲線下面積

目的為介紹SAS官方網頁中關於ROC曲線的巨集(Macro)程式,程式分別為「繪製ROC曲線」和「以無母數方式比較兩條ROC曲線下面積」。本文中所提及之程式,僅為原作者的部分語法,詳細語法請見原文說明,兩篇原文出處連結如下:

Sample 25017: Nonparametric comparison of areas under correlated ROC curves (http://support.sas.com/kb/25/017.html)
 roc.sas程式:http://support.sas.com/kb/25/addl/fusion_25017_6_roc.sas.txt

Sample 25018: Plot ROC curve with labelled points for a binary-response model (http://support.sas.com/kb/25/018.html)
 rocplot.sas程式:http://support.sas.com/kb/25/addl/fusion25018_4_rocplot.sas.txt


請先將程式下載至本機硬碟中,建議將Sample 25017的程式取名為roc.sas,而Sample 25018的程式取名為rocplot.sas。必須要注意的是,如果是想比較兩條ROC曲線下面積,也就是roc.sas這個巨集程式,必須安裝SAS/IML。

繪製ROC曲線

在SAS說明檔中其實已經有介紹如何繪製出簡易的ROC曲線,但在我們諮詢的個案中比較常被問到的問題為,圖上的某個點其「原始數值為何」,利用rocplot.sas 便可輕鬆完成這個工作。
假設有一組資料,研究者想以年齡和某一個BW指標來判斷罹患某疾病的機會。
問題:繪製以年齡作為判斷此是否罹患此疾病的ROC曲線。

第一步:先將資料讀入SAS中
data Age_data;
input disease age bw@@;
datalines;
0 50 65 0 39 61 0 21 70 0 61 67
0 30 55 0 35 63 0 25 72 0 41 66
0 43 52 0 36 54 0 37 76 0 25 61
0 41 53 0 62 55 0 28 70 0 33 68
1 52 45 1 49 61 1 47 42 1 62 31
1 55 67 1 70 61 1 75 55 1 77 52
1 81 58 1 64 53 1 62 41 1 39 57
1 61 51 1 61 55 1 57 49 1 79 47
;
run;

第二步:將rocplot.sas程式預先讀入SAS中
%include "c:\temp\ROC\rocplot.sas";
/*
%include “程式所放的位置”;
*/
透過%include這個巨集指令,可將rocplot.sas呼叫至SAS程式中。

第三步:執行proc logistic程式,並將部分結果輸出,以配合rocplot.sas程式
proc logistic data=age_data;
model disease (event='1')=age / outroc=roc1 roceps=0;
output out=outp p=phat;
run;
這個程式中,我們將disease變項中的「1」視為事件(罹患疾病),並將繪製ROC曲線所需的資料輸出為「roc1」,和每個原值(年齡)的預測機率資料輸出為「outp」並將預測機率的變項命名為「phat」。基本上,使用時只需要改動依變項(disease)和自變項(age)這兩個部分即可。

第四步:使用%rocplot這個巨集程式。
%rocplot (outroc = roc1, out = outp, p = phat, id = age);
這個巨集中,outroc= 資料檔,配合proc logistic的outroc輸出。
out= 資料檔,也同樣配合proc logistic 的out輸出。
p= 預測機率值變項名稱,在輸出預測機率時的命名。
Id= 變項名稱,要依據那個變項繪製ROC曲線上所標記的原始數值,通常應與自變項相同。

第五步:圖形輸出結果



比較兩條ROC曲線下面積

問題:比較以年齡或BW指標對於判斷是否罹患疾病,此兩指標ROC曲線下面積。

第一步:先將roc.sas程式呼叫入SAS中
%include "c:\temp\ROC\roc.sas";


第二步:執行自變項為age的logistic 模型
proc logistic data=age_data;
model disease(event='1')=age / outroc=roc1_age roceps=0;
output out=outp_age p=phat_age;
run;
為了區別age和bw這兩個結果,這裡我們將age的output輸出的檔案命名為「outp_age」而預測機率命名為「phat_age」。

第三步:執行自變項為BW的logistic 模型
proc logistic data=age_data;
model disease(event='1')=bw / outroc=roc1_bw roceps=0;
output out=outp_bw p=phat_bw;
run;


第四步:執行%roc 巨集
%roc (data = outp_age outp_bw,
var = phat_age phat_bw,
response = disease);
在data=資料檔,這後面主要放前面步驟透過output所輸出的檔案,因此目前所放的為「outp_age」和「outp_bw」兩個檔案。
var=變項名稱,在output檔中,預測機率的變項名稱。
response= 依變項名稱,宣告依變項名稱為何。

第五步:結果
於「ROC Curve Areas and 95% Confidence Intervals」的表格中,age的AUC(area under curve, 曲線下面積)為0.912,而bw的AUC為0.6836。age和bw這兩個自變項AUC比較,可於「Contrast Test Results」中看到p-value為0.0378,因此這兩條ROC曲線下面積為顯著的不同。

2008年1月27日

把多張圖放在一頁,同時轉成PDF檔

如何把多張圖片放在一頁裡面,這算困擾我很久的問題,當然我知道Greplay可以用,大致上我也會用,但我總覺得預設的template不是很好用,終於在SUGI發現了Kevin P. Delaney寫的文章,不只簡單教了如何把多張圖片放在同一頁上,還教如何將圖片轉成PDF檔。

主要參考文章:
Multiple Graphs on One Page: The Easy Way (PDF) and the Hard Way (RTF)
ODS LAYOUT: Arranging ODS Output as You See Fit

先提如何將圖片放在一個PDF檔案中,其實語法相當的簡單。可以分為三步驟,1:打開一個PDF檔案。2:想要畫的SAS圖形。3:完成繪圖把該PDF檔關閉。

1:ODS PDF file="你想放的路徑(例如:c:\temp\graph.pdf)";
2:SAS/Grasph 語法;
3:ODS PDF close;

來做一個簡單的範例,先產生一堆在不同自由度下T分佈的機率吧。

data t (drop=i j);
   do j=1 to 30 by 2;

      do i=-3 to 3 by 0.1;
         df=j;
         x=i;
         y=probt(x,df);
         output;
      end;
   end;
run;


接者用Gplot把圖畫出來然後放一個PDF檔中。

options nodate nonumber;
goption reset=all device=pdfc;
ods pdf file="C:\temp\CHart\chart_test_1.pdf" STARTPAGE=never;

   proc gplot data=t;
      title2 "Chart1"; 
     where df le 15;
      plot y*x=df;
      symbol1 i=l;
   run;quit;
ods pdf close;


我這裡只把DF小於15的資料畫出來。其實這樣就簡單完成把圖形放置PDF檔中的語法了,比較特別需要說明的為device=pdfc,這指令是和SAS說在PDF檔中圖片的格式,作者覺得pdfc的格式在PDF檔案中會有比較好的效果,相對於GIF或其他的圖片格式。



過來就是重頭戲了,如何把多張圖片放在一頁,在文中作者教了至少4中方法,我這裡只說明ODS LAYOUT這個指令,Layout是在SAS V9或V9.1才有的指令,我覺得還滿簡單的,相對於要去修改Greplay的版模。

在畫圖之前先簡單說明LAYOUT我會的語法。

ods layout Start width=20cm height=28cm;
ods region x=0% y=5% width=45% height=45%;
/*SAS/Graphs 語法1*/

ods region x=51% y=5% width=45% height=45%;
/*SAS/
Graphs 語法2*/

ods region x=0% y=51% width=45% height=45%;
/*SAS/
Graphs 語法3*/

ods region x=51% y=51% width=45% height=45%;
/*SAS/
Graphs
語法4*/

ods layout end;


ODS LAYOUT:Start就是宣告我們要開始使用layout的指令,請想像我們手上拿一張白,width就是設定紙的寬度,我設定了20公分,height設定紙的高度,我設定28公分。

ODS REGION:宣告我下面的圖片要放在那個位置,
『x=51% y=5%』是說我將圖片要放在由左上角算起,整張紙X軸的第51%和Y軸上第5%的交叉點,當然這裡也可以用實際的長度單位來設定,例如x=11cm y=1cm。
『width=45% height=45%』設定我這一張圖片的大小,我是用相對長度,為整張紙45%寬度和紙長45%的長度,同樣也可以設為實際長度,如width=8cm height=10cm。
ods layout end:這也是必要語法,宣告上面的ODS LAYOUT設定結束。

依序設計這四張圖片想要放的位置就完成了,我隨意將剛剛製造的資料檔分成四張圖繪製,然後配合上面的語法就可完成我想要的工作了,完整的程式如下:


options nodate nonumber;
goption reset=all device=pdfc ;
ods pdf file="C:\temp\CHart\chart_test_2.pdf" STARTPAGE=never;

   ods layout Start width=20cm height=28cm;
   symbol1 i=l;

   ods region x=0% y=5% width=45% height=45%;
   proc gplot data=t;
      title2 'Chart1';
      where df le 5;
      plot y*x=df/noframe;
   run;

   ods region x=51% y=5% width=45% height=45%;
   proc gplot data=t;
      title2 'Chart2';
      where df ge 5 and df le 15;
      plot y*x=df/noframe;
   run;

   ods region x=0% y=51% width=45% height=45%;
   proc gplot data=t;
      title2 'Chart3';
      where df ge 15 and df le 25;
      plot y*x=df/noframe;
   run;

   ods region x=51% y=51% width=45% height=45%;
   proc gplot data=t;
      title2 'Chart4';
      where df ge 25 and df le 30;
      plot y*x=df/noframe;
   run;quit;

   ods layout end;
ods pdf close;


結果如下圖:




利用PDF輸出和ODS LAYOUT的指令理論上就在一頁可繪製出多張高品值的圖形了,當然ODS LAYOUT應用不只用於圖形,想要結合表格和圖形,也是很OK的啦。

2008年1月10日

有質感的code+ & SAS如何匯入Excel檔案

很多BLOG在說明程式的時候都會用漂亮的框框把程式『框』起來,看來我偷偷學會了。

那就順便簡單說明一下的SAS如何匯入Excel檔案吧。

如果已經很熟libname的語法,那就不用特別去背proc import的語法了,所以那下面的語法對很多人來說就是不難了

libname myxls "c:\myexcel.xls";
data temp1;
set myxls."Sheet1$"n;
run;
libname myxls clear;

這裡比較需要注意的地方在於Sheet1$後面那個「$」和"Sheet1$"n後面的「n」,其他就很簡單了。
當然這個語法不是只有那麼陽春,功能也是滿強大的,有機會在介紹了喔。

code的那個框框,我是參考[筆記]在文章裡顯示優質的程式碼區

2007年8月6日

SUGI CLUB

SUGI CLUB — SAS User Group International Club這個Blog裡面有很多很棒的SAS技術文章,沒事的時候看看收穫真的滿大的,推薦給大家了。
http://sugiclub.blogspot.com/