基于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的某些部分。请参见上面的代码。