2015-03-03 82 views
1

嗨有誰知道如何計算每季度接下來四個季度的標準差?謝謝:)SAS前瞻性移動標準差

我嘗試低於: 日期1是SAS在今年迄今爲止,該季度

Proc sql ; create table th.totalroll as 
Select distinct permco, date1 , 
(select std(adjret) from th.returns1 where qtr between 
    intnx('quarter',qtr(date),0) and intnx('quarter', qtr(date),+3)) as  
    TOTALroll From th.returns1 group by permco ,date1; 
    QUIT; 
+1

你有SAS/ETS許可?如果是的話,PROC EXPAND可以爲你計算 – Longfish 2015-03-03 09:24:40

回答

0

很難告訴你是多麼接近,因爲我不能完全肯定你的數據看起來但是這裏假設您每個季度都有多個日期。此變量

data have; 
    format date date9.; 
    do m = 1 to 128; 
    date = intnx('month','01JAN2008'd,m-1); 
    amount = round(ranuni(date)*10); 
    output; 
    end; 
    drop m; 
run; 

使用PROC SQL,創建quarter變量(你可能已經有這個變量?)和組:創建樣本數據。使用having條款將結果限制爲每個季度的第一個日期。

proc sql; 
create table want as 
select 
    yyq(year(t1.date),qtr(t1.date)) as quarter format=yyq., 
    (select std(t2.amount) 
    from have t2 
    where t2.date >= yyq(year(t1.date),qtr(t1.date)) 
    and t2.date < intnx('quarter',yyq(year(t1.date),qtr(t1.date)),4)) as stddev 
from 
    have t1 
group by 
    calculated quarter 
having 
    t1.date = min(t1.date) 
; 
quit; 

您應該可以調整它以適用於您的數據。

0

如果數據集已在季度中,則可以使用proc expand。所以像這樣:

proc expand data=th.returns1 
      out=th.totalroll 
      from=quarter 
      to=quarter; 
    by permco date1;   
    id date; 
    convert adjret=TOTALroll/transformout=(MOVSTD 4); 
run; 

不要忘了先排序你的數據。而MOVSTD會爲您提供向後移動的標準偏差。如果您想要向前移動STD,您可能需要將輸出流轉回4個季度。

爲PROC轉換操作擴大: http://support.sas.com/documentation/cdl/en/etsug/60372/HTML/default/viewer.htm#etsug_expand_sect026.htm