计算SAS中事件窗口的相关性和协方差

时间:2014-05-02 12:35:15

标签: sas covariance correlation

我必须计算事件窗口的每日销售价值的相关性和协方差。事件窗口为45天,我的数据看起来像 -

store_id    date       sales
5927    12-Jan-07    3,714.00
5927    12-Jan-07    3,259.00
5927    14-Jan-07    3,787.00
5927    14-Jan-07    3,480.00
5927    17-Jan-07    3,646.00
5927    17-Jan-07    3,316.00
4978    18-Jan-07    3,530.00
4978    18-Jan-07    3,103.00
4978    18-Jan-07    3,026.00
4978    21-Jan-07    3,448.00

现在,对于每个store_id,日期组合,我需要回到45天(我的原始数据集中的每个组合有更多数据)计算销售和滞后(销售)之间的相关性,即一度的自相关。如您所见,日期列不是连续的。所以(日期 - 45)之类的东西不起作用。

我已经到了这一部分 -

data ds1;
  set ds;
  by store_id;
  LAG_SALE = lag(sales);
      IF FIRST.store_idTHEN DO;
      LAG_SALE = .;
      END;
run;

用于计算相关性和协方差 -

proc corr data=ds1 outp=Corr
by store_id date;
      cov;   /**  include covariances **/
var sales lag_sale;
run;

但是如何为每个日期store_id组合插入事件窗口?我的最终输出应该是这样的 -

id    date     corr cov
5927 12-Jan-07 ... ...
5927 14-Jan-07 ... ...

1 个答案:

答案 0 :(得分:1)

以下是我提出的建议:

首先我将日期转换为SAS日期,即自1960年1月1日以来的天数:

data ds;
    set ds (rename=(date=old_date));
    date = input(old_date, date11.);
    drop old_date;
run;

然后计算lag_sale(我使用你在问题中使用的相同计算,但确保这是你想要做的。对于一些观察,延迟销售是先前记录的日期,但对于一些,它是相同的store_id和日期,只是一个不同的观察。):

proc sort data=ds; by store_id; run;

data ds;
    set ds;
    by store_id;
    lag_sale = lag(sales);
    if first.store_id then lag_sale = .;
run;

然后设置最终数据集:

data final;
    length store_id 8 date 8 cov 8 corr 8;
    if _n_ = 0;
run;

然后创建一个宏,它接受store_id和date并运行proc corr。宏的第一部分仅选择具有该store_id的数据,并且在该日期的过去45天内。然后它运行proc corr。然后它将proc corr格式化为你想要的格式并将结果附加到" final"数据集。

%macro corr(store_id, date);
data ds2;
    set ds;
    where store_id = &store_id and %eval(&date-45) <= date <=&date 
        and lag_sale ne .;
run;

proc corr noprint data=ds2 cov outp=corr;
    by store_id;
    var sales lag_sale;
run;

data corr2;
    set corr;
    where _type_ in ('CORR', 'COV') and _name_ = 'sales';
    retain cov;
    date = &date;
    if _type_ = 'COV' then cov = lag_sale;
    else do;
        corr = lag_sale;
        output;
    end;
    keep store_id date corr cov;
run;

proc append base=final data=corr2 force; run;

%mend corr;

最后为每个store_id / date组合运行宏。

proc sort data=ds out=ds3 nodupkey;
    by store_id date;
run;

data _null_;
    set ds3;
    call execute('%corr('||store_id||','||date||');');
run;

proc sort data=final;
    by store_id date;
run;