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意見表單留言的人我就不回應了。