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

2020年2月15日

〔SAS〕使用SGPLOT繪散佈圖及程式巨集化

散佈圖(Scatter Plot、Scatter Diagram)亦稱為散布圖、相關圖等。目前在SAS繪製散佈圖有兩個較為簡單方法,一為使用PROC CORR,相關語法可見SAS官網的說明,用PROC CORR的方法相當簡單,而且同時會把人數、相關係數、檢定的P值呈現於圖中,但如要修改圖形或增加其他說明限制就很大了。

另一方法為本篇將分享的PROC SGPLOT,但限制為不會自動在圖形上呈現人數、相關係數和檢定的P值,此限制可透過巨集的幫忙而增加至圖形中,以PROC SGPLOT所繪統計圖,在之後需的編修彈性就高很多。

最後我們會把整組程式以改編為巨集程式,方便未來使用。

散佈圖(scatter plot)+橢圓圖(prediction ellipse)+迴歸線(regression line):

散佈圖(scatter plot)+橢圓圖(prediction ellipse)+迴歸線(regression line)

2018年5月27日

修改PROC LIFETEST以ODS所繪製存活曲線圖

用ODS GRAPHICS和PROC LIFETEST繪製存活曲線圖 (Survival Curve)』從2010年以來已經有超過9千次的瀏覽量,雖然用ODS繪製Kaplan-Meier Survival Plot(後簡稱KM PLOT)非常方便,但缺點是如果需要修改圖中的樣式必須使用Graph Template Language(GTL)語法修改版模,不過GTL語法似乎真的有點難啊~~

還好SAS很佛心的提供一系列的Macro和Macro Variable可以方便使用者修改「部分」的圖形元素。但是這一系列的寫法有些複雜和不直覺,而且只能修改「Survival plot」而不支援「Failure plot」,如果你剛好需就讓我們一起學習看看吧!

先秀出經過修改後的KM PLOT。

2016年5月30日

【SAS 小技巧】替換文字中的中文字串(K函數+Macro)

曾在用K函數處理中文字串文章中提及專門用來處理中文的K函數,但沒有實際的例子,最近發生了一個案例,把處理心得分享給大家參考。

原問題為,想把地址中的某一條路刪除。

例如:
台北市中山路50號 → 台北市50號
北市板橋區中山路二段 → 北市板橋區二段

這樣的取代如果用EXCEL或WORD不難處理,但在SAS中似乎不是那麼人性。

以下程式我不會特別說明語法的指令,有興趣者可請自行研究或連至我推薦的網頁查詢。

2013年6月23日

【SAS 小技巧】以文字格式讀取CSV資料檔中的欄位(變項)

 

在實務工作將資料中所有的欄位(變項)先以文字格式(character format)匯入,在做後續的分析是很實務的作法。為何會有這種作法?主要是SAS以PROC IMPORT匯入CSV檔案時,會預先猜測欄位的格式,在"自動"給予文字或數字格式,如果不幸某個欄位是以混合格式(mixed format)鍵入,SAS很有可能會採用數字格式匯入該欄位,而導致欄位中非數字的資料變成遺漏值(missing value)。

這篇小文章中我打算介紹三種方法來處理這樣的方法,如果你的時間不夠,請直接跳到方法三。

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;


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;