2013-09-23 2 views
0

SAS do 루프를 사용하여 이동 평균을 계산하는 방법을 찾으려고합니다. 나는 어려움을 겪고있다. 본질적으로 4 단위 이동 평균을 계산하려고합니다.SAS에서 do 루프를 사용하여 이동 평균 계산하기

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; 

자체에 데이터를 병합, 병합 된 데이터 집합을 발전 할 때마다 - 그래서 3 2, 세 번째 시작으로 2 시작, 그것은 한 줄에 모두 4 'a'를 제공합니다.

0

SAS에는 lag() 기능이 있습니다. 이것이하는 일은 적용되는 변수의 지연을 만드는 것입니다. 예를 들어 데이터가 다음과 같은 경우 :

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

그러면 다음과 같이 지연 변수 1, 2, 3 등이 생성됩니다.

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)