公告

[公告]
2014/01/17
由於已經是faculty的關係,不太有足夠時間寫部落格。因此更新的速度會相當緩慢。再加上近幾年來SAS GLOBAL FORUM沒有出現讓我覺得驚艷的技術文件,所以能分享的文章相對也減少許多。若有人推薦值得分享的SAS技術文件,請利用『問題討論區』告知。

2013/07/19
臉書留言板的功能因為有不明原因故障,因此特此移除。而intensedebate的留言板因管理不易,也一併移除。目前已經開啟內建的 G+ 留言系統,所以請有需要留言的朋友,可直接至『問題討論區』裡面留言。


2007年6月11日 星期一

Saving Trees with Output Delivery System (ODS)

原文載點:http://www2.sas.com/proceedings/forum2007/057-2007.pdf

一般人在配適模式的時候,可能由於變數很多,所以整個報表落落長。大家比較會注重最後的參數估計表,笨方法就是找到那個表格然後剪下來貼在其他的文書處理軟體中,聰明的人會用 ODS 把那個表格單獨存成 rtf 檔。但如果要配適的模式很多,要用到很多 procedure,最好還是用一些 macro 來解決冗長的程式碼。Angelina D. Tan, Nancy Dilehl, Jay N. Mandrekar 在 SAS Global Forum 2007 (SUGI 今年把名稱改成 SAS Global Forum了)中發表了三個「懶人 macro 包」,讓懶得寫那麼多 SAS code 的人能夠輕鬆配適模式,並且用 ODS 和 proc report 把參數估計表美美的存出來。

Regression model

macro 程式如下:
%macro pReg (dsn=, varlist=, numvars=, respvar=, outdsn=table);
%do j=1 %to &numvars.;
%let var2=%scan(&varlist.,&j.,' ');

ods select none;
ods output ParameterEstimates=work.pe&j. ;
proc reg data=&dsn.;
model &respvar. = &var2. ;
run;
ods select all;
data pe&j.;
set pe&j.;
keep Variable Estimate StdErr tValue Probt ;
if Variable="Intercept" then delete;
run;
%if &j.=1 %then %do;
data &outdsn.;
set pe1;
run;
%end;
%else %do;
data &outdsn.;
set &outdsn. pe&j.;
run;
%end;
%end;
%mend pReg;


這個 macro 包含五個參數:
  • dsn = 輸入資料來源檔
  • varlist = 自變數
  • numvars = 自變數個數
  • respvar = 依變數
  • outdsn = 輸出參數估計表的資料檔名(預設值=table)
使用範例:
%pReg (dsn =tana.fitness,
Varlist =Age Weight RunTime RunPulse RestPulse MaxPulse,
numvars =6,
respvar =Oxygen,
outdsn =preg);


此範例是使用在 tana 這個 library 裡面的 fitness 資料檔。自變數是 Age、Weight、RunTime、RunPulse、RestPulse 和 MaxPulse 共計六個。依變數是 Oxygen,而參數估計表則另存到 preg 這個資料檔裡面。

然後便可以用下面這個 prog report 指令把參數估計表很完美地打印在 preg.doc 這個檔案裡面。我建議使用者不用太需要理會裡面的設定,只要記得把 ods rtf 後面的設定改成你要的路徑和檔名即可。當然如果你想要用別的 title 的話也可以把 title1 後面那串字改掉。不過基本上其他的程式碼都不需要變動。

ods rtf file='h:\ibm\preg.doc';
title1 'Simple Linear Regression Model';
proc report data=preg box nowd split=' ';
column Variable Estimate StdErr tValue Probt ;
define Variable / display;
define Estimate / display;
define StdErr / display;
define tValue / display;
define Probt / display;
compute probt;
if probt <= 0.05 then call define('_c5_','style','style=[font_weight=bold]'); endcomp; run; ods rtf close;




如果你覺得這種兩階段的程式還是太麻煩,可以把上面的 proc report 程序丟進 pReg 裡面,但必須把 ods rtf 那行改成 macro 變數: ods rtf file="&filename"; 並將 macro 程式第一行改成: %macro pReg (dsn=, varlist=, numvars=, respvar=, outdsn=table, filename);

Logistic regression model

