發表文章

目前顯示的是有「SAS-Macro」標籤的文章

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

圖片
散佈圖(Scatter Plot、Scatter Diagram)亦稱為散布圖、相關圖等。目前在SAS繪製散佈圖有兩個較為簡單方法,一為使用PROC CORR,相關語法可見 SAS官網 的說明,用PROC CORR的方法相當簡單,而且同時會把人數、相關係數、檢定的P值呈現於圖中,但如要修改圖形或增加其他說明限制就很大了。 另一方法為本篇將分享的PROC SGPLOT,但限制為不會自動在圖形上呈現人數、相關係數和檢定的P值,此限制可透過巨集的幫忙而增加至圖形中,以PROC SGPLOT所繪統計圖,在之後需的編修彈性就高很多。 最後我們會把整組程式以改編為巨集程式,方便未來使用。 散佈圖(scatter plot)+橢圓圖(prediction ellipse)+迴歸線(regression line):

修改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。

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

圖片
曾在 用K函數處理中文字串 文章中提及專門用來處理中文的K函數,但沒有實際的例子,最近發生了一個案例,把處理心得分享給大家參考。 原問題為,想把地址中的某一條路刪除。 例如: 台北市中山路50號 → 台北市50號 北市板橋區中山路二段 → 北市板橋區二段 這樣的取代如果用EXCEL或WORD不難處理,但在SAS中似乎不是那麼人性。 以下程式我不會特別說明語法的指令,有興趣者可請自行研究或連至我推薦的網頁查詢。

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

圖片
  在實務工作將資料中所有的欄位(變項)先以文字格式(character format)匯入,在做後續的分析是很實務的作法。為何會有這種作法?主要是SAS以PROC IMPORT匯入CSV檔案時,會預先猜測欄位的格式,在"自動"給予文字或數字格式,如果不幸某個欄位是以混合格式(mixed format)鍵入,SAS很有可能會採用數字格式匯入該欄位,而導致欄位中非數字的資料變成遺漏值(missing value)。 這篇小文章中我打算介紹三種方法來處理這樣的方法,如果你的時間不夠,請直接跳到方法三。

「數字前補零」—以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了。

用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;

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; 這裡出現了奇怪的符號「%」和「 ...