【问题标题】:Calculating rolling correlations in SAS在 SAS 中计算滚动相关性
【发布时间】:2014-02-25 09:15:03
【问题描述】:

我有一个数据集here

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

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

我希望使用 1 年的滚动窗口来计算相关矩阵。我的时期从 2008 年 1 月 1 日开始。例如,2008 年 1 月 1 日 AUTBEL 之间的相关性是使用从 2007 年 1 月 1 日到 2008 年 1 月 1 日的一系列值计算的,对于所有其他货币对也是如此。同样,AUTBEL 在 2008 年 1 月 2 日之间的相关性是使用从 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 很陌生,任何帮助将不胜感激。

【问题讨论】:

    标签: sas


    【解决方案1】:

    想想如果你有极大的耐心,你会怎么做。

    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)
    

    上述宏的最终输出将具有fromto 标识符,以标识每个相关矩阵所指的日期范围。运行它并检查结果。

    我不认为 excel 可以容纳超过 1500 个标签,所以最好将它保存在一个表中。决赛桌有 81K 行,整个过程在 2.5 分钟内运行。

    更新:按fromto 对它们进行排序

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

    【讨论】:

    • 谢谢你,多么彻底的回答。我尝试运行代码,但出现错误:WARNING: Apparent symbolic reference NUMBEROFWINDOWS no resolved. ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was: &amp;numberOfWindowss. ERROR: The %TO value of the %DO I loop is invalid. ERROR: The macro ROLLINGCORRELATIONS will stop executing.
    • 我认为那是因为我在%do i = 1 %to &amp;numberOfWindows.; 行上方缺少run; 语句。现已修复,请重试。
    • 谢谢,代码现在可以使用了。但是,我现在正在查看输出,并且似乎缺少值,例如,从 08 年 4 月 1 日到 09 年 4 月 1 日,具有ALPHA 与所有其他对的相关性的行是缺失值,这应该'不会发生,因为我的数据集中没有丢失的数据。另外我想知道是否可以稍微调整输出,以便根据“to”日期排序,即第一个相关矩阵应该是 01JAN08,第二个应该是 02JAN08,等等。目前,输出遵循另一个“顺序”。谢谢!
    • ALPHA01APR200801APR2009 之间出现缺失值的原因是,即使您没有任何缺失值,ALPHA 在此期间的所有行中都为 0意味着它有 0 标准偏差。这将导致相关系数中除以零。公式并导致缺失值。你只需要PROC SORT 以正确的方式订购它们 - 更新了我的答案。
    • 请注意GRE 列和from:11MAR2012to: 11MAR2013 之后的所有句点在该列中都有缺失值。这是因为在您的数据集中 GRE09MAR2012 之后有 0
    猜你喜欢
    • 1970-01-01
    • 2014-01-08
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 2018-03-27
    • 1970-01-01
    相关资源
    最近更新 更多