查看原文
其他

多图预警:如何又快又美地用SAS画各种统计图形?

医咖会 2021-01-15

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」

关注“统技思维”微信

查看更多好文章


更多阅读

1. 分类变量和连续变量的统计图示例

2. 描述两个或多个变量,选啥统计图?(多图示例)

3. R课程第13期:教你绘制常见统计图



点击左下角“阅读原文”,看看医咖会既往推送了哪些统计教程。或者使用电脑打开网址:http://www.mediecogroup.com/,查看全部统计教程。有问题快加小咖微信(xys2019ykh),拉你进入统计讨论群!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存