在SAS中构建居中的移动平均窗口

时间:2015-03-16 10:23:57

标签: sas

我正在尝试在SAS中构建中心移动平均线。 我的桌子在下面

   date       number   average
01/01/2015     18       ...
01/01/2015     15       ...
01/01/2015     5        ...
02/01/2015     66       ...
02/01/2015     7        ...
03/01/2015     7        ...
04/01/2015     19       ...
04/01/2015     7        ...
04/01/2015     11       ... 
04/01/2015     17       ...
05/01/2015     3        ...
06/01/2015     7        ...
   ...        ...       ...

我需要获取周围期间(-2,+ 2)天的平均数, 而不是(-2,+ 2)观察结果

我知道对于居中移动平均线,我可以使用。

 convert number=av_number/transformout=(cmovave 3)

但是我们每天都有不同的观察次数。

在这种情况下,任何人都可以告诉我如何仅包含(-2,+ 2)天的居中移动平均线?

提前致谢!

最佳

1 个答案:

答案 0 :(得分:2)

@Joe建议汇总到每日水平是正确的方法,但是你必须要小心,你不会每天丢失参赛人数,否则你不会计算出正确的移动平均线。换句话说,您需要根据当天的条目数量来计算每日价值。

我已经采取了3个步骤来计算移动平均线,有可能在2中进行,但我无法看到。

步骤1是计算每日数量的总和和数量。

步骤2是计算两个变量的移动5天总和。

然后,步骤3将总和除以计数,得到加权的5天平均值。

我已添加trim功能以排除第一个和最后两个记录,显然您可以根据需要添加这些记录。您可能也想删除一些额外的变量。

data have;
input date :ddmmyy10. number;
format date date9.;
datalines;
01/01/2015  18
01/01/2015  15
01/01/2015  5
02/01/2015  66
02/01/2015  7
03/01/2015  7
04/01/2015  19
04/01/2015  7
04/01/2015  11
04/01/2015  17
05/01/2015  3
06/01/2015  7
;
run;

proc summary data=have nway;
class date;
var number;
output out=daily_agg sum=;
run;

proc expand data=daily_agg out=daily_agg_mov_sum;
convert number=tot_number / transformout = (cmovsum 5 trim 2);
convert _freq_=tot_count / transformout = (cmovsum 5 trim 2);
run;

data want;
set daily_agg_mov_sum;
if not missing(tot_number) then av_number = tot_number / tot_count;
run;