在SAS中计算移动平均数

在SAS中计算移动平均数,sas,moving-average,Sas,Moving Average,我是SAS的新手,需要根据变量计算移动平均值。 我制作了一些示例代码来解释: DATA testData; input shop year sales; datalines; 01 01 20000 01 02 23500 01 03 21020 02 01 23664 02 02 15420 02 03 14200 03 01 25623 03 02 12500 03 03 20030 ; run; DATA average; retain y 0; set testData; y = y

我是SAS的新手,需要根据变量计算移动平均值。 我制作了一些示例代码来解释:

DATA testData;
input shop year sales;
datalines;
01 01 20000
01 02 23500
01 03 21020
02 01 23664
02 02 15420
02 03 14200
03 01 25623
03 02 12500
03 03 20030
;
run; 

DATA average;
retain y 0;
set testData;
y = y + sales;
avg = y/_n_;
run;

这是我所有销售额的平均值。我想做的是只得到每家店的平均值,基于去年,然后是该店的所有年份。然后再去下一家店。希望这有点道理。我不希望1号店的任何一年的移动平均值影响2号店的平均值。

你需要做的是在每次开始计算新店铺时重置平均值。您还需要使用自己的记录计数器。以下是改进后的代码:

DATA testData;
    input shop year sales;
    datalines;
01 01 20000
01 02 23500
01 03 21020
02 01 23664
02 02 15420
02 03 14200
03 01 25623
03 02 12500
03 03 20030
;
run;

PROC SORT DATA=WORK.TESTDATA
    OUT=Sorted;
    BY shop year;
RUN;

DATA average (drop=n);
    set Sorted;
    by shop; 
    if first.shop then
        do;
            y = 0;
            n = 0;
        end;
    n + 1;
    y + sales;
    avg = y/n;
run;
另外,请注意,如果您将sum语句表示为“i+y”而不是“i=i+y”,则不需要retain语句

有关分组依据的更多信息,请参见此

结果:


你需要做的是在每次开始计算新店时重置平均值。您还需要使用自己的记录计数器。以下是改进后的代码:

DATA testData;
    input shop year sales;
    datalines;
01 01 20000
01 02 23500
01 03 21020
02 01 23664
02 02 15420
02 03 14200
03 01 25623
03 02 12500
03 03 20030
;
run;

PROC SORT DATA=WORK.TESTDATA
    OUT=Sorted;
    BY shop year;
RUN;

DATA average (drop=n);
    set Sorted;
    by shop; 
    if first.shop then
        do;
            y = 0;
            n = 0;
        end;
    n + 1;
    y + sales;
    avg = y/n;
run;
另外,请注意,如果您将sum语句表示为“i+y”而不是“i=i+y”,则不需要retain语句

有关分组依据的更多信息,请参见此

结果:


从技术上讲,您是在计算累积平均值,而不是移动平均值(移动平均值使用相同的时段数,但每次都会移动)。这很容易在数据步骤中编码,如@vasilij所示。移动平均比编码更复杂,但只要您拥有SAS ETS许可证,使用
proc expand
即可轻松完成。您应该查看proc MEANS和WAYS and TYPES语句。它们允许您控制结果的级别。我认为从长远来看,这可能是一个比数据步骤更好的解决方案。从技术上讲,你是在计算累积平均数,而不是移动平均数(移动平均数使用相同的周期数,但每次都在移动)。这很容易在数据步骤中编码,如@vasilij所示。移动平均比编码更复杂,但只要您拥有SAS ETS许可证,使用
proc expand
即可轻松完成。您应该查看proc MEANS和WAYS and TYPES语句。它们允许您控制结果的级别。我认为从长远来看,这可能是一个比数据步骤更好的解决方案。