雖然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為重疊後將時間用連接線連起來,如<--------->
沒有留言:
張貼留言