在SAS中作相关矩阵图

Corrgrams (Corrgrams: Exploratory displays for correlation matrices,Friendly,2002)中提供了作相关矩阵图像的方法。我的方法是先用gplot作出图中的圆心,然后利用gplot中的标注(annotate)作出圆及扇形。其中红色表示两个变量正相关,而蓝色表示负相关。最后将坐标系的颜色设为白色。

其结果如下示意。

gplot

代码如下。

%macro     plotgraph(corrdata);
%let radius=8;

data corrmatrix(drop= _TYPE_ _NAME_);
    set &corrdata(firstobs=4);
run;

proc sql noprint;
select count(name) into :nvars
    from dictionary.columns
    where libname=upcase("work") and memname=upcase("corrmatrix");
select name into :name1-:name%left(&nvars)
       from dictionary.columns
    where libname=upcase("work") and memname=upcase("corrmatrix");
Quit;

data corrdata(keep=corr);
    set corrmatrix;
    %do i=1 %to &nvars;
        corr=&&name&i;
        output;
    %end;
run;

%annomac;
data annodata;
    set corrdata;
    retain xsys ysys '2' hsys '3';
    center_x=mod(_N_-1,&nvars);
        center_y=&nvars-ceil(_N_/&nvars);
        if _N_<=&nvars then do;
            function='label';
            color='black';
            x=center_x;y=center_y+0.8;
            style='SIMPLEX';
            size=3;
            rotate=0;
            text=symget('name'||left(_N_));
            output;
            function='label';
            color='black';
            x=-0.8;y=&nvars-_N_;
            style='SIMPLEX';
            size=3;
            rotate=0;
            text=symget('name'||left(_N_));
            output;
        end;       
        %circle(center_x,center_y,&radius,black);       
        if corr >0 then do;
            x=center_x;
            y=center_y;
            angle=0;
            rotate=corr*360;   
            size=&radius;
            color='red';
            style='p3n45';
            line=3;
            output;   
        end;
        else do;
            x=center_x;
            y=center_y;
            angle=0;
            rotate=abs(corr)*360;   
            size=&radius;
            color='blue';
            style='p3n45';
            line=3;   
            output;
        end;
run;

/*remove duplicates*/
proc sql noprint;
create table plotdata as
    select distinct center_x,center_y
    from annodata;
quit;

goption reset=all;
goption device=gif hsize=400 pt vsize=400 pt;
symbol1 v=point;
AXIS1  ORDER =(-1 TO &nvars BY 1) origin=(10 pct,10 pct)
        COLOR=white;/*disappear the axis*/
proc gplot data=plotdata;
plot center_y*center_x/ haxis=axis1 vaxis=axis1
                        nolegend
                        annotate=annodata;
run;
quit;
%mend;
%macro corrgraph(libname,dataset);
proc sql noprint;
    select count(name) into :nvars
    from dictionary.columns
    where libname=upcase("&libname") and memname=upcase("&dataset");
       select name into :varname separated by ' '
    from dictionary.columns
    where libname=upcase("&libname") and memname=upcase("&dataset");   
quit;
proc corr data=&dataset pearson spearman hoeffding
                           outp=Pearson_data outs=Spearman_data
                        outh=Hoeffding_data;
var &varname;
run;
/*can add other correlation graph*/
%plotgraph(Pearson_data);
/*%plotgraph(Spearman_data);
%plotgraph(Hoeffding_data);*/
%mend;

示例如下:

data fitness;
   input Age Weight Runtime Oxygen @@;
   datalines;
57 73.37 12.63 39.407   54 79.38 11.17 46.080
52 76.32 9.63  45.441   50 70.87 8.92    .
51 67.25 11.08 45.118   54 91.63 12.88 39.203
51 73.71 10.47 45.790   57 59.08 9.93  50.545
49 76.32  .    48.673   48 61.24 11.5  47.920
52 82.78 10.5  47.467   44 73.03 10.13 50.541
45 87.66 14.03 37.388   45 66.45 11.12 44.754
47 79.15 10.6  47.273   54 83.12 10.33 51.855
49 81.42 8.95  40.836   51 77.91 10.00 46.672
48 91.63 10.25 46.774   49 73.37 10.08 50.388
44 89.47 11.37 44.609   40 75.07 10.07 45.313
44 85.84 8.65  54.297   42 68.15 8.17  59.571
38 89.02 9.22  49.874   47 77.45 11.63 44.811
40 75.98 11.95 45.681   43 81.19 10.85 49.091
44 81.42 13.08 39.442   38 81.87 8.63  60.055
;
run;

调用过程:

%corrgraph(work,fitness);

 

转载于:https://www.cnblogs.com/zgw21cn/archive/2010/05/27/1745448.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值