SAS ODS and OUTPUT

前言

SAS 是強大的統計分析軟體,但是有時我們會想要「把分析結果輸出成 SAS data set」,甚至是「儲存至外部環境」,以便做後續處理,這時候我們便需要 SAS ODS (Output Delivery System) 的幫忙。

顧名思義,ODS 是用來處理輸出 (output) 的一套傳輸方式。由於 ODS 同時包含了圖形的輸出處理,本文將著重在介紹輸出結果的部分。


關於 OUTPUT,ODS 能做些什麼呢?

ODS 在輸出分析結果的部分可以做到三件事:

  1. 輸出分析結果,並存成 SAS data set 形式
  2. 輸出分析結果,並存成指定的格式,如 pdf、excel、csv、doc、rtf、powerpoint 等
  3. 留下想要的分析結果

這三件事 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 所形成的「三明治」語法可拆解為:

  1. 開啟 ODS TRACE statement
  2. 引入欲分析 procedure。這裡以 SAS 內建的資料 CARS 為例,請 SAS 給出變項 msrp (建議售價) 的單變項分析
  3. 關閉 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。

VarNameLabel1cValue1nValue1Label2cValue2nValue2
MSRPN428428.000000總和權重428428.000000
MSRP平均值32774.855132775總和觀測1402763814027638
MSRP標準差19431.716719432變異數377591613377591613
MSRP偏態2.798099272.798099峰度13.879205513.879206
MSRP未校正平方和6.20985E11620985422112校正平方和1.61232E11161231618703
MSRP變異係數59.288489959.288490標準誤差平均值939.267478939.267478
SAS data set: iam_moments

如果我們想一次指定二個變數的話:

ods output Moments=iam_moments2;

proc univariate data=sashelp.cars;
var msrp horsepower;
run;

ods output close;

↓↓↓可以看到 VarName 多了第二個指定變項 Horsepower 在同一個 SAS data set裡。

VarNameLabel1cValue1nValue1Label2cValue2nValue2
MSRPN428428.000000總和權重428428.000000
MSRP平均值32774.855132775總和觀測1402763814027638
MSRP標準差19431.716719432變異數377591613377591613
MSRP偏態2.798099272.798099峰度13.879205513.879206
MSRP未校正平方和6.20985E11620985422112校正平方和1.61232E11161231618703
MSRP變異係數59.288489959.288490標準誤差平均值939.267478939.267478
HorsepowerN428428.000000總和權重428428.000000
Horsepower平均值215.885514215.885514總和觀測9239992399
Horsepower標準差71.836031671.836032變異數5160.415435160.415434
Horsepower偏態0.930330740.930331峰度1.552158631.552159
Horsepower未校正平方和2215110322151103校正平方和2203497.392203497
Horsepower變異係數33.275058733.275059標準誤差平均值3.472325653.472326
SAS data set: iam_moments2

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 可為我們節省許多時間和系統資源。對於同時有大量分析的情況下特別的有效,減少眼花撩亂的分析結果、有效增進閱讀性,幫助我們大幅提升效率。

如有任何問題和意見歡迎提出