這一段時間沒什麼機會用寫程式,只好到處亂看技術文章,保持對程式的熱情!
由SAS® Enhanced Editor: Efficient Techniques介紹才知道原來SAS有內建許多實用的快速鍵。
這一段時間沒什麼機會用寫程式,只好到處亂看技術文章,保持對程式的熱情!
由SAS® Enhanced Editor: Efficient Techniques介紹才知道原來SAS有內建許多實用的快速鍵。
首先我要感謝圓哥給我這個機會,才會有這篇的產生…
《圖1》SAS Log Window
上面這個畫面每次開SAS都會看到的畫面之一,看也看了10多年,到不太在意美醜了。
最近開始使用SAS的圓哥來說,這樣的字型和大小卻不太和他的胃口。我原本也覺得大約沒辦法調吧?假日下午閒來無事,一邊喝著紅茶,一邊吃著薯條三兄弟(最後一包….泣…),一邊和Google大神對話,大神說,這有什麼難度,看看這些文章吧(1)。
好吧,等讀完整篇後,必須先承認這真的是小技巧….
在安裝完SAS 9.3後很自然選擇開啟「SAS 9.3 (中文 (繁體))」,然後跑了幾程式後,看到中文化的報表,起初看到圖1的結果後,覺得不錯耶,對入門者很友善。
圖1
PROC IMPORT OUT= WORK.ehouse1
DATAFILE= "D:\成交狀況.xlsx"
DBMS=EXCEL REPLACE;
RANGE="資料$";
SCANTEXT=YES;
USEDATE=YES;
SCANTIME=YES;
RUN;
data zero1_1;
input num1;
datalines;
1
25
562
9480
X
;
proc print data=zero1_1;
run;
data zero1_2;
set zero1_1;
format num1 z5.;
run;
proc print data=zero1_2;
run;
%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 PROC SQL的入門吧?哈~ ╯﹏╰
這在裡不會產生新的資料(Data),只介紹直接在報表中呈現結果,往下看就可以理解了。
PS:此篇 SQL入門介紹,在2008年就寫好了,有點不確定當初寫這一篇的目的,不過寫都寫了,就與大家分享 ^.^。
PROC SQL指令介紹: PROC SQL常用的指令表列
PROC SQL 選項 ; CREATE 表格名稱 AS SELECT 變項(直行) FROM 表格名稱(資料檔名稱) WHERE 條件 GROUP BY變項 HAVING條件 ORDER BY 變項 ; QUIT ; |
太久沒寫有的沒有的SAS程式了,這次來寫寫關於Kaplan-Meier Estimate、Log-Rank Test及KM Plot的心得吧。
這篇主要的目的為兩個,如何使用PROC LIFETEST進行存活資料的的分析(跳過統計理論的部分), 另一個為使用SAS 9.2新的ODS GRAPHICS,快速產生勘用的存活機率圖,並將圖檔自動放入RTF(Rich Text Format)檔中。
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;
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)的值。
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曲線為下圖:
不過也許大家比較想看到的是,單圖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的圖。
上面這張圖,雖然多了一個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.」。結果如下圖:
最後就是比較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曲線。結果如下:
SAS 9.2此項新功能,我自己覺得使用上比MACRO直覺許多!
實務上常遇到研究者只提供已算好的數字(統計量),例如列聯表中的個數和百分比或兩樣本的人數、平均數和標準差等,如果要利用這些統計量做某些檢定,例如卡方檢定或雙樣本T檢定等,可使用PROC FREQ和PROC 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) |
因為這裡我們只有拿到兩組病患的人數、平均值和標準差,所以在輸入資料時要稍微複雜一點,必須符合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執行。
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 data=a1;
model y1=x1;
run;
proc reg data=a1;
model y1=x2;
run;
proc reg data=a1;
model y1=x3;
run;
%macro My_reg (mydata, myvar);
proc reg data=&mydata;
model y1=&myvar;
run;
%mend 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);
%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;
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;
%include "c:\temp\ROC\rocplot.sas";
/*
%include “程式所放的位置”;
*/
透過%include這個巨集指令,可將rocplot.sas呼叫至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 (outroc = roc1, out = outp, p = phat, id = age);
這個巨集中,outroc= 資料檔,配合proc logistic的outroc輸出。%include "c:\temp\ROC\roc.sas";
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」。proc logistic data=age_data;
model disease(event='1')=bw / outroc=roc1_bw roceps=0;
output out=outp_bw p=phat_bw;
run;
%roc (data = outp_age outp_bw,
var = phat_age phat_bw,
response = disease);
在data=資料檔,這後面主要放前面步驟透過output所輸出的檔案,因此目前所放的為「outp_age」和「outp_bw」兩個檔案。libname myxls "c:\myexcel.xls";
data temp1;
set myxls."Sheet1$"n;
run;
libname myxls clear;