0

我正在尝试找到一种使用 SAS do 循环计算移动平均值的方法。我有困难。我基本上想计算一个 4 个单位的移动平均线。

DATA data;
   INPUT a b;
   CARDS;
1 2
3 4 
5 6 
7 8 
9 10
11 12
13 14
15 16
17 18
;
run;    

data test(drop = i);
   set data;
   retain c 0;
   do i = 1 to _n_-4;
      c = (c+a)/4;
   end;
run;

proc print data = test;
run;
4

3 回答 3

1

一种选择是使用先合并:

DATA have;
 INPUT a b;
CARDS;
1 2
3 4 
5 6 
7 8 
9 10
11 12
13 14
15 16
17 18
;
run;

data want;
merge have have(firstobs=2 rename=a=a_1) have(firstobs=3 rename=a=a_2) have(firstobs=4 rename=a=a_3);
c = mean(of a:);
run;

将数据合并到自身,每次合并的数据集推进一个 - 所以第二个从 2 开始,第三个从 3 开始,等等。这会给你所有 4 个“a”在一行上。

于 2013-09-23T16:40:04.243 回答
0

直接来自 Cody 的流行编程任务集合以及如何解决它们。

*Presenting a macro to compute a moving average;


%macro Moving_ave(In_dsn=,     /*Input data set name          */
                  Out_dsn=,    /*Output data set name         */
                  Var=,        /*Variable on which to compute
                                 the average                  */
                  Moving=,     /* Variable for moving average */
                  n=           /* Number of observations on which
                                  to compute the average      */);
   data &Out_dsn;
      set &In_dsn;
        ***compute the lags;
      _x1 = &Var;
      %do i = 1 %to &n - 1;
         %let Num = %eval(&i + 1);
          _x&Num = lag&i(&Var);
      %end;

        ***if the observation number is greater than or equal to the
           number of values needed for the moving average, output;
   if _n_ ge &n then do;
      &Moving = mean (of _x1 - _x&n);
      output;
   end;
   drop _x:;
   run;
%mend Moving_ave;


*Testing the macro;
%moving_Ave(In_dsn=data,
            Out_dsn=test,
            Var=a,
            Moving=Average,
            n=4)
于 2013-09-24T12:53:57.670 回答
0

SAS 有一个 lag() 函数。这样做是创建它所应用的变量的滞后。例如,如果您的数据如下所示:

DATA data;
 INPUT a ;
 CARDS;
1 
2 
3
4
5  
;

然后以下将创建一个滞后一、二、三等变量;

data data2; 
set data;
a_1=lag(a);
a_2=lag2(a);
a_3=lag3(a);
drop b;
run;

将创建以下数据集

a a_1 a_2 a_3
1 . . .
2 1 . .
3 2 1 .
4 3 2 1

等等。移动平均线可以很容易地从这些计算出来。查看http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000212547.htm

(请注意,我没有机会运行这些代码,所以它们可能有错误。)

于 2013-09-24T06:43:30.323 回答