基于SAS中的日期列创建列中类型之间的相关矩阵

Creating a Correlation Matrix between Types in a Column based on Date Column in SAS

我有一个 table 看起来像这样:

product_type    sales   date
A               470     1/1/2017
A               233     1/2/2017
A               312     1/3/2017
A               139     1/4/2017
A               343     1/5/2017
A               234     1/6/2017
B               441     1/1/2017
B               175     1/2/2017
B               293     1/3/2017
B               109     1/4/2017
B               314     1/5/2017
B                55     1/6/2017
C               292     1/1/2017
C               212     1/2/2017
C               372     1/3/2017
C               452     1/4/2017
C               362     1/5/2017
C                 6     1/6/2017

我正在尝试创建一个相关矩阵,根据日期为我提供 product_type 的相关性。我需要我的输出看起来像这样:

    A   B   C
A   1.0 0.8 0.1
B   0.2 1.0 0.2
C   0.6 0.2 1.0

我知道如何做到这一点的唯一方法是创建一个新的 table 将每个 product_type 分成基于日期的列,如下所示:

proc sql;
create table test as
select date
      ,sum(case when product_type = 'A' then sales else . end) as A
      ,sum(case when product_type = 'B' then sales else . end) as B
      ,sum(case when product_type = 'C' then sales else . end) as C
from work.data
group by 1;
quit;

proc corr data=work.test;
run;

这得到了我想要的矩阵,但是 product_types 中有几十个唯一值,为每个值写一行会非常耗时。

我也试过这个:

proc corr data=data;
by product_type notsorted;
run;

但这只是得到日期和销售额之间的相关性,这不是我要找的。

我也试过了:

proc corr data=data;
by date product_type notsorted;
run;

我真的不知道这段代码到底在做什么,但它让我的 SAS 崩溃了。

关于如何使用第一个 table 有效地实现这一点有什么想法吗?

您需要重新格式化您的数据,使每个产品都是一列,然后您才能找到产品之间的相关性。使用 PROC TRANSPOSE 将数据从长数据更改为宽数据,然后使用 PROC CORR 创建矩阵。这可以是完全动态的,因此如果您添加更多 products/dates 它仍然有效。否则,您可以通过上面显示的 SQL 方法手动完成。

编辑:这里是示例代码。

proc sort data=have;
by date product_type;
run;

proc transpose data=have out=wide prefix=PT_;
by date;
var sales;
id product_type;
idlabel product_type;
run;

proc corr data=wide;
var PT_:;
run;