计算SAS中的滚动相关性

时间:2014-02-25 09:15:04

标签: sas

我有一个数据集here

我的数据摘录如下所示:(有关放大版本:http://puu.sh/79NCK.jpg

enter image description here

(注意:我的数据集中没有缺少值)

我希望使用1年的滚动窗口来计算相关矩阵。我的期间从2008年1月1日开始。例如,2008年1月1日AUTBEL之间的相关性是使用2007年1月1日至2008年1月1日的一系列值计算的,同样适用于所有其他对。同样,2008年1月2日AUTBEL之间的相关性使用2007年1月2日至2008年1月2日的一系列值计算。

由于每天会有不同的相关矩阵,我想将每天的相关矩阵输出到Excel中的表格中,并将该表格命名为COV1(2008年1月1日),COV2(2008年1月2日),COV3( 2008年1月3日),依此类推至COV1566(2013年12月31日)。每个工作表的输出摘录如下:(注意:标题包含在顶行和第一列)

http://puu.sh/79NAy.jpg

我已将数据文件加载到名为rolling的SAS中。目前,我的代码很简单:

proc corr data = mm.rolling;
run;

使用整个系列值简单地计算相关矩阵。我是SAS的新手,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

想想如果你有足够的耐心,你会怎么做。

proc corr data = mm.rolling out = correlation_as_of_01jan2008;
where date between '01jan2007'd and '01jan2008'd;
run;

类似地,

proc corr data = mm.rolling out = correlation_as_of_02jan2008;
where date between '02jan2007'd and '02jan2008'd;
run;

值得庆幸的是,您可以使用SAS宏编程来实现与此宏中所示类似的效果:

%macro rollingCorrelations(inputDataset=, refDate=);
/*first get a list of unique dates on or after the reference date*/
proc freq data = &inputDataset. noprint;
where date >="&refDate."d;
table date/out = dates(keep = date);
run;


/*for each date calculate what the window range is, here using a year's length*/
data dateRanges(drop = date);
set dates end = endOfFile 
                nobs= numDates;
format toDate fromDate date9.;

toDate=date;
fromDate = intnx('year', toDate, -1, 's');

call symputx(compress("toDate"!!_n_), put(toDate,date9.));
call symputx(compress("fromDate"!!_n_), put(fromDate, date9.) );

/*find how many times(numberOfWindows) we need to iterate through*/
if endOfFile then do;
call symputx("numberOfWindows", numDates);
end;

run;
%do i = 1 %to &numberOfWindows.;
/*create a temporary view which has the filtered data that is passed to PROC CORR*/
data windowedDataview / view = windowedDataview;
set  &inputDataset.;
where date between "&&fromDate&i."d and "&&toDate&i."d;
drop date;
run;
    /*the output dataset from each PROC CORR run will be 
correlation_DDMMMYYY<from date>_DDMMMYY<start date>*/
proc corr data = windowedDataview 
outp = correlations_&&fromDate&i.._&&toDate&i. (where=(_type_ = 'CORR'))

        noprint;
run;

%end;

/*append all datasets into a single table*/
data all_correlations;
format from to date9.;
set correlations_:
     indsname = datasetname
;
from = input(substr(datasetname,19,9),date9.);
to = input(substr(datasetname,29,9), date9.);
run;


%mend rollingCorrelations;
%rollingCorrelations(inputDataset=rolling, refDate=01JAN2008)

上述宏的最终输出将有from&amp; to标识符,用于标识每个相关矩阵所指的日期范围。运行它并检查结果。

我认为excel无论如何都不能容纳超过1500个标签,所以最好把它放在一张桌子里。决赛桌有81K行,整个过程耗时2.5分钟。

更新:按from&amp;进行排序to

proc sort data = ALL_CORRELATIONS;
by from to;
run;