SAS ODS and OUTPUT
目錄
前言
SAS 是強大的統計分析軟體,但是有時我們會想要「把分析結果輸出成 SAS data set」,甚至是「儲存至外部環境」,以便做後續處理,這時候我們便需要 SAS ODS (Output Delivery System) 的幫忙。
顧名思義,ODS 是用來處理輸出 (output) 的一套傳輸方式。由於 ODS 同時包含了圖形的輸出處理,本文將著重在介紹輸出結果的部分。
關於 OUTPUT,ODS 能做些什麼呢?
ODS 在輸出分析結果的部分可以做到三件事:
- 輸出分析結果,並存成 SAS data set 形式
- 輸出分析結果,並存成指定的格式,如 pdf、excel、csv、doc、rtf、powerpoint 等
- 留下想要的分析結果
這三件事 ODS 可以獨立操作,也可以合併使用。
ODS 如何輸出資料?
SAS 在一些 procedure 有 OUT= statement 可以將分析結果輸出成 data set,然而並不是所有的 procedure 皆有此 statement。這時候,ODS output 就可以派上用場,他可以「外掛」至所有的 procedure 之上,將所需要的分析結果存成 SAS data set 格式,以便後續再處理。
以下分為三個部分說明,其中,「TRACE statement」是最基本的部分,要「trace」procedure 各個部分的「名稱」及相關資訊,才有辦法輸出相關的分析結果。
0. TRACE statement:追出需要的分析名稱
在執行 ODS OUTPUT 之前,我們需要知道所輸出的「分析的名稱」為何,這時可以利用 ODS TRACE statement:
ods trace on;
proc univariate data=sashelp.cars;
var msrp;
run;
ods trace off;
↑↑↑ 上述由 ODS 所形成的「三明治」語法可拆解為:
- 開啟 ODS TRACE statement
- 引入欲分析 procedure。這裡以 SAS 內建的資料 CARS 為例,請 SAS 給出變項 msrp (建議售價) 的單變項分析
- 關閉 ODS TRACE statement
此時在「日誌」可以看到有五個部分的結果:
可以注意到的是,這五個輸出對應上 SAS 的分析結果 (Result),名稱和標籤指示所對應的分析結果,範本則表示在此使用 SAS 內建的範本呈現分析的風格 (style),可自行修訂。路徑則是由 SAS procedure 加上所指定變項及分析項目所組成。
1. ODS OUTPUT:把結果輸出成 SAS data set
知道了我們想要輸出的「名稱」後,接下來「任何 SAS procedure 的統計分析」內容都可利用 ODS OUTPUT 來指定想要輸出的結果:
ods output Moments=iam_moments; /* 輸出「動差 moments」=自行指定 資料集的名稱*/
proc univariate data=sashelp.cars; /*所要執行的分析*/
var msrp;
run;
ods output close;
↓↓↓此時可以得到和分析結果完全一樣的 SAS data set,其檔案名稱為(自行指定的) iam_moments。
VarName | Label1 | cValue1 | nValue1 | Label2 | cValue2 | nValue2 |
---|---|---|---|---|---|---|
MSRP | N | 428 | 428.000000 | 總和權重 | 428 | 428.000000 |
MSRP | 平均值 | 32774.8551 | 32775 | 總和觀測 | 14027638 | 14027638 |
MSRP | 標準差 | 19431.7167 | 19432 | 變異數 | 377591613 | 377591613 |
MSRP | 偏態 | 2.79809927 | 2.798099 | 峰度 | 13.8792055 | 13.879206 |
MSRP | 未校正平方和 | 6.20985E11 | 620985422112 | 校正平方和 | 1.61232E11 | 161231618703 |
MSRP | 變異係數 | 59.2884899 | 59.288490 | 標準誤差平均值 | 939.267478 | 939.267478 |
如果我們想一次指定二個變數的話:
ods output Moments=iam_moments2;
proc univariate data=sashelp.cars;
var msrp horsepower;
run;
ods output close;
↓↓↓可以看到 VarName 多了第二個指定變項 Horsepower 在同一個 SAS data set裡。
VarName | Label1 | cValue1 | nValue1 | Label2 | cValue2 | nValue2 |
---|---|---|---|---|---|---|
MSRP | N | 428 | 428.000000 | 總和權重 | 428 | 428.000000 |
MSRP | 平均值 | 32774.8551 | 32775 | 總和觀測 | 14027638 | 14027638 |
MSRP | 標準差 | 19431.7167 | 19432 | 變異數 | 377591613 | 377591613 |
MSRP | 偏態 | 2.79809927 | 2.798099 | 峰度 | 13.8792055 | 13.879206 |
MSRP | 未校正平方和 | 6.20985E11 | 620985422112 | 校正平方和 | 1.61232E11 | 161231618703 |
MSRP | 變異係數 | 59.2884899 | 59.288490 | 標準誤差平均值 | 939.267478 | 939.267478 |
Horsepower | N | 428 | 428.000000 | 總和權重 | 428 | 428.000000 |
Horsepower | 平均值 | 215.885514 | 215.885514 | 總和觀測 | 92399 | 92399 |
Horsepower | 標準差 | 71.8360316 | 71.836032 | 變異數 | 5160.41543 | 5160.415434 |
Horsepower | 偏態 | 0.93033074 | 0.930331 | 峰度 | 1.55215863 | 1.552159 |
Horsepower | 未校正平方和 | 22151103 | 22151103 | 校正平方和 | 2203497.39 | 2203497 |
Horsepower | 變異係數 | 33.2750587 | 33.275059 | 標準誤差平均值 | 3.47232565 | 3.472326 |
2. ODS EXCEL / ODS PDF etc.:輸出你想要的文件格式
有時候我們想要輸出 SAS data set 以外的格式,例如 excel、PDF 或 RTF等,這時候只需要利用 ODS statement 告訴 SAS 我們需要的格式即可:
ods listing close;
ods excel file=’D:\survival analysis.xlsx’;
proc phreg data=sashelp.bmt;
class group;
model t*status(0)=group;
run;
ods excel close;
ods listing;
Note:
ods listing close → 關閉 SAS listing。SAS 預設會將結果輸出成 html 與 listing (列表)。停止傳送結果到 listing 可節省系統資源
ods excel file= → 指定輸出結果印列到 excel 檔
ods excel close → 結束 (確認) 輸出結果至 excel 檔
ods listing → 重新打開 SAS listing
此時,SAS ODS 會將 PHREG procedure 的結果儲存到 excel ,並且分別存放在九個分頁裡。
有時候分頁太多,閱讀起來並不容易,這時可以利用 ods excel options 來指定,讓結果存放在同一個分頁裡:
ods listing close;
ods excel file=’D:\HR_output.xlsx’;
ods excel options(sheet_interval=’none’);proc phreg data=sashelp.bmt;
class group;
model t*status(0)=group;
run;
ods excel close;
ods listing;
ODS EXCEL 還可以做許多細部調整,這裡列舉一些常用的 options:
ods listing close;
ods excel file=’D:\print_output.xlsx’;
ods excel options(
sheet_name=’weight of students’
embedded_titles=’yes’
autofilter=’1-5′
hidden_columns=’4,5′);
proc print data=sashelp.class;
title ‘我就胖’;
run;
ods excel close;
ods listing;
Note:
sheet_name= → 指定分頁名稱
embedded_titles → 是否顯示 title
autofilter → 指定欲篩選之欄位
hidden_columns → 指定欲隱藏之欄位
3. ODS SELECT/EXCLUDE statement:自由選擇想要留下的分析結果
ODS 可以讓我們自由選擇輸出的檔案格式,那麼,輸出的內容是否也可以呢?答案是肯定的。
同樣以 SAS 內建的 BMT 資料集為例,如果我們只想知道 cox regression 所得到的風險 (Hazard Ratio) 為何時:
ods select → 選擇要呈現的分析內容
由 ODS TRACE 我們知道,Hazard ratio 所代表的名稱是「ParameterEstimates」。
接著,我們利用 ODS select 選擇只呈現 Hazard ratio 的分析內容,再上述的合併 ODS excel statement 將結果列印在 excel 檔:
ods listing close;
ods select ParameterEstimates;
ods excel file=’D:\HR_output2.xlsx’;
ods excel options(
sheet_name=’hazard ratio’
embedded_titles=’yes’);
proc phreg data=sashelp.bmt;
class group;
model t*status(0)=group/rl;
title ‘risk estimate of All and AML-High Risk groups’;
where group in (‘ALL’ ‘AML-High Risk’);
run;
ods excel close;
ods listing;
這裡可以注意到,不只分頁名稱可自由指定,「title」也同時顯示在結果上方,這對於 subgroup 分析時不同分析族群的辨識相當有幫助。
如果只想要排除某個分析結果的時候,以 ODS exclude 做反向選擇即可:
ods exclude ClassLevel ConvergenceStatus;
proc phreg data=sashelp.bmt;
class group;
model t*status(0)=group/rl;
title ‘risk estimate of All and AML-High Risk groups’;
where group in (‘ALL’ ‘AML-High Risk’);
run;
結語
SAS ODS 提供了我們自由指定輸出結果的方式,靈活應用 ODS 可為我們節省許多時間和系統資源。對於同時有大量分析的情況下特別的有效,減少眼花撩亂的分析結果、有效增進閱讀性,幫助我們大幅提升效率。