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