基于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;
我有一个 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;