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

基于SAS中的日期列在列中的类型之间创建关联矩阵,sas,correlation,Sas,Correlation,我有一张这样的桌子: 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

我有一张这样的桌子:

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
    A   B   C
A   1.0 0.8 0.1
B   0.2 1.0 0.2
C   0.6 0.2 1.0
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_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
    A   B   C
A   1.0 0.8 0.1
B   0.2 1.0 0.2
C   0.6 0.2 1.0
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_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
    A   B   C
A   1.0 0.8 0.1
B   0.2 1.0 0.2
C   0.6 0.2 1.0
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_类型中有几十个唯一的值,为每一个都写一行是非常耗时的

我也试过:

proc corr data=data;
by product_type notsorted;
run;
但这只是得到日期和销售额之间的相关性,这不是我想要的

我也试过这个:

proc corr data=data;
by date product_type notsorted;
run;
我真的不知道这段代码到底在做什么,但它使我的SAS崩溃了


关于如何使用第一个表有效地获取这些信息,您有什么想法吗?

您需要重新格式化数据,以便每个产品都是一列,然后您可以找到产品之间的相关性。使用PROC TRANSPOSE将数据从长变宽,然后使用PROC CORR创建矩阵。这可以是完全动态的,因此如果您添加更多的产品/日期,它仍然可以工作。否则,您可以通过上面显示的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; 

0.8代表什么,即第一行AxB中的第二个值?这是所有日期中A和B之间的相关性吗?@Reeza是的,在所有日期中都是这样。那么我下面的答案是正确的,转置,然后CORR会给你想要的结果。我尝试了很多PROC TRANSPOSE的变体,但我无法让它复制我的示例中PROC SQL的功能。取而代之的是带有col1、col2、col3等的产品类型。我认为SAS正试图在每列之间创建一个相关矩阵。您知道如何使用PROC TRANSPOSE以与PROC SQL相同的格式获取它吗?您很可能错过了PROC TRANSPOSE的某些部分。请参见上面的代码。