我有一个数据集here。
我的数据摘录如下所示:(有关放大版本:http://puu.sh/79NCK.jpg)
(注意:我的数据集中没有缺少值)
我希望使用1年的滚动窗口来计算相关矩阵。我的期间从2008年1月1日开始。例如,2008年1月1日AUT
和BEL
之间的相关性是使用2007年1月1日至2008年1月1日的一系列值计算的,同样适用于所有其他对。同样,2008年1月2日AUT
和BEL
之间的相关性使用2007年1月2日至2008年1月2日的一系列值计算。
由于每天会有不同的相关矩阵,我想将每天的相关矩阵输出到Excel中的表格中,并将该表格命名为COV1(2008年1月1日),COV2(2008年1月2日),COV3( 2008年1月3日),依此类推至COV1566(2013年12月31日)。每个工作表的输出摘录如下:(注意:标题包含在顶行和第一列)
我已将数据文件加载到名为rolling
的SAS中。目前,我的代码很简单:
proc corr data = mm.rolling;
run;
使用整个系列值简单地计算相关矩阵。我是SAS的新手,任何帮助都会受到赞赏。
答案 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;