我必须计算事件窗口的每日销售价值的相关性和协方差。事件窗口为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 ... ...
答案 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;