macro 程式如下:
%macro pLogistic (dsn=, varlist=, numvars=, respvar=, outdsn=table);
%do j=1 %to &numvars.;
%let var2=%upcase(%scan(&varlist.,&amp;amp;amp;amp;j.,' '));
ods select none;
ods output ParameterEstimates=work.pe&j. OddsRatios=work.or&amp;amp;amp;amp;j. ;
proc logistic data= &dsn. descending;
model &respvar.= &amp;amp;amp;amp;var2. /link=logit ;
run;
ods select all;
data pe&j.;
length Independent $20;
set pe&j.;
rename ProbChiSq=Waldp;
keep Independent Estimate StdErr WaldChiSq ProbChiSq;
Independent="&var2.";
if upcase(Variable)="&var2.";
run;
proc sort data=pe&j.;
by Independent;
run;
data or&j;
length Independent $20;
set or&j.;
rename OddsRatioEst=OREst;
keep Independent OddsRatioEst LowerCL UpperCL;
Independent="&var2.";
if upcase(Effect)="&var2.";
run;
proc sort data=or&j.;
by Independent;
run;
data all&j.;
merge pe&j. or&amp;amp;amp;amp;j.;
by Independent;
run;
%if &j.=1 %then %do;
data &outdsn.;
set all1;
run;
%end;
%else %do;
data &outdsn.;
set &outdsn. all&amp;amp;amp;amp;j;
run;
%end;
%end;
%mend pLogistic;


同樣有五個參數,定義完全和 pReg 雷同。在此不多加描述。

使用範例如下:
%pLogistic (dsn =tana.icu,
Varlist =AGE SEX SER CAN CRN INF CPR SYS HRA PRE TYP FRA PO2 PH PCO BIC CRE,
Numvars =17,
Respvar =STA,
outdsn =plog);


然後用 proc report 列印參數估計表:
ods rtf file=''h:\ibm\plogistic.doc';
title1 'Univariate Logistic regression for endpoint status (Lived, Died)';
proc report data=plog box nowd split=' ';
column Independent Estimate StdErr WaldChiSq Waldp OREst LowerCL
UpperCL;
define Estimate / display;
define StdErr / display;
define WaldChiSq / display;
define Waldp / display;
define OREst / display;
define LowerCL / display;
define UpperCL / display;
compute orest;
if waldp <0.05> 1 then do;
call define('_c5_','style','style=[background=yellow]');
call define('_c6_','style','style=[background=yellow]');
end;
endcomp;
run;
ods rtf close;


這個打印出來的參數估計表比較炫,會把顯著的參數用高亮度的黃色標記出來。



Cox PH model

macro 程式如下:
%macro phReg (dsn=, varlist=, numvars=, respvar=, censvar=, censval=,
outdsn=table);
%do j=1 %to &numvars.;
%let var2=%upcase(%scan(&varlist.,&amp;amp;amp;amp;j.,' '));
ods select none;
ods output ParameterEstimates=work.pe&j.;
proc phreg data = &dsn. ;
model &respvar.*&censvar.(&censval.)= &amp;amp;amp;amp;amp;var2./rl;
run;
ods select all;
data pe&j.;
length Independent $15 ;
set pe&j.;
keep Estimate StdErr Independent ProbChiSq HazardRatio
HRLowerCL HRUpperCL;
Independent="&var2.";
if upcase(Variable)="&var2.";
run;
proc sort data=pe&j.;
by Independent;
run;
data all&j.;
merge pe&j. ;
by Independent;
run;
%if &j.=1 %then %do;
data &outdsn.;
set all1;
run;
%end;
%else %do;
data &outdsn.;
set &outdsn. all&amp;amp;amp;amp;j.;
run;
%end;
%end;
%mend phReg;


這個 macro 使用到的參數有七個:
  • dsn = 資料來源檔
  • Varlist = 自變數名稱
  • Numvars = 自變數個數
  • RespVar = 依變數
  • CesnVar = 設限變數名稱
  • CensVal = 設限變數值
  • outdsn = 輸出參數估計表的資料檔名(預設值=table)
使用範例如下:
%phReg (dsn =tana.Myeloma,
Varlist =LogBUN HGB Platelet Age LogWBC Frac LogPBM Protein
SCalc,
Numvars =9,
Respvar =Time,
Censvar =VStatus,
Censval =0,
outdsn =phreg);


最後還是要用 ODS 和 proc report 把參數估計表存出來:
ods rtf file=''h:\ibm\phreg.doc';
title1 'Univariate PHREG for endpoint status (Alive, Dead)';
proc report data=phreg box nowd split=' ';
column Independent Estimate StdErr ProbChiSq HazardRatio
HRLowerCL HRUpperCL;
define Independent / display;
define Estimate / display;
define StdErr / display;
define ProbChiSq / display;
define HazardRatio / display;
define HRLowerCL / display;
define HRUpperCL / display;
compute probchisq;
if probchisq <= 0.05 then call define('_c4_','style','style=[font_weight=bold font_style=italic]');
endcomp;
run;
ods rtf close;




CONTACT INFORMATION
Your comments and questions are valued and encouraged. Contact the author at:
Angelina Tan
Mayo Clinic, Division of Biostatistics
200 First Street SW
Rochester MN 55905
Phone: 507-284 5743
Fax: 507-266 2477
Email: tan.angelina@mayo.edu
CODE { display: block; /* fixes a strange ie margin bug */ font-family: Courier New; font-size: 8pt; overflow:auto; background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y; border: 1px solid #ccc; padding: 10px 10px 10px 21px; max-height:200px; height:200px; // for IE6 line-height: 1.2em; }