公告

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

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


2011年6月25日 星期六

Expanding PROC EXPAND

原文載點:http://support.sas.com/resources/papers/proceedings11/417-2011.pdf

PROC EXPAND 程序是 SAS/ETS 裡面其中一個語法,提供許多跟時間相關資料的簡便處理。比方說,將日資料累加成月資料,月資料累加成季資料或年資料,也可以倒過來把季/年資料變成月資料,月資料變成日資料。若遇到缺漏值,該程序可用內插法將資料補齊。也可進行諸如moving average的資料轉換。Bruce Gilsen 在 2011 年的 SAS Global Forum 發表了一篇技術文件,介紹了兩個用 PROC EXPAND 運作的例子。

Calculate an un-weighted quarterly average from monthly data

第一個例子介紹如何將月資料轉成季資料。使用的範例資料如下(部分):
  Obs     date         id   income
    1    20070101    1      1
    2    20070201    1      2
    3    20070301    1     15
    4    20070401    1      4
    5    20070501    1      5
    6    20070601    1     12
    7    20070701    1      7
    8    20070801    1      8
    9    20070901    1      9

程式如下:
proc expand data=one out=two from=month to=quarter ;
      id date;
      by id;
      convert income / method=aggregate observed=average;
run;

紅色部分的 from=month to=quarter 顧名思義就是把資料從月(month)轉成季(quarter)。藍色部分表示轉換的變數為 income,方法為累加(aggregate),最後求出"非加權"平均值(average)。結果如下:
   Obs    id      date     income    income
                                               (expected result)
    1      1    2007:1     6.1333       6
    2      1    2007:2     6.9780       7
    3      1    2007:3     7.9891       8

最後一欄income(expected result)便是所求,不過程式也會把加權後的結果一併列出,即為倒數第二欄的結果。加權的方式是用天數為基準。以第三季(七~九月)結果來看,前三個月的天數分別是31, 31, 30。總計為92天,因此加權平均後的結果是
((31 * 7) + (31 * 8) + (30 * 9)) / 92 = 7.9891

Convert weekly data to a monthly average when the weekly values represent values for seven days

先看一下範例:
   Obs   date       id   income
    1    20070530    1     11
    2    20070606    1     30
    3    20070613    1     50
    4    20070620    1     70
    5    20070627    1     90
    6    20070704    1     50
    7    20070711    1     40
    8    20070718    1    120
    9    20070725    1     80
   10    20070801    1    100
   11    20070808    1      5
   12    20070815    1      7
   13    20070822    1      9
   14    20070829    1     11
   15    20070905    1     24

將週資料轉成月資料的方法同第一個範例:
proc expand data=one out=two from=week to=month ;
      id date;
      by id;
      convert income / observed=average;
run;

結果如下:
   Obs    id      date            income    income
                                                       (expected result)
    1      1    JUN2007      57.093     60
    2      1    JUL2007       75.905     80
    3      1    AUG2007     18.852     12

只要把 from=quarter 改成 from=week 即可。但是加權平均income的數據,是用插補法先將週四至下週二的數據進行插補,然後再做平均。作者提供另一種作法:
data two;
     set one;
     do dailydate = date-6 to date;
       output;  /* transform each weekly observation to 7 daily observations */
     end;
   run;
proc expand data=two out=three from=day to=month ;
      id dailydate;
      by id;
      convert income / observed=average;
run;

這個作法是先將原始的週資料用複製的方法將沒有數字的天數補齊,如下所示:
   Obs   dailydate    id     income
    1    20070524      1       11
    2    20070525      1       11
    3    20070526      1       11
    4    20070527      1       11
    5    20070528      1       11
    6    20070529      1       11
    7    20070530      1       11
    8    20070531      1       30
    9    20070601      1       30
   10    20070602      1       30
   11    20070603      1       30
   12    20070604      1       30
   13    20070605      1       30
   14    20070606      1       30
   15    20070607      1       50
   16    20070608      1       50
   17    20070609      1       50
   18    20070610      1       50
   19    20070611      1       50
   20    20070612      1       50
   21    20070613      1       50
   22    20070614      1       70
   23    20070615      1       70
   24    20070616      1       70
   25    20070617      1       70

然後再把這個日資料換算成月資料即可。

Contact information
Bruce Gilsen
Federal Reserve Board
Mail Stop 157
Washington, DC 20551
e-mail: bruce.gilsen@frb.gov
phone: 202-452-2494.

沒有留言:

張貼留言

要問問題的人請在文章下方的intensedebate欄位留言,請勿使用blogger預設的意見表單。今後用blogger意見表單留言的人我就不回應了。

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; }