2010-03-17 7 views
3

이완 사람은, 내 문제를 명확히 도움이됩니다.SAS에서 이동 평균/표준 편차를 계산 하시겠습니까?</p> <p><a href="http://i40.tinypic.com/mcrnmv.jpg" rel="nofollow noreferrer">http://i40.tinypic.com/mcrnmv.jpg</a> : 나는 스크린 샷을 포함 <p></p>

저는 일종의 이동 평균과 이동 표준 편차를 계산하려고합니다. 것은 실제 값에 대한 변동 계수 (stdev/avg)를 계산하려고합니다. 일반적으로 이것은 지난 5 년간의 표준 편차 및 평균을 계산하여 수행됩니다. 그러나 때로는 지난 5 년 동안의 정보가 없었던 데이터베이스 (아마도 3, 2 등)에 대한 관찰이있을 것입니다. 그래서 전체 5 년 동안 정보가없는 경우에도 평균 및 표준시를 계산하는 코드가 필요합니다.

또한 관찰에서 알 ​​수 있듯이 5 년 넘게 정보를 얻었습니다.이 경우 나는 지난 5 년간 평균 및 표준 편차를 계산할 수있는 이동 평균이 필요합니다. 따라서 회사가 7 년 동안 정보를 가지고 있다면 1997 년 (1991-1996 년), 1998 년 (1992-1997 년) 및 1999 년 (1993-1998 년)과 같이 평균 및 표준을 계산하는 일종의 코드가 필요합니다. 내가 SAS는이 같은 (아주 아주 약) 보일 것입니다 명령에 익숙하지 않아요으로

이 같은

set var 
if year = i then stdev=stdev(year(i-6) untill year(i-1)) and average = avg(year(i-6) untill year(i-1)) 

또는 뭔가, 정말, 나는거야 시도 단서는 아니지만 그것을 파악했다 나가 그것을 나 자신 찾지 않는 경우에 그것을 배치하는 가치가있다.

감사합니다.

답변

0

가독성을 위해 여기에 proc sql을 권하고 싶습니다. 다음을 시도 할 수 있습니다 예를 들어 장 정의 데이터를 사용하여 :

/* test data */ 
data one; 
    input symbol $ value date :date9.; 
    format date date9.; 
cards; 
ABP1 -0.025 18feb1997 
ABP1 0.05 25feb1998 
ABP1 -0.025 05mar1999 
ABP1 0.06 20mar2000 
ABP1 0.25 05mar2001 
ABP1 0.455 07mar2002 
ABP1 0.73 25feb2003 
ABP1 1.01 19feb2004 
ABP1 1.25 16feb2005 
ABP1 1.65 09feb2006 
ABP1 1.87 08feb2007 
ABT 0.555 14jan1991 
ABT 0.6375 14jan1992 
ABT 0.73 16jan1993 
; 
run; 

proc sql; 
    create table two as 
    select distinct 
     a.symbol, 
     b.value, 
     year(a.date) as year, 
     b.date as date5 
    from 
     one a, 
     one b 
    where 
      a.symbol=b.symbol 
     and intck('year',b.date,a.date) between 1 and 5 
    order by 
     a.symbol, 
     year, 
     date5; 
quit; 

proc sql; 
    create table three as 
    select distinct 
     symbol, 
     year, 
     count(symbol) as n5, 
     avg(value) as avg5, 
     std(value) as std5 
    from 
     two 
    group by 
     symbol, 
     year; 
quit; 
1

여기에는 한 가지 방법이 있습니다. 희망이 도움이됩니다.

/* test data */ 
data one; 
    input symbol $ value date :date9.; 
    format date date9.; 
cards; 
ABP1 -0.025 18feb1997 
ABP1 0.05 25feb1998 
ABP1 -0.025 05mar1999 
ABP1 0.06 20mar2000 
ABP1 0.25 05mar2001 
ABP1 0.455 07mar2002 
ABP1 0.73 25feb2003 
ABP1 1.01 19feb2004 
ABP1 1.25 16feb2005 
ABP1 1.65 09feb2006 
ABP1 1.87 08feb2007 
ABT 0.555 14jan1991 
ABT 0.6375 14jan1992 
ABT 0.73 16jan1993 
; 
run; 

/* 5 year moving avg, stdev, cv assuming: 
    one obs per year from 1990 to 2010. 
    observations are already in the sorted order by symbol. */ 
%let START = 1990; 
%let FINISH = 2010; 

data two; 
    array val[%eval(&START-3):&FINISH] val1-val3 val&START-val&FINISH; 
    call missing(of val&START-val&FINISH); 
    do until (last.symbol); 
    set one; 
    by symbol; 
    year = year(date); 
    if &START<=year<=&FINISH then val[year] = value; 
    end; 
    do year = %eval(&START+2) to &FINISH; 
     avg5 = mean(val[year-5],val[year-4],val[year-3],val[year-2],val[year-1]); 
     std5 = std(val[year-5],val[year-4],val[year-3],val[year-2],val[year-1]); 
     cv5 = divide(std5,avg5); 
     if not missing(cv5) then output; 
    end; 
    keep symbol year avg5 std5 cv5; 
run; 

/* check */ 
proc print data=two; 
run; 
/* on lst 
Obs symbol year  avg5  std5  cv5 

    1  ABP1  1999 0.01250 0.05303 4.24264 
    2  ABP1  2001 0.01500 0.04637 3.09121 
    3  ABP1  2002 0.06200 0.11251 1.81461 
    4  ABP1  2003 0.15800 0.19457 1.23146 
    5  ABP1  2004 0.29400 0.30597 1.04071 
    6  ABP1  2005 0.50100 0.37786 0.75422 
    7  ABP1  2006 0.73900 0.40448 0.54734 
    8  ABP1  2007 1.01900 0.46185 0.45324 
    9  ABP1  2008 1.30200 0.46338 0.35590 
10  ABP1  2009 1.44500 0.38726 0.26800 
11  ABP1  2010 1.59000 0.31432 0.19769 
12  ABT  1993 0.59625 0.05834 0.09784 
13  ABT  1994 0.64083 0.08755 0.13662 
14  ABT  1995 0.64083 0.08755 0.13662 
15  ABT  1996 0.64083 0.08755 0.13662 
16  ABT  1997 0.68375 0.06541 0.09566 
*/ 
+0

이 완벽하게 – John

3

정확한 방법은 PROC EXPAND를 사용하는 것입니다.

은 당신이 그것으로 사용할 수있는 옵션이 많이 있습니다하지만 당신은 MOVSTD에 대한

PROC EXPAND DATA=TESTTEST OUT=MOVINGAVERAGE; 
CONVERT VAL=AVG/TRANSFORMOUT=(MOVAVE 5); 
RUN; 

마찬가지로 작업을 수행 할 수 있습니다. 누락 된 값을 자동으로 무시하지만 그 동작을 조정할 수도 있습니다.

+0

공정 충분히 workded, 그 PROC는 BASE SAS에 포함되지 않은 EXPAND 몰랐다. 그리고 그렇습니다. 그러면 DATA 단계를 수행하고 평균으로 표준을 나눌 필요가 있습니다. –