2016-03-09 211 views
0

我正在嘗試使用SAS計算在計算中使用預測值的x個時期的移動平均值。例如,如果我有一個包含10個變量觀測值的數據集,並且我想要做一個3個月的移動平均線。第一個預測值應該是最後3個觀測值的平均值,第二個預測值應該是最後兩個觀測值的平均值和第一個預測值。計算SAS中的移動平均數

+1

請參閱Stu的答案:http://stackoverflow.com/questions/32696053/sas-standard-deviation-on-unfixed-rolling-window。該問題涉及移動標準偏差計算,但移動平均也可以完成。 – DomPazz

回答

0

如果你有這樣的示例數據:

data input; 
infile datalines; 
length product $10 period value 8; 
informat period yymmdd10.; 
format period yymmdd10.; 
input product $ period value; 
datalines; 
car 2016-01-01 10 
car 2015-12-01 20 
car 2015-11-01 30 
car 2015-10-01 40 
car 2015-09-01 30 
car 2015-08-01 15 
; 
run; 

您可以留下參加輸入表本身有一個條件:

input t1 left join input t2 
    on t1.product = t2.product 
    and t2.period between intnx('month',t1.period,-2,'b') and t1.period 
    group by t1.product, t1.period, t1.value 

有了這個,你有t1.value作爲當前值和avg(t2.value)爲3幾個月平均。爲了計算2個月平均變化每一個值的舊的然後previos期缺失值與ifn()功能:

avg(ifn(t2.period >= intnx('month',t1.period,-1,'b'),t2.value,.)) 

全部代碼可能看起來是這樣的:

proc sql; 
    create table want as 
     select t1.product, t1.period, t1.value as currentValue, 
      ifn(count(t2.period)>1,avg(ifn(t2.period >= intnx('month',t1.period,-1,'b'),t2.value,.)),.) as twoMonthsAVG, 
      ifn(count(t2.period)>2,avg(t2.value),.) as threeMonthsAVG 
     from input t1 left join input t2 
      on t1.product = t2.product 
      and t2.period between intnx('month',t1.period,-2,'b') and t1.period 
     group by t1.product, t1.period, t1.value 
    ; 
quit; 

我還添加了count(t2.perion)條件如果我沒有足夠的記錄來計算度量,則返回缺少的值。我的結果集如下所示: enter image description here