2008年1月18日 星期五

繪製時間圖

原文出處:http://www2.sas.com/proceedings/forum2007/029-2007.pdf




雖然SAS提供有利的函數LAG,有利於對有重複相關的觀察值來做時間上的差值計算,例如第一筆與第二筆觀察值是同一個人只是時間上的前後,所以可以利用LAG函數來做時間差計算
所以原作者Pon Su提供一種方便的計算方式,並利用SAS的程序PROC TIMEPLOT來美化時間資料
以下為作者提供之範例可供使用者直接套用練習

options center nodate nonumber ls=64;
data temp;
input id startdt:mmddyy8. stopdt:mmddyy8. ;
datalines;
101 01/01/05 01/09/05
101 01/05/05 01/20/05
101 01/16/05 01/18/05
101 01/26/05 01/31/05
102 01/01/05 01/07/05
102 01/05/05 01/07/05
102 01/06/05 01/17/05
102 01/14/05 01/27/05
102 01/29/05 01/31/05
;
run;

*範例中可以看到編號(ID)中有前後兩個時間點資料,並以下方語法做處理,而重點在於使用了LAG函數來加以處理時間資料;
data temp1;
set temp;
format startdt stopdt lagstop mmddyy8. ;
real_days = stopdt - startdt + 1;
lagstop =lag(stopdt);
if id = lag(id) then
if lagstop >= stopdt then
real_days = 0;
else if lagstop >= startdt then
real_days = stopdt - lagstop;
run;

****************************************************************************;
* The following comments are copied from SAS Procedure Guide manuals. ;
* The TIMEPLOT procedure plots one or more variables over time intervals. ;
* OVERLAY plots all requests in one plot statement on one set of axes. ;
* HILOC connects the leftmost plotting symbol to the rightmost with hyphens.;
****************************************************************************;
title "SGF 2007 Coders' Corner Demo";
*並將上述時間處理呈現出來,利用了以下語法PROC TIMEPLOT;
proc timeplot data=temp1;
plot startdt ='<' stopdt='>' / overlay ref='15JAN05'd hiloc;
by id;
run;

*作者再簡單的將時間資料做呈現;
proc print data=temp1;
run;

proc sql;
select id, sum(real_days) as duration_in_days
from temp1
group by id
order by id;
quit;


最後如下圖





以下為我適度修改後的說明
1.時間資料的建立

data king1;
input ID Pretime: mmddyy10. Posttime: mmddyy10. ;
cards;
1 01/01/2006 05/01/2006
1 05/02/2006 01/01/2007
1 12/01/2006 01/15/2008
2 12/05/2005 01/06/2007
2 09/16/2007 12/02/2007
2 11/29/2007 01/15/2008
3 01/01/2005 01/02/2008
3 04/04/2006 01/15/2008
3 02/01/2007 01/02/2008
;
proc print;
run;


需要先宣告時間變項的時間格式如mmddyy8.或是mmddyy10.,而主要目的是先將資料轉為SAS的內置日期(1960年1月1日為起始)距離今天的"日數",例如時間為01/22/1977以mmddyy10.為格式,則SAS內建日期為6231日,而其他日期格式請參考SAS說明
以上是建立時間之資料方式,若使用者有自行的時間資料時,只要能夠轉換為SAS內建日期就可以直接接續下一步了

2.時間資料繪製

proc timeplot data=king1;
plot Pretime ='<' posttime='>' / overlay ref='15JAN05'd hiloc;
by id;
run;


其中overlay是用在圖的重疊(若是使用proc gplot有多張點圖重疊),在此是將時間圖畫的Pretime與posttime重疊起來,如<_____>
ref='15JAN05'd為時間基準線,只要修改引號內的時間(date.)
hiloc為重疊後將時間用連接線連起來,如<--------->

沒有留言: