2016-03-09 5 views
0

Я пытаюсь использовать SAS для вычисления скользящей средней для x числа периодов, в которых используются расчетные значения. Например, если у меня есть набор данных с десятью наблюдениями для переменной, и я хотел бы сделать 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