多图预警:如何又快又美地用SAS画各种统计图形?
The following article is from 统技思维 Author 谷鸿秋
文章来源: “统技思维”公众号 (微信号:StatsX)。感谢作者授权。
首先,来一些铺垫。
我个人认为秘诀就在这ODS Graphic System里。如果你以前用SAS/Graph模块,转ODS Graphic System吧;如果你以前没用过SAS/Graph模块,那更好,直接来看看如何用ODS Graphic System来玩转各种统计图形。
在ODS Graphic System中,有一个像杜十娘百宝箱一样的Procedure,她的名字就叫Proc Sgplot。常见的统计图形,她几乎都能给我们快速的倒腾出来。在开扒之前,先介绍下Proc Sgplot的构造。
最基本的Proc Sgplot就是一个三段式的夹心饼干。首先是报过程名和数据集名;结尾「run;」申明完成任务;中间的夹心奶油就是告诉SAS你要画什么图。当然,可以配合其他一些语句和选项做些点缀和修饰。
proc sgplot data=dsname;
plot statement/option;
run;
这其中plot statement最重要,一种图形换一个plot statement即可:例如,直方图就用histogram语句,竖条图就用vbar语句。泡泡图就用bubble语句,等等。想再叠加一种图形,那就再加一个语句即可 :例如,已经用scatter语句画了散点,想加回归线,那就再加一条reg语句。sgplot目前已提供的plot statement已超过30多个。以下是sgplot的plot语句不完全列表,具体可查看help。
OK,铺垫完了,接下来,别说话,看图!我们一个一个来开扒!为了行文紧凑,仅就直方图的例子给出核心代码,后续的图只点出主要语句,完整代码可回复关键词后集中查看。
1.直方图
查看连续变量的分布情况,频率分布直方图。直接上histogram语句就行。
举个例子,要画一个简单的直方图,只要如下三行:
proc sgplot data=sashelp.cars ;
histogram enginesize;
run;
有时候,我们希望加一条密度曲线,此时再上一个density语句就行。
proc sgplot data=sashelp.cars ;
histogram enginesize;
density enginesize;
run;
有的时候,我们希望把两个类似变量的直方图放一张图里比较,如何做?同理,那就再加一个histogram语句!
proc sgplot data=sashelp.cars;
histogram mpg_city ;
histogram mpg_highway ;
run;
SAS的默认配图颜色比较老陈晦暗,给她换一个配色方案,立马变成活泼明快风。
此外,直方图还有一个有意思的变种,叫金字塔图,或者叫镜面图直方图,蝴蝶图?这个需要一点GTL的技巧。详见 Graphically Speaking博客。
2. 箱线图
同样查看连续性性变量分布情况,箱线图给出了更为简洁且丰富的概要信息,而SAS所需的,只要一个vbox或者hbox语句。其中v表示vertical, h表示horizental。类似的还有vbar或者har语句。
如果有分组信息,那就在语句后加一个分组选项「/group=groupvar」,SAS会自动以不同的pattern区分。
3. 直条图
长得和直方图类似,但是直条图通常是用于类别/组间统计量的比较。此时,vbar或者hbar语句就可以派上用场了。
同理,如果有分组信息,那就在语句后加一个分组选项「/group=groupvar」即可。
很多时候,为了了解数据的变异情况,我们还需要其加上误差棒。此时,limitstat选项就可以上场了。
如果分组,分类比较复杂,那就需要借助proc sgpannel里的panel by语句了。
此外,直条也可以做镜面直条图。不必通过GTL编程,只需要借助proc sgplot的hbarparm,vbarparm以及formart技巧。
4. 直条线图
直条图还经常和线图组合成直条线图。此时,可以设置第二y轴,再加一条vline语句画线图。
5. 散点图
考察两个变量的关系,做相关和回归前的探查,都可以用scatter语句来描绘散点图。欲分组查看,加一个分组选项「/group=groupvar」即可。
更多时候,我们希望在散点图中增加回归线,查看回归趋势。此时,只要再给SAS一个reg语句就OK。还可以用CLI,CLM查看置信限。同理,欲分组查看,加一个分组选项「/group=groupvar」即可。
6. 矩阵图
把散点,直方图放在一个组图里,组合成一个小矩阵。这就是proc sgscatter的事了。
7. 折线图
查看变化趋势。sgplot里的series即可。但往往仅有点估计是不够的,于是要加上标准差,此时需要highlow语句的配合。不过,数据需要先通过proc means处理,计算均数和标准差。
8. ROC曲线
熟悉的不能再熟悉的ROC曲线,其实Proc logisitc的plot=(roc)选项就可以做到。当然,也可用更直接的用其ROC语句,还可以用roccontrast来进行ROC曲线的比较。
9. K-M曲线
生存分析里的K-M曲线,其实Proc lifetest的plots=survival选项即可实现。其中survial的亚选项更为丰富,不仅可以实现画生存曲线,也可以画死亡曲线;不仅可以画点估计值,也可以画置信区间。
不仅如此,期刊中常见的No. at risk已经log-rank检验的P值也可以直接在图上体现。
10. 泡泡图
平面化的三维图形。proc sgplot的bubble语句的专利。欲分组查看,加一个分组选项「/group=groupvar」即可,当然,还可用reg语句增加回归线。
11. 森林图
森林图不仅仅是在Meta分析中大行其道,在各种带OR, HR值的分析中,也全是她的身影。森林图由于结合了文字和图形,在制作过程中较为复杂,需要GTL编程。
直接用OR值绘制森林图
Logistic回归结果改造的森林图
12. 裂轴图
经常是数轴虽然等距,但是中间的数值其实被砍去一大截,以节省绘图空间。如下图y轴,0~50和50~60在数轴上等距,但是真实数据差了4倍。所以用「//」标示数轴有间断。这种图的绘制,也需要GTL编程。
当然,除了以上图形,sgplot还有其他许多应用。此外,ODS Graphic System的其他过程如SGpannl , SGDesign,SGRender都有应用。当然,SAS默认的绘图风格比较老陈晦暗,后续还可以做一定的美化,这就是下次推送的内容啦。
为了兼顾行文紧凑,图中的代码只做简要提示,欲获取完整代码,可关注“统计思维”公众号,在后台(不是评论区)回复「gCode」。
关注“统技思维”微信
查看更多好文章
更多阅读
点击左下角“阅读原文”,看看医咖会既往推送了哪些统计教程。或者使用电脑打开网址:http://www.mediecogroup.com/,查看全部统计教程。有问题快加小咖微信(xys2019ykh),拉你进入统计讨论群!