2013-09-23 200 views
0

我正試圖找到一種方法來使用SAS do循環計算移動平均值。我有困難。我基本上想要計算一個4單位移動平均線。使用SAS中的循環計算移動平均值

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; 
+2

首先檢查您是否擁有SAS/ETS許可證,如果是,則PROC EXPAND具有計算移動平均值的功能 – Longfish

回答

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'。

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

(請注意,我沒有得到一個機會來運行代碼,所以他們可能有錯誤。)

0
從流行的編程任務的科迪的收藏

直,以及如何解決這些問題。

*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)