使用SAS中的do循环计算移动平均值

时间:2013-09-23 15:53:37

标签: loops sas

我正试图找到一种使用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;

3 个答案:

答案 0 :(得分: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'。

答案 1 :(得分: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

(请注意,我没有机会运行代码,因此可能会有错误。)

答案 2 :(得分: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)