msgbartop
List for SAS fans and programmer
msgbarbottom

23 5月 20 雷达图及SAS绘图 by sxlion

雷达图,也叫网状图、蜘蛛网图、星图、极坐标图、Kiviat图、不规则多边图等,以二维图的形式显示多元数据。通常包括三个或多个定量变量,从同一点开始的轴上表示。轴的相对位置和角度通常是无意义的,不过通常用来揭示相关性、权衡(trade-offs)和比较等等。由坐标、刻度及参考线、多边形和数据点组成,图1。

radar chart

Fig.1.雷达图解析 (出自The Data Visualisation Catalogue)

在SAS第二代绘图g系列语句里,有专门的PROC gradar语句来完成。功能限制多,图形展示效果较差,想多点花样,必须用注释anno辅助才行。虽然到了SAS第三代绘图sg系列里面没有专门的雷达图语句了,但是SAS官方博客上倒是有几篇文章提到怎么用sg语句组合来绘制雷达图,要完成如图1那样的图不是很困难的事情。

            在前一篇文章《SAS程序优化_一万次循环》里面为了展示系统资源使用不均衡的情况,用到了雷达图(图2),表达了磁盘DISK io占用率高,限制了电脑发挥,属于trade-offs。其实这种情况,也可以用条形图展示,不过效果没雷达图好。

Fig.2. 电脑系统资源使用情况示意图

绘图要点:

1,由于不是规则的坐标图,即极坐标图,所以数据得转换,从XY坐标图转换到极坐标图,因此数据要完成角度弧度的转换;

2,只有一个极坐标轴了,坐标轴变成了辐条,可以用sgplot vector来完成;坐标轴上的刻度及参考线可以用polygon画多边形或ellipseparm画圆完成;数据点用scatter完成;数据点之间的连线用polygon多边形来完成;

3,还剩下一个坐标轴的命名,默认是datalabel,名称的位置受限,经常与部分刻度参考线重叠,非常难看,gradar也无法避免这个问题,除非借助anno,相当的难受,sgplot text就可以非常愉快的完成这个,做到美观大方。

代码组成部分一:作图数据

  • data ex;
  • do situation = 1 to 0 by –1;
  •  input cpu memory disk gpu network;output;
  •  end;
  • cards;
  • 20 20 90 10 10
  • 50 50 50 50 50
  • ;
  • run;
  • proc sort data=ex out=ex;by situation;run;
  • proc transpose data=ex out= ex2 name=config prefix= use ;
  • by situation;
  • run;

如果你的数据已经是图3这样了,就无需上面转换。

Fig.3. 期望的实际数据形式

代码组成部分二:构造极坐标图框架和数据,转换的数据形式见图4。

  • data ex3;
  •      set ex2;
  •        deg2Rad = constant(‘pi’)/180 ;
  •        deg   =(90360/5*(_N_-1)) ; /*  5由变量个数来决定   */
  •        angle = deg*deg2Rad ;
  •        rangle =  –360/5*(_N_-1)  ;/*  5由变量个数来决定   */
  •        rdx = use1*cos(angle) ;
  •        rdy = use1*sin(angle) ;
  •        rx = 100*cos(angle); ry=100*sin(angle);/*100由实际情况定 */
  •        config=upcase(config);
  •        if situation then situ_=”实际情况” ;else situ_=”理性情况”;
  • run;

Fig.4. 转换的实际数据和构图数据形式

代码组成部分三:作图

  • ods listing image_dpi=600 gpath=”d:”   ;
  • ods graphics on  /  imagename=”Figure_”  HEIGHT= 7 cm WIDTH= 7 cm border=no ;
  • footnote;
  • title;
  • proc sgplot data=ex3  ASPECT=1  noborder  SUBPIXEL;
  • STYLEATTRS DATACONTRASTCOLORS=(blue red);
  •     polygon x=rdx y=rdy id=situation/ group=situ_ outline LINEATTRS=(pattern=solid color=blue THICKNESS=2) fill fillattrs=(transparency=0.) name=”sxlion”;
  •       vector  x=rx y=ry / xOrigin=0 yOrigin=0  NOARROWHEADS LINEATTRS=(pattern=solid color=black THICKNESS=1.5) ;
  •       text x=rx y=ry text=config / ROTATE=rangle position=top textattrs= (Color=darkblue Family=”Helvetica” Size=10 Weight=Bold);
  •       ellipseparm SEMIMAJOR=50 SEMIMINOR=50;/*中刻度线,自定*/
  •       ellipseparm SEMIMAJOR=99 SEMIMINOR=99;/*外刻度线,自定*/
  •       scatter x=rdx y=rdy /markerattrs=(symbol=circlefilled color=red Size=6);
  • keylegend  “sxlion” / noborder;
  • xaxis DISPLAY=none;
  • yaxis DISPLAY=none;
  • run;
  • ods graphics off;

SAS绘图sg系列语句可以模块化,多个功能叠加在一起就可以组成一个雷达图了。当然,既然是组合,只要兼容的sg系列语句都可以叠加在一起,并且按语句出现的先后顺序叠加起来,语句的前后顺序可根据需要进行安排。

05 4月 20 COVDI-19全球各国病例数弹道追踪图示

最近新冠肆虐,在高度全球化的地球村,没有哪一个国家和地区的人能躲避这个病毒, 它是全人类的敌人。在油管上看到一个有趣的动图展示(Trajectory of COVID-19 confirmed cases,请自行搜索)。其中有一个图形截图如下:

图1, Trajectory of covid 19 cases

这个图横纵坐标都用的是对数坐标系,有意思的是,横坐标是总确诊例数,纵坐标是新增例数。对于这种全球性的大型数据一些公司常用的是鼓泡泡图,漂亮美观大气,特别是拿着长竹竿在大屏幕上敲敲打打,非常地霸气。虽然能够看到各国的变化趋势和比较,但是没法判断关键节点。而这种弹道图却能很好地恰如其分的看到拐点。毕竟天天隔离在家,不能出门是非常的无聊无助,看到拐点就看到了解封的希望。

这种图的就是曲线图,随时间增加而变化的动态图,比较能反映其变化。画这种几个要点:

1,数据源,全球性、长时间的数据,这次的数据很符合。在网上找到一个WHO的数据源

2,坐标系采用对数坐标系。病毒这种微生物,其生长趋势分为潜伏期,对数增长期,平稳期和消亡期。课本上讲的清清楚楚,相关理论及现象也是多如牛毛,这里就不罗嗦了。 人类对线性的理解比较深刻,对什么指数式增长的爆发曲线则有种失控感。采用线性变化趋势能够很好的保护人类的脆弱心理,有利于做出理性的判断。

3,横纵坐标的变量的选取,这是个难点。常规下横坐标是时间,纵坐标是数量的对数。这个通常用来预测限制条件下的生长变化趋势。但其实很多时候,实际影响因素太多而无法做出判断,通常都是马后炮。但是如果能从历史曲线中学习到新知识,也是很有收获的。除了时间、总数以外,每日新增数,时间拐点这两个参数也是非常受关注。 怎么把这两个参数在图表上表示出来呢? 问题很好,答案就在本文图1中。总数,每日新增,拐点,就缺个时间戳。从图1可知,中国和韩国已经上岸,其他国家还挂在线上。

4,需要吸引人。 SAS画图的毛病我在群里吐槽了很多,这里就不多表。不过SAS画图工工整整,严谨,直接挂Nature上都行。如果能增加一点活泼感就更好了,这里,我在横纵坐标轴上做了一点改进,让坐标轴从1000起步,随时间增加,新增数和总数隔一段时间会增加一个量级,效果不错。如下图。

5,还有一个处理,由于上报的时间存在滞后,并且检测技术,诊断标准各个国家都在变,所以上报的数据在某些阶段过于集中,导致有假拐点出现。因此,这里做了一个平滑,使用移动平价,也即是今天的新增数据用将过去7天(包括今天)平均数来代替,避免假拐点迷惑人类的眼睛。

上面这个是全球的,齐齐整整的,全都上线了。中韩提前下线,但是要看到后面新增例数存在一个反复的过程,防疫任务艰巨,大家还是不能掉以轻心。下面重点看下几个不管是自称的,还是公认的“模范生”。曲线上写的清清楚楚。看下面图,日本,新加坡,这分明还在线上挣扎嘛。最多是把曲线拉平了一些(”flatten the curve”,请自行搜索。),拐点还不明朗,还需少吹牛,多努力。

Pages: 1 2

22 11月 19 难道是SAS10?云分析服务时代的到来

难道是SAS10?云分析服务时代的到来

大家有一个普通的印象:SAS的更新很慢,很老很落后。可能跟它的版本命名有关,SAS9.0是2004年出来的,到现在都快20年了,版本号 还停留在9字头,并且还没有继续更新的迹象。当然这个与SAS公司的命名习惯有关系,要知道普通人都是没用过9.00,也没用过9.39的,不象MATLAB和SPSS那样一年几个或一个更新。

老外都迷信偶数,觉得偶数才是吉祥数字,奇数都是不稳定的。比如说3G通讯信号是个渣,Win7是个垃圾。苹果不自信,不敢用10,用了个X,果然也不行。一直准备学SAS的新编程语言CASL(Cloud Analytic Services Language),自己电脑上的SAS@ Studio 不知道怎么回事一直连不上。只好用用SAS网站上的SAS Viya trial(请自行搜索关键词),注册一下很快就可以用了,比本地安装SAS软件快多了。界面是浏览器界面,很清爽漂亮,长下面这个样子。

对于SASor来说,顺手写下了上面的代码是件在正常不过的事,类似在其他语言上写“Hello,World”。没有报错,在log里面的Note标签底下出现了SAS的Lincense信息(见以前的文章:深入了解SAS License),果然有收获。

先看看版本号V.03.04M0P050819,这不明摆着是10嘛,我觉得SAS有这个自信把这一版的SAS命名为SAS10,比如说CASL出现简直就是新的里程碑啊。然后授权点Site name:’DEMOCENTER – 19W21 Full Order Setinit’.全订单的demo版本,查了一下,好像不是很全,毕竟SAS好多东西都是Undocumented的。再往下看number没什么可讲的,不过下面的CPU A,B,C有点意思,云计算,CPU就是多。继续是有效期1年,很SAS。系统生日是2019年10月3日,很新,使用的应该是64位Linxus系统,紧跟着下面长长的列表就是全系统的SAS模块产品了,很长。CPU A 对应的是SAS老语言的模块,CPU B对应的只有两个Base SAS Software和Threaded Kernel Extensions for Central Analytic Server,没弄明白;后面的全是CPU C对应的模块,除了BASE和几个时间序列的,全是以CAS打头的,很明显,都是云分析模块,很细致很长,以前命名的模块,一个衍生出好多个,Goodnight这是要拆开来一个一个的单卖啊。

我全附在下面了,有兴趣的自行研究。

  • Original site validation data Current version: V.03.04M0P050819
  • Site name: ‘DEMOCENTER – 19W21
  • Full Order Setinit’. Site number:  ………
  • CPU A: Model name=” model number=” serial=”.
  • CPU B: Model name=” model number=” serial=’+9999′.
  • CPU C: Model name=” model number=” serial=’+9999′.
  • Expiration: 10OCT2020.
  • Grace Period: 45 days (ending 24NOV2020).
  • Warning Period: 47 days (ending 10JAN2021).
  • System birthday: 03OCT2019.
  • Operating System: LIN X64 . 

Product expiration dates: —Base SAS Software 10OCT2020 (CPU A) —SAS/STAT 10OCT2020 (CPU A) —SAS/GRAPH 10OCT2020 (CPU A) —SAS/ETS 10OCT2020 (CPU A) —SAS/OR 10OCT2020 (CPU A) —SAS/IML 10OCT2020 (CPU A) —SAS/QC 10OCT2020 (CPU A) —SAS/CONNECT 10OCT2020 (CPU A) —SAS Risk Management 10OCT2020 (CPU A) —SAS Enterprise Miner 10OCT2020 (CPU A) —SAS/Secure 168-bit 10OCT2020 (CPU A) —SAS Data Quality Server 10OCT2020 (CPU A) —SAS High-Performance Forecasting 10OCT2020 (CPU A) —OR OPT 10OCT2020 (CPU A) —OR PRS 10OCT2020 (CPU A) —OR IVS 10OCT2020 (CPU A) —OR LSO 10OCT2020 (CPU A) —SAS/ACCESS Interface to DB2 10OCT2020 (CPU A) —SAS/ACCESS Interface to Oracle 10OCT2020 (CPU A) —SAS/ACCESS Interface to SAP ASE 10OCT2020 (CPU A) —SAS/ACCESS Interface to PC Files 10OCT2020 (CPU A) —SAS/ACCESS Interface to ODBC 10OCT2020 (CPU A) —SAS/ACCESS Interface to R/3 10OCT2020 (CPU A) —SAS/ACCESS Interface to Teradata 10OCT2020 (CPU A) —SAS/ACCESS Interface to Microsoft SQL Server 10OCT2020 (CPU A) —SAS/ACCESS Interface to MySQL 10OCT2020 (CPU A) —SAS Data Quality Server – All Languages 10OCT2020 (CPU A) —Text Miner for Danish 10OCT2020 (CPU A) —Text Miner for Dutch 10OCT2020 (CPU A) —Text Miner for Finnish 10OCT2020 (CPU A) —Text Miner for French 10OCT2020 (CPU A) —Text Miner for German 10OCT2020 (CPU A) —Text Miner for Italian 10OCT2020 (CPU A) —Text Miner for Portuguese 10OCT2020 (CPU A) —Text Miner for Spanish 10OCT2020 (CPU A) —Text Miner for Swedish 10OCT2020 (CPU A) —Text Miner for Polish 10OCT2020 (CPU A) —Text Miner for Japanese 10OCT2020 (CPU A) —Text Miner for Arabic 10OCT2020 (CPU A) —Text Miner for Russian 10OCT2020 (CPU A) —Text Miner for Korean 10OCT2020 (CPU A) —SAS Size Profiling 10OCT2020 (CPU A) —SAS Pack Optimization 10OCT2020 (CPU A) —Text Miner for Croatian 10OCT2020 (CPU A) —Text Miner for Norwegian 10OCT2020 (CPU A) —Text Miner for Slovak 10OCT2020 (CPU A) —Text Miner for Slovenian 10OCT2020 (CPU A) —Text Miner for Czech 10OCT2020 (CPU A) —Text Miner for Greek 10OCT2020 (CPU A) —Text Miner for Hebrew 10OCT2020 (CPU A) —Text Miner for Hungarian 10OCT2020 (CPU A) —Text Miner for Romanian 10OCT2020 (CPU A) —Text Miner for Thai 10OCT2020 (CPU A) —Text Miner for Turkish 10OCT2020 (CPU A) —Text Miner for Chinese 10OCT2020 (CPU A) —Text Miner for Indonesian 10OCT2020 (CPU A) —Text Miner for Vietnamese 10OCT2020 (CPU A) —Text Analytics for Farsi 10OCT2020 (CPU A) —Text Analytics for Hindi 10OCT2020 (CPU A) —Text Analytics for Tagalog 10OCT2020 (CPU A) —SAS Model Manager 10OCT2020 (CPU A) —SAS/IML Studio 10OCT2020 (CPU A) —SAS Workspace Server for Local Access 10OCT2020 (CPU A) —SAS Workspace Server for Enterprise Access 10OCT2020 (CPU A) —SAS/ACCESS Interface to Netezza 10OCT2020 (CPU A) —SAS Scoring Accelerator for Teradata 10OCT2020 (CPU A) —SAS/ACCESS Interface to Greenplum 10OCT2020 (CPU A) —SAS/ACCESS to Hadoop 10OCT2020 (CPU A) —SAS/ACCESS to Vertica 10OCT2020 (CPU A) —SAS/ACCESS to Postgres 10OCT2020 (CPU A) —SAS/ACCESS to Impala 10OCT2020 (CPU A) —SAS/ACCESS to HAWQ 10OCT2020 (CPU A) —SAS/ACCESS to Amazon Redshift 10OCT2020 (CPU A) —DataFlux Driver for Base SAS 10OCT2020 (CPU A) —High Performance Suite 10OCT2020 (CPU A) —SAS High-Performance Risk Engine Server 10OCT2020 (CPU A) —SAS High-Performance Statistics 10OCT2020 (CPU A) —SAS High-Performance Econometrics and Time Series 10OCT2020 (CPU A) —SAS Event Stream Processing 10OCT2020 (CPU A) —SAS Visual Analytics Hub 10OCT2020 (CPU A) —SAS Visual Analytics Services 10OCT2020 (CPU A) —Score Publish Hadoop 10OCT2020 (CPU A) —SAS/ACCESS to SAP HANA 10OCT2020 (CPU A) —SAS Visual Analytics Server Components 10OCT2020 (CPU A) —SAS Data Quality Accelerator for Teradata 10OCT2020 (CPU A) —SAS Visual Statistics Mid-tier 10OCT2020 (CPU A) —Visual Analytics Explorer 10OCT2020 (CPU A) —Cloud Analytic Services 10OCT2020 (CPU A) —Vis Investigator Alerts Svc 10OCT2020 (CPU A) —Vis Invstgtr Srch Disc Svc 10OCT2020 (CPU A) —Visual Investigator 10OCT2020 (CPU A) —Vis Invstgtr Entity Svc 10OCT2020 (CPU A) —Machine Learning Procedures 10OCT2020 (CPU A) —Common Analytic Procedures 10OCT2020 (CPU A) —Advanced Analytics Statistics 10OCT2020 (CPU A) —Text Mining Process 10OCT2020 (CPU A) —SAS DMML Setinit 10OCT2020 (CPU A) —Time Series Model Procs 10OCT2020 (CPU A) —Forecast Reconcil Procs 10OCT2020 (CPU A) —Time Series Info Procs 10OCT2020 (CPU A) —SAS Econometrics Procedures 10OCT2020 (CPU A) —Optimization Procedures 10OCT2020 (CPU A) —Event Stream Analytics 10OCT2020 (CPU A) —SAS Event Stream Manager 10OCT2020 (CPU A) —DM DQ Orderable (Viya) 10OCT2020 (CPU A) —SAS Data Preparation 10OCT2020 (CPU A) —Text Analytics UI Setinit 10OCT2020 (CPU A) —Data Agent Service 10OCT2020 (CPU A) —Forecasting Procedures 10OCT2020 (CPU A) —Mobile Investigator 10OCT2020 (CPU A) —Analytics for IoT 10OCT2020 (CPU A) —Time Series External Language 10OCT2020 (CPU A) —SAS Adaptive Learning and Intelligent Agent 10OCT2020 (CPU A) —Data Connector SAS Data Sets 10OCT2020 (CPU A) —Data Connector to DB2 10OCT2020 (CPU A) —Data Con Accel Hadoop 10OCT2020 (CPU A) —Data Con Accel Teradata 10OCT2020 (CPU A) —Data Connector to Hadoop 10OCT2020 (CPU A) —Data Connector to Impala 10OCT2020 (CPU A) —Data Connector to ODBC 10OCT2020 (CPU A) —Data Connector to Oracle 10OCT2020 (CPU A) —Data Connector to PC Files 10OCT2020 (CPU A) —Data Connector to Postgres 10OCT2020 (CPU A) —CAS DFeeder EmbProc Switch 10OCT2020 (CPU A) —TK Extensions for CAS DFeed 10OCT2020 (CPU A) —Data Connector to Teradata 10OCT2020 (CPU A) —TK Ext for Amazon Redshift 10OCT2020 (CPU A) —TK Ext for Impala 10OCT2020 (CPU A) —TK Ext for HAWQ 10OCT2020 (CPU A) —TK Ext for SAP HANA 10OCT2020 (CPU A) —TK Ext for Oracle 10OCT2020 (CPU A) —TK Ext for Greenplum 10OCT2020 (CPU A) —TK Ext for HadoopHive 10OCT2020 (CPU A) —TK Ext for DB2 10OCT2020 (CPU A) —TK Ext for Netezza 10OCT2020 (CPU A) —TK Ext for Teradata 10OCT2020 (CPU A) —TK Ext for MySQL 10OCT2020 (CPU A) —TK Ext for PostgreSQL 10OCT2020 (CPU A) —TK Ext for ODBC 10OCT2020 (CPU A) —TK Ext for MS SQL Server 10OCT2020 (CPU A) —CAS Web Media Data Feeder 10OCT2020 (CPU A) —Data Connector to SAP HANA 10OCT2020 (CPU A) —TK Ext for Vertica 10OCT2020 (CPU A) —Data Connector to Amazon Redshift 10OCT2020 (CPU A) —Data Connector to Microsoft SQL Server 10OCT2020 (CPU A) —Data Connector to SPDE 10OCT2020 (CPU A) —Data Connector to MySQL 10OCT2020 (CPU A) —SAS/ACCESS to Spark 10OCT2020 (CPU A) —TK Ext for Spark 10OCT2020 (CPU A) —Data Connector to Spark 10OCT2020 (CPU A) —Data Con Accel Spark 10OCT2020 (CPU A) —SAS/ACCESS to JDBC 10OCT2020 (CPU A) —TK Ext for JDBC 10OCT2020 (CPU A) —Data Connector to JDBC 10OCT2020 (CPU A) —Data Connector to Vertica 10OCT2020 (CPU A) —Text Analytics Kazakh 10OCT2020 (CPU A) —Intel Investgatn Mgmt 10OCT2020 (CPU A) —Base SAS Software 10OCT2020 (CPU B) —Threaded Kernel Extensions for Central Analytic Server 10OCT2020 (CPU B) —Base SAS Software 10OCT2020 (CPU C) —Time Frequency Analysis 10OCT2020 (CPU C) —Time Series Analysis 10OCT2020 (CPU C) —Simple Forecasting Service 10OCT2020 (CPU C) —Automated Time Series Model 10OCT2020 (CPU C) —Time Series Utilities 10OCT2020 (CPU C) —Time Series Modeling 10OCT2020 (CPU C) —Forecasting Time Filters 10OCT2020 (CPU C) —Forecast UI Setinit 10OCT2020 (CPU C) —Decision Microservice 10OCT2020 (CPU C) —Rulesets Microservice 10OCT2020 (CPU C) —CAS Action Set for Aggregation 10OCT2020 (CPU C) —CAS Action Set for Bayesian Network Classifier 10OCT2020 (CPU C) —Action Set for Boolean Rule Extraction 10OCT2020 (CPU C) —CAS Action Set for Cardinality 10OCT2020 (CPU C) —CAS Action Set for COUNTREG Messages 10OCT2020 (CPU C) —CAS Action Set for Deep Neural Networks 10OCT2020 (CPU C) —CAS Action Set for DS2 10OCT2020 (CPU C) —CAS Action Set for Decision Tree 10OCT2020 (CPU C) —Action Set for FEDSQL 10OCT2020 (CPU C) —CAS Action Set for simple one-off Time Series 10OCT2020 (CPU C) —CAS Action Set for K-Means Cluster Analytics 10OCT2020 (CPU C) —CAS Action Set for Streaming Data 10OCT2020 (CPU C) —CAS Action Set for Data Mining, Machine 10OCT2020 (CPU C) —CAS Action Set for Artificial Neural Net 10OCT2020 (CPU C) —CAS Action Set for Nonlinear Models 10OCT2020 (CPU C) —CAS Action Set for OPTMINER 10OCT2020 (CPU C) —Action Set for Parsing and Categorization 10OCT2020 (CPU C) —CAS Action Set for principal component analysis 10OCT2020 (CPU C) —Action Set for Reconcile 10OCT2020 (CPU C) —CAS Action Set for Regression Modeling 10OCT2020 (CPU C) —CAS Action Set for Real-Time Entity Generation 10OCT2020 (CPU C) —CAS Action Set for Sampling 10OCT2020 (CPU C) —CAS Action Set for Full Text Search 10OCT2020 (CPU C) —CAS Action Set for Sentiment Analysis 10OCT2020 (CPU C) —CAS Action Set for Sequence 10OCT2020 (CPU C) —Action Set for Severity Modeling 10OCT2020 (CPU C) —CAS Action Set for Common Code 10OCT2020 (CPU C) —Action Set for Support Vector Machines 10OCT2020 (CPU C) —CAS Action Set for Time Series Processing 10OCT2020 (CPU C) —CAS Action Set to Implement Factorization 10OCT2020 (CPU C) —Action Set for Transpose 10OCT2020 (CPU C) —CAS Action Set for Text Mining 10OCT2020 (CPU C) —CAS Action Set for Variable Reduce 10OCT2020 (CPU C) —CAS Action Set Recommender 10OCT2020 (CPU C) —CAS Action Set for midTierServices 10OCT2020 (CPU C) —CAS Action Set Soc Ntwk Analys 10OCT2020 (CPU C) —CAS Action Set Network Common 10OCT2020 (CPU C) —CAS Action Set for Deep Learning 10OCT2020 (CPU C) —CAS Action Set Network Opt 10OCT2020 (CPU C) —CAS Action Set QKB Management 10OCT2020 (CPU C) —CAS Action Set Data Mgt Cluster 10OCT2020 (CPU C) —CAS Action Set ASTORE Scoring 10OCT2020 (CPU C) —CAS Action Set for Computer Vision 10OCT2020 (CPU C) —CAS Action Set Model Publishing 10OCT2020 (CPU C) —Action Set Stat Graph Comp 10OCT2020 (CPU C) —CAS Action Set Data Profile 10OCT2020 (CPU C) —ActionSet Decision Tree Adv 10OCT2020 (CPU C) —CAS Action Set Parsing Adv 10OCT2020 (CPU C) —CAS Action Set Txt Mining Adv 10OCT2020 (CPU C) —CAS Action Set Nearest Neighbor 10OCT2020 (CPU C) —CAS Action Set Variable Cluster 10OCT2020 (CPU C) —CAS Action Set Rule Mining 10OCT2020 (CPU C) —CAS Action Set SemiSuper Learn 10OCT2020 (CPU C) —CAS Action Set Optimization 10OCT2020 (CPU C) —CAS Action Set Clustering ESP 10OCT2020 (CPU C) —CAS Action Set Time Series Info 10OCT2020 (CPU C) —CAS Action Set Forecast Override 10OCT2020 (CPU C) —CAS Action Set Time Frequency 10OCT2020 (CPU C) —CAS Action Set Copula Modeling 10OCT2020 (CPU C) —CAS Action Set Panel Dat Regress 10OCT2020 (CPU C) —CAS Action Set QLIM Models 10OCT2020 (CPU C) —CAS Action Set Vector Data Desc 10OCT2020 (CPU C) —CAS Action Set Robust PCA 10OCT2020 (CPU C) —CAS Action Set PLS 10OCT2020 (CPU C) —CAS Action Set QuantReg 10OCT2020 (CPU C) —CAS Action Set Planning Service 10OCT2020 (CPU C) —CAS Action Set Comp Symb Diff 10OCT2020 (CPU C) —CAS Action Set DeepRecur NeurNet 10OCT2020 (CPU C) —CAS Action Set Multnom Discrete 10OCT2020 (CPU C) —CAS Action Set Hid Markov Model 10OCT2020 (CPU C) —CAS Action Set Spatial Regress 10OCT2020 (CPU C) —CAS Action Set Agg Loss Model 10OCT2020 (CPU C) —CAS Action Set CASRMV 10OCT2020 (CPU C) —CAS Action Set CASCORR 10OCT2020 (CPU C) —CAS Action Set CASFREQ 10OCT2020 (CPU C) —CAS Action Set GAM 10OCT2020 (CPU C) —CAS Action Set Mixed 10OCT2020 (CPU C) —CAS Action Set PHREG 10OCT2020 (CPU C) —CAS Action Set CASSPC 10OCT2020 (CPU C) —CAS Action Set LDA Topic Model 10OCT2020 (CPU C) —CAS Action Set Stability Monitoring 10OCT2020 (CPU C) —CAS Action Set Time Filters 10OCT2020 (CPU C) —CAS Action Set Parsing VisTxtAn 10OCT2020 (CPU C) —CAS Action Set Txt Min Vis Anlyt 10OCT2020 (CPU C) —CAS Action Set BLRule VisAnlyt 10OCT2020 (CPU C) —CAS Action Set SentAnlys VisAnly 10OCT2020 (CPU C) —CAS Action Set Search VisAnlyt 10OCT2020 (CPU C) —CAS Action Set Txt Mining Topics 10OCT2020 (CPU C) —CAS Action Set Txt Mining Util 10OCT2020 (CPU C) —CAS Action Set Txt Mining RLDisc 10OCT2020 (CPU C) —CAS Action Set Txt Mining RLDev 10OCT2020 (CPU C) —CAS Action Set Txt Mining RLScor 10OCT2020 (CPU C) —CAS Action Set VisAnlyt CRF 10OCT2020 (CPU C) —CAS Action Set Vis Anlyt TxtSum 10OCT2020 (CPU C) —CAS Action Set for Smart Data 10OCT2020 (CPU C) —CAS Action Set Biomed Img Prcs 10OCT2020 (CPU C) —CAS Action Set PSEUDO Local 10OCT2020 (CPU C) —CAS Action Set Mdl-Based Clustr 10OCT2020 (CPU C) —CAS Action Set for Audio 10OCT2020 (CPU C) —CAS Action Set for Speech to Text 10OCT2020 (CPU C) —CAS Action Set for Univariate Time Series Analysis 10OCT2020 (CPU C) —CAS Action Set for Economic Capital Modeling 10OCT2020 (CPU C) —CAS Action Set Ind. Cmpnt Anlys 10OCT2020 (CPU C) —CAS Action Set for tSNE 10OCT2020 (CPU C) —CAS Action Set Multi-task Learn 10OCT2020 (CPU C) —CAS Action Set for probML 10OCT2020 (CPU C) —CAS Action Set Mach Lrning Tool 10OCT2020 (CPU C) —CAS Action Set Risk Methods 10OCT2020 (CPU C) —CAS Action Set Risk Results 10OCT2020 (CPU C) —CAS Action Set Risk Run 10OCT2020 (CPU C) —CAS Action Set Risk Sim 10OCT2020 (CPU C) —Action Set for Automated Machine Learning 10OCT2020 (CPU C) —Action Set for Composite Interpretability 10OCT2020 (CPU C) —Action Set for Model Interpretability 10OCT2020 (CPU C) —Action Set for Machine Learning for Sparse Data 10OCT2020 (CPU C) —Subset of Action Set for Deep Learning 10OCT2020 (CPU C) —Time Series MOTIF Analysis 10OCT2020 (CPU C) —Singular Spectrum Analysis 10OCT2020 (CPU C) —TimeSeries Distance Measures 10OCT2020 (CPU C) —Subspace Tracking 10OCT2020 (CPU C)

01 7月 17 何种方式最有效地得到数据表的观测数?

何种方式最有效地得到数据表的观测数?
reproduced by sxlion

导读:SASor论坛上经典对话很多,以前用爬虫把整个网站down下来过一次,可惜没时间整理,然后电脑升级,最后就丢失了。每每想重温论坛,都无法得到原文。网络上仅仅转载了部分的对话,想起来真是可惜。现在仅凭一些时有时无的记忆点,在网络重搜出来一些经典对话,整理分享一下【论坛沉钩001】。

QKAIWEI:
1

1
2
3
%let rc=%sysfunc(open(yourTable));
%let nobs=%sysfunc(attrn(&rc,nobs));
%let rc=%sysfunc(close(&rc));

2

1
2
3
proc sql noprint;
select count(1) into:nobs from yourTable;
quit;

3

1
2
3
4
5
6
data _null_;
point=0;
set yourTable point=point nobs=n;
call symput('nobs',n);
stop;
run;

4

others???

SAS_DREAM:

1

1
2
3
%let rc=%sysfunc(open(yourTable));
%let nobs=%sysfunc(attrn(&rc,nobs));
%let rc=%sysfunc(close(&rc));

– open, attrn是SCL函数在base里的调用方式,需要测试一下对AF license的依赖性,该方法从表头meta区读取信息,与数据大小无关,效率较高。不过attrn要建立scl list,稍费周折。

2

1
2
3
proc sql noprint;
select count(1) into:nobs from yourTable;
quit;

– 顺序遍历表,数数记录,不从表头取信息,表越大,时间越长。

3

1
2
3
4
5
6
data _null_;
point=0;
set yourTable point=point nobs=n;
call symput('nobs',n);
stop;
run;

– 考虑一下空表情形:

1
2
3
4
5
6
%let nobs = 0;
data _null_;
set yourTable (drop=_all_) nobs=n;
call symput('nobs',n);
stop;
run;

如果空表,n是取不到值的,所以宏obs要赋初值。
(drop=_all_)当表列数很多又是通过远程提交时,这个选项会省时间。
point=0不用也可,因为stop会限制data step在一条记录以后就停。

这个方法也是直接从表头meta区取观测数,与表大小无关。

4 others???
你已经知道这么多方法,除了第二条没有什么理由去用,第一,三方法都是既简洁准确又不用一秒钟就精确搞定,余下的时间,不如去想其它有意思的专题了。

IMOEN:

1
2
3
4
5
PROC SQL NOPRINT;
SELECT NOBS INTO: NUM_OF_ROW
FROM SASHELP.VTABLE
WHERE LIBNAME="SASHELP" AND MEMNAME="CLASS";
QUIT;%PUT &NUM_OF_ROW;

这种方法也是直读metadata,优点是不仅仅可以用来读出纪录数,还可读出大量有用的表信息。打开sashelp.vtable看一看就知道了。

SAS_DREAM:

imoen 写到:
1
2
3
4
5
PROC SQL NOPRINT;
SELECT NOBS INTO: NUM_OF_ROW
FROM SASHELP.VTABLE
WHERE LIBNAME="SASHELP" AND MEMNAME="CLASS";
QUIT;%PUT &NUM_OF_ROW;

这种方法也是直读metadata,优点是不仅仅可以用来读出纪录数,还可读出大量有用的表信息。打开sashelp.vtable看一看就知道了。

透过vtable这样一个集中元数据表来访问表信息,对于一次性访问多个表的多种信息,是很方便的。

但是就每次零星地考察单表记录数而言,有些地方似乎值得进一步考量:
sashelp.vtable是sashelp库里的一个sql view, 应该是有后台管理进程辅助更新。对于通过vtable访问某个表的记录数,可能有几个担心:
1,在vtable中搜寻一个单表的信息需要进行View的retrieve遍历,还要进行逐条比对(WHERE LIBNAME=”SASHELP” AND MEMNAME=”CLASS”);尚不清楚vtable view的生成代码是什么(感觉像是Proc contents类似的操作生成的),但是该view的建立应该很难高效地利用针对“libname”和”memname”的索引,这样,搜寻访问效率可能随着view retrieve遍历的表记录增加而降低。
当系统中总的表数增大到一个较大的数量级,这在大型数据仓库系统,尤其是系统安装的模块较多,或者存在大量OLAP, EM projects时很有可能发生,vtable中包含的内容就会很多,因为它的内容涵盖系统中所有的表,甚至临时表;此时如果又用不上索引,vtable的访问速度会相当慢,事实上,用VT sashelp.vtable时已会有所感觉。
2,对于服务器端的应用,如果多个连接程序需要同时访问vtable取信息时,可能会进一步面临效率问题
3,当服务器端系统中一方面不断生成和删除大量表,同时有很多远程连接需要访问vtable取信息时,vtable所透视的内容可能面临更新和取用的双重压力

不过对于一般应用情形,都是OK了。 上面的担心只是瞎猜而已… …

IMOEN:

View只在被访问时才生成数据。同时,SAS的串行查询,令到冲突几乎不可能发生。

由于都是访问metadata,即使系统中有数千个表,也是秒级的操作。在大数据量ETL优化时,这类秒级操作基本上是忽略的。程序的可读性和通用性更加重要。

在主流DBMS中,SQL优化器在遇到qkaiwei第二种方法时,都会直接查询meta,而不是遍历原数据。如果数据引擎用的是其他DBMS,最快的方法是用SQL Pass-through。例如:

1
2
3
4
5
6
Proc SQL;
CONNECT TO ODBC AS DW ();SELECT nob INTO :NO_OF_ROW
FROM CONNECTION TO DW
(SELECT count(*) AS nob
FROM a_table);DISCONNECT FROM DW;
QUIT;

如果在SAS里面Count(*),立刻就会把所有的数据,通过你的接口引擎,在SAS中遍历。两种方法的速度有本质的差别。

SAS_DREAM:

imoen 写到:
在主流DBMS中,SQL优化器在遇到qkaiwei第二种方法时,都会直接查询meta,而不是遍历原数据。如果数据引擎用的是其他DBMS,最快的方法是用SQL Pass-through。例如:

1
2
3
4
5
6
Proc SQL;
CONNECT TO ODBC AS DW ();SELECT nob INTO :NO_OF_ROW
FROM CONNECTION TO DW
(SELECT count(*) AS nob
FROM a_table);DISCONNECT FROM DW;
QUIT;


如果在SAS里面Count(*),立刻就会把所有的数据,通过你的接口引擎,在SAS中遍历。两种方法的速度有本质的差别。

说得有道理!

感谢Q版,大清早信手拈来就给大家一个好玩的话题!
今天和vtable玩了个游戏,发现一些现象很有趣:

1,先造10000个表在系统里

1
2
3
4
5
6
7
8
9
10
11
12
13
%let tableNum = 10000;

%macro tables();
data
%do i=1 %to &tableNum;
test&i
%end;
;
set sashelp.class;
run;
%mend tables;

%tables;

2,再去找其中TEST100的观测数
set nobs跑了1秒

1
2
3
4
5
6
7
8
9
%let nobs=0;

data _null_;
set TEST100(drop=_all_) nobs=rows;
call symput('nobs',rows);
stop;
run;

%put &nobs;

NOTE: There were 1 observations read from the data set WORK.TEST100.
NOTE: DATA statement used:
real time 1.00 seconds
cpu time 0.00 seconds

FROM SASHELP.VTABLE跑了29秒

1
2
3
4
5
PROC SQL;
SELECT NOBS
FROM SASHELP.VTABLE
WHERE LIBNAME="WORK" AND MEMNAME="TEST100";
QUIT;

NOTE: PROCEDURE SQL used:
real time 29.10 seconds
cpu time 0.17 seconds

如果再运行一遍,由于cache的机理,两个方法都是不到1秒了。

猜想:
vtable被访问时的应该是动态收集系统中所有的表meta,搜集的耗时与表的数目有关,而且不论是访问那个表的信息(where 。。。),都是先去收集系统中所有的表meta;否则,利用WHERE LIBNAME=”WORK” AND MEMNAME=”TEST100″取一条记录,不会在系统表数目增长时产生显著的响应下降(系统表1000个时,就是2,3秒而已)
而set nobs的方法与系统表数目无关。
因此,极端情况下vtable还是有响应效率问题的,不过算不了什么。

结论:
1万个系统表的状况还是比较罕见的,而且vtable的响应也是可以接受(机器快了更是影响比较小),如Imoen所说,使用vtable方法比较通用和易读,也不致在效率上产生实质问题。
只取观测数的话,set nobs方法仍是比较高效的。
如果愿意,编个macro把set nobs和vtable的优势结合,也是很好玩的。

提示:
这个测试情形必须保证消除cache效应,方法可以是在每种方法测试之前,运行一个大进大出的summary,搞到out of memory更好,会把之前测试的cache清得一干二净,各种方法的真实效率才会显现,在其它类似测试中也如是。

QKAIWEI:
我其实一直想努力使sasor向这个方向走:画一个圈,挖一口井。

我一般使用data步的做法,比较省时,而且sas语言上data步是最稳定的,如果用别的,说不定哪里就来个bug。

如果是在scl中,我一般用
dsid=open(talbename);
nobs=attrn(dsid,’nobs’);

接下来,我可能要前移游标,做变量取值操作。但是scl语法不能操作sas server上的表,使用%sysfunc一般也是折衷之计。

在远程sas server如果想得到scl的同样效果,我的做法是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rsubmit;
%let rc=%sysfunc(open(tablename));
%let nobs=%sysfunc(attrn(&rc,nobs));
%let rc=%sysfunc(close(&rc));

data _null_;
nobs=&nobs;
do p=1 to nobs
set my table point=p;
call symput('a',a);
call symput('b',b);
call execute('%macro1(&a)');
call execute('%macro2(&b)');
end;
stop;run;
endrsubmit;

proc sql在使用v系列的视图确实相比其他方法比较耗费时间,当然这个差别要考虑机器性能。
我以前的电脑在使用这一方法的时候总要顿一下。
当然imoen的说的也是,就是在读取其他数据库的时候,如oracle上的表时,这是scl 以及data步不能实现的。

在sas server上分组取观测数时,proc sql也很有意思,有的时候也用一下,比较方便。

1
2
3
4
5
6
rsubmit;
proc sql noprint;
select count(1) into:group_obs separated by ',' from tblname group by var;
quit;
&sysrput group_obs=&group_obs /*caution the length of macro variable*/
endrsubmit;

接下来有个%superq的用法,然后循环,用%scan分别取值。
我去做饭,不能多写了,希望多开一些这样的题目,做深入的讨论。
两位周末快乐!

10 6月 17 SAS学习重要问题简答列表

The most essential short QA lists before & after SAS learning

by sxlion

导读:今天与畅销SAS图书作者谷鸿秋博士会面,简单聊了一下SAS,感慨颇多,留文一篇。

注:重点已粗体。

Q:学好SAS到底难不难?

A:难,非常难,那些说30天学好SAS语言的,纯属骗人,更不用说7天学会SAS编程的了。

Q:SAS这么难,为什么还要学SAS ?

A:学SAS的过程,是系统性学习了统计的过程,特别是对非统计专业的人来说。另外付出与回报是同等的,当然这个是说智力正常的前提下。

Q:如果我学好SAS软件到底会给我怎么样的改变 ?

A:纯会SAS的话,不愁饭碗,但顶多是个高级程序员。如果你还精通专业业务及理论,那么你就是你专业里面SAS最厉害的,SASor里面你专业最厉害的,想不牛都不行

Q:怎么才能学会SAS ?

A:不知道。这个世界上精通SAS的没几个人,但是为什么需要精通SAS ? 学一些能解决你实际问题的SAS知识(不单是编程)就行了,半部论语治天下,懂一点SAS能安身立命。根据你的需要学习用好SAS的特定模块的特定功能。

Q:怎么才能用好SAS ?

A:每次看金庸、古龙的小说碰到为争夺武功秘籍而费劲周折的曲折动人惊心动魄冗长乱俗的情节时,我总是为SAS公司的慷慨大方从内心感赞。SAS Help堪比葵花宝典,但没事千万别翻。结婚生子要紧,需要用的时候查查SAS Help特定模块功能使用说明就行了,如果真要为学好SAS而从头到尾研究Help,你一辈子的时间根本不够。当然,你如果Help都研究透了,也只是会使用SAS而已,重要的是你解决了问题没有,SAS的本质是工具。 

Q: SAS Help怎么个好法?

A:SAS所有功能模块的用法全在Help里面。

Q:SAS Help有没有缺陷?

A:有。SAS Help只是告诉你使用方法。Help只讲怎么用,不讲为什么这样用。

。。。。。。。。。。。。

07 6月 17 《SAS编程演义》推荐语

《SAS编程演义》推荐语

by sxlion

         作者抱着朴素的助人初衷和与大家分享SAS编程经验的愿望,开始了写书历程,并保持着高昂的写作热情直到本书完成。据我所知,准备或部分完成SAS书稿的SASor(SAS爱好者的代称)不少,其中包括像我这样的鸡血分子,但是能够忍受重复编辑文字代码过程数日长时间的枯燥和保持追求更好一点的耐心,坚持到出版那一刻的SASor却屈指可数。纵览全书,作者在分析了市场上已有SAS参考书籍特点的基础上,给了本书一个较好的定位,填补了当前SAS实用编程书籍的较大缺口。本书章节内容丰富、编制合理,各章节富有层次和逻辑感,从各要点的选择与偏重就可见一斑。以绘图章节为例,中文SAS书籍基本上缺失了画图编程内容,即使有也是粗略的介绍,并无实质参考性。本书画图章节首先全面介绍SAS三种绘图功能模块,然后选择功能较强、上手较为容易的ODS(Output Delivery System)图形系统作实例绘图实现方式,运用逐步提问的方式,展示各类系列图形编程示例,举例丰富、又有一定的深度,较为全面的讲解了各种绘图编程方法。内容上安排匠心独具,实用性参考性很强。

显然,任何一本书,都不可能解决学习工作中的方案设计、数据收集、整理、分析及绘图展示等数据方面的所有问题,但是本书所叙内容对于SAS编程要素的解读、数据操作与管理、基于数据的绘图与制表等等均有实用参考功能和启发引导作用。因此,此书可作为不同编程水平层级的SASor案头常备书。

再次为作者的勤奋和诚意点赞!

邵小龙

28 9月 15 SAS绘图即学即用系列连载4.2-面图

SAS绘图即学即用系列连载4.2 –面积图: 以下代码 可以拷贝到SAS编辑器中,直接使用;稍作更改便可得到自己满意的图形。以下来自一本关于SAS绘图的书稿(未出版草稿),均为本人原创。 完整代码详见SAS资源资讯列表  www.saslist.net

4.2  面图

4.2.1 面积图

使用PATTERN=改变面积填充区的属性。

sample421

1
2
3
4
5
6
7
8
9
10
FILENAME file "d:\SAS_charts\sample421.png";
goptions reset=all device=png gsfname=file/*设置图片格式和存放点*/
hsize=8cm vsize=6cm ; /* 设置绘图区域大小 */
symbol value=none interpol=j ; /* 设置点属性 */
pattern1 c=orange;
proc gplot data=sashelp.stocks;
plot high*date /areas=1;
where stock="IBM" and ('01feb90'd <= date <= '01dec92'd);
run;
quit;

4.2.2 点面

粗边面积图

 

sample420

1
2
3
4
5
6
7
8
9
10
FILENAME file "d:\SAS_charts\sample422.png";
goptions reset=all device=png gsfname=file/*设置图片格式和存放点*/
hsize=8cm vsize=6cm ; /* 设置绘图区域大小 */
symbol1 value=none interpol=j width=3 Color=red; /* 设置点属性 */
pattern1 c=orange;
proc gplot data=sashelp.stocks;
plot high*date high*date=1 /overlay areas=1 ;
where stock="IBM" and ('01feb90'd <= date <= '01dec92'd);
run;
quit;

4.2.3 分组面积图

sample422

1
2
3
4
5
6
7
FILENAME file "d:\SAS_charts\sample423.png";
goptions reset=all device=png gsfname=file/*设置图片格式和存放点*/
hsize=8cm vsize=6cm ; /* 设置绘图区域大小 */
symbol1 value=none interpol=j c=blue; /* 设置点属性 */
symbol2 value=none interpol=j c=red; /* 设置点属性 */
pattern1 c=blue;
pattern2 c=red;

proc gplot data=sashelp.stocks;
plot high*date=stock / areas=2 ;
where stock NE “IBM” and (’01feb90’d <= date <= ’01dec92’d);
run;
quit;

4.2.4 区域面积图 (高低区域)

sample423

1
2
3
4
5
6
7
8
9
10
11
12
FILENAME file "d:\SAS_charts\sample424.png";
goptions reset=all device=png gsfname=file/*设置图片格式和存放点*/
hsize=8cm vsize=6cm ; /* 设置绘图区域大小 */
symbol1 value=none interpol=j ; /* 设置点属性 */
symbol2 value=none interpol=j ; /* 设置点属性 */
pattern1 c=white;
pattern2 c=orange;
proc gplot data=sashelp.stocks;
plot low*date high*date /overlay areas=2 ;
where stock="IBM" and ('01feb90'd &lt;= date &lt;= '01dec92'd);
run;
quit;

4.2.5  其他

调整和修饰:点标记、参考线、修饰坐标轴

sample425

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
FILENAME file "d:\SAS_charts\sample425.png";
goptions reset=all device=png gsfname=file/*设置图片格式和存放点*/
hsize=12cm vsize=8cm ; /* 设置绘图区域大小 */
symbol1 value=none interpol=j c=gray; /* 设置点属性 */
symbol2 value=none interpol=j c=orange; /* 设置点属性 */
symbol3 value=none interpol=j c=red w=2;
pattern1 c=gray;
pattern2 c=orange;
axis1 order= ('01jan86'd to '01jan06'd by 1461) LABEL=( "Period") minor=none ; /*调整坐标轴的显示、改变轴标签内容*/
axis2 order= (0 to 250 by 50) LABEL=(angle=90 "") minor=none offset=(,0.4cm); /*调整坐标轴的显示、改变轴标签内容和位置*/
legend1 label=none
position=(top right inside) mode=share;
Title H=0.4cm font="Thorndale AMT/bold" "IBM's stock from '01JAN86' to '01JAN06' ";
Footnote justify=left "Data resource: sashelp.stocks" ;
proc gplot data=sashelp.stocks;
plot low*date high*date close*date=3 /overlay areas=2
haxis=axis1 vaxis=axis2
vref=50 to 200 by 50 lvref=1 CVREF=black WVREF=1
legend=legend1;
where stock="IBM" ;
run;
quit;

17 8月 15 SAS绘图即学即用系列连载4.1-线图

by sxlion

 SAS绘图即学即用系列连载4.1 –曲线图: 以下代码 可以拷贝到SAS编辑器中,直接使用;稍作更改便可得到自己满意的图形。以下来自一本关于SAS绘图的书稿(未出版草稿),均为本人原创。 完整代码详见SAS资源资讯列表  www.saslist.net

4.1  线图

4.11 曲线图

sample411

1
2
3
4
5
6
7
8
9
FILENAME file "d:\SAS_charts\sample411.png";
goptions reset=all device=png gsfname=file/*设置图片格式和存放点*/
hsize=8cm vsize=6cm ; /* 设置绘图区域大小 */
symbol value=none interpol=j CI=orange width=3; /* 设置线点属性 */
proc gplot data=sashelp.stocks;
plot high*date;
where stock="IBM" and ('01feb90'd &lt;= date &lt;= '01feb91'd);
run;
quit;

4.12 分组曲线图

1
2
3
4
5
6
7
8
9
10
11
FILENAME file "d:\SAS_charts\sample413.png";
goptions reset=all device=png gsfname=file/*设置图片格式和存放点*/
hsize=8cm vsize=6cm ; /* 设置绘图区域大小 */
symbol1 value=none interpol=join CI=red width=2;
symbol2 value=none interpol=join CI=blue width=2;
symbol3 value=none interpol=join CI=orange width=2;
proc gplot data=sashelp.stocks;
plot high*date=stock;
where ('01feb90'd &lt; date &lt; '01feb91'd);
run;
quit;

 

4.13 双/多曲线图

sample414

1
2
3
4
5
6
7
8
9
10
11
FILENAME file "d:\SAS_charts\sample414.png";
goptions reset=all device=png gsfname=file/*设置图片格式和存放点*/
hsize=10cm vsize=8cm ; /* 设置绘图区域大小 */
symbol1 value=none interpol=join CI=red L=2 width=1; /*L:设置线型 */
symbol2 value=none interpol=join CI=orange L=1 width=2;
symbol3 value=none interpol=join CI=green L=3 width=1;
proc gplot data=sashelp.stocks;
plot high*date close *date low*date /overlay ;
where stock="IBM" and ('01feb90'd &lt; date &lt; '01feb91'd);
run;
quit;

4.14 双坐标曲线图

sample415

1
2
3
4
5
6
7
8
9
10
11
FILENAME file "d:\SAS_charts\sample415.png";
goptions reset=all device=png gsfname=file/*设置图片格式和存放点*/
hsize=10cm vsize=8cm ; /* 设置绘图区域大小 */
symbol value=none interpol=j CI=red width=1; /* 设置线属性 */
symbol2 value=none interpol=j CI=black width=1; /* 设置点属性 */
proc gplot data=sashelp.stocks;
plot high*date/vzero;
plot2 volume*date;
where stock="IBM" and ('01feb90'd &lt;= date &lt;= '01feb91'd);
run;
quit;

4.15  其他修饰: 

参考线、图例、坐标轴、标题、脚注

sample416

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FILENAME file "d:\SAS_charts\sample416.png";
goptions reset=all device=png gsfname=file/*设置图片格式和存放点*/
hsize=12cm vsize=8cm ; /* 设置绘图区域大小 */
symbol1 value=none interpol=join CI=red width=2;/* 设置点属性 */
symbol2 value=none interpol=join CI=orange width=2;
symbol3 value=none interpol=join CI=green width=2;
axis1 order= ('01jan86'd to '01jan06'd by 1461) LABEL=( "Period") minor=none offset=(0.2 cm); /*调整坐标轴的显示、改变轴标签内容*/
axis2 order= (0 to 250 by 50) LABEL=(angle=90 "") major=none minor=none; /*调整坐标轴的显示、改变轴标签内容和位置*/
legend1 label=none
position=(top right inside)
mode=share;
Title H=0.4cm "Three company's stock from '01JAN86' to '01JAN06' ";
Footnote justify=left "Data resource: sashelp.stocks" ;
proc gplot data=sashelp.stocks;
plot close*date=stock /
haxis=axis1 vaxis=axis2
vref=50 to 200 by 50 lvref=1 CVREF=black WVREF=1
legend=legend1 ;
run;
quit;

05 8月 15 SAS绘图即学即用系列连载4.0-点图

by sxlion

 SAS绘图即学即用系列连载4.0–点图: 以下代码 可以拷贝到SAS编辑器中,直接使用;稍作更改便可得到自己满意的图形。以下来自一本关于SAS绘图的书稿(未出版草稿),均为本人原创。 完整代码详见SAS资源资讯列表  www.saslist.net

4.0  点图

4.01 散点图

也可使用SYMBOL全局选项来改变点的属性。

sample401

1
2
3
4
5
6
7
8
FILENAME file "d:\SAS_charts\sample401.png";
goptions reset=all device=png gsfname=file/*设置图片格式和存放点*/
hsize=10cm vsize=8cm ; /* 设置绘图区域大小 */
symbol color=black value=dot ; /* 设置点属性 */
proc gplot data=sashelp.class;
plot weight*height/ vzero;
run;
quit;
4.02  分组散点图
sample402
1
2
3
4
5
6
7
8
9
FILENAME file "d:\SAS_charts\sample402.png";
goptions reset=all device=png gsfname=file
hsize=8cm vsize=8cm ; /* 设置绘图区域大小   */
symbol1 color=blue value=square  ;    /* 设置各分组数据散点的属性 */
symbol2 color=red value=squarefilled   ;
proc gplot data=sashelp.class;
plot weight*height=sex/vzero;  /* 使用绘图程序必须语句和选项*/
run;
quit;
4.03 双坐标轴 散点图

sample403

1
2
3
4
5
6
7
8
9
10
FILENAME file "d:\SAS_charts\sample403.png";
goptions reset=all device=png gsfname=file
hsize=12cm vsize=8cm ; /* 设置绘图区域大小 */
symbol1 color=blue value=squarefilled ; /* 设置各分组数据散点的属性 */
symbol2 color=black value=dot ;
proc gplot data=sashelp.class;
plot weight*age /vzero; /* 使用绘图程序必须语句和选项*/
plot2 height*age /vzero; /* 使用绘图程序必须语句和选项*/
run;
quit;
4.04   象限图 其他调整和修饰:点标记、参考线、修饰坐标轴、 标题 脚注

标记数据点和参考线

sample404

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FILENAME file "d:\SAS_charts\sample404.png";
goptions reset=all device=png gsfname=file
hsize=10cm vsize=10cm ; /* 设置绘图区域大小 */
symbol1 color=orange value=dot H=2 POINTLABEL=("#name" JUSTIFY=center) ; /* 设置数据点的属性 */
axis1 order= (50 to 74 by 12) LABEL=( "身高/英寸") major=none minor=none; /*调整坐标轴的显示、改变轴标签内容*/
axis2 order= (40 to 140 by 50) LABEL=(angle=90 "体重/磅") major=none minor=none; /*调整坐标轴的显示、改变轴标签内容和位置*/
Title H=0.5cm font="MingLiU" "班级男生身高分布图" ;
Footnote justify=left "Data resource: sashelp.class" ;
proc gplot data=sashelp.class;
plot weight*height /
haxis = axis1 /*指定横坐标设置为前面全局设置坐标axis1*/
vaxis =axis2 /*指定纵坐标设置为前面全局设置坐标axis2*/
href = 62 chref=black /* 增加参考线*/
vref = 90 cvref=black;
where sex="男" ;
run;
quit;

02 11月 14 SASor论坛回忆录

SASor论坛回忆录

by sxlion

          论坛,也叫BBS,是一种伴随互联网络初期出现的古老技术交流系统。尽管现在各种现代化的社交媒体如博客、微博等出现,仍然没有一种技术来替代它。话说学SAS编程技术,有人在大学课堂和机房里学的,有人在公司里学的,有人是在蓝翔学的(未经考证),但是大部分人都是自学的。在学习初期不管是SAS软件、资料,还是遇到各种学习问题,基本上都是找论坛解决的,因为没有吊丝买得起软件和SAS公司推出的各种官方培训课程。http://saslist.net

说起学SAS编程技术,中国那家论坛强?老SASor(即SAS编程爱好者的自称)也许能如数家珍地说出以下几个论坛:国内的有SASor论坛,SAS中文论坛,统计之都论坛SAS版,人大经济论坛SAS版等等,国外的有UGA大学邮件列表SAS-L,末名空间统计版,SAS社区论坛等等。作为一个混论坛出生的SAS编程爱好者,我和普通的SASor初学者一样,为了解决问题和资料,2003年开始混迹各大论坛。http://saslist.net

有一天,我的小小世界观被SASor论坛上SAS_Dream的两篇《关于SAS的零碎印象》和《SAS语言管窥》文章震撼了。在这之前,我曾天真地认为会熟练使用几个统计过程步就是SAS高手,因为至少在我当时的圈子里,就是这么定义“高手”的。后来认真拜读了偶像SAS_Dream每个帖子,帖帖都是经典。很多帖子都是不明觉厉,从帖子中感觉偶像对计算机语言和操作系统了解很深,都不是一般的功力(你要是不服,看看这个历史帖子:何种方式最有效地得到数据表的观测数?)。所谓人外有人,天外有天。从他的一个回帖中意外发现偶像也有偶像,id为“data _null_;”。 光看这个id,就觉得这个绝对是SAS骨粉。这位神级老前辈现在还在UGA的SAS_L上经常出现,异常活跃,回帖中看似轻描淡写,实则高深莫测,深度广度远在SAS HELP之上。http://saslist.net

大家如果现在去网上寻找偶像SAS_Dream的帖子的话,你会发现除了上面的两篇文章因为被转载而流传下来外,没有其他足迹留下。SASor论坛(最早网址:www.sasor.com)也在2010 年左右由蓝色色调改成红色色调以后,不久就在网上烟消云散了,只剩下一个域名广告页sasor.feoh.net。某年有幸在微博上碰到SASor论坛的网站站长imoen,简单的交流了一下,只知道网站临时换了个地方。在以前站记里面了解到,当年imoen凭个人兴趣维护一个技术论坛花费许多精力,需要持久的热情和奉献。“SASOR论坛:SAS爱好者网站,为SAS爱好者提供一个信息交流平台,使大家有个互通有无之地。”简单一句话,做起来不易。作为一个长期在编程语言排行榜上排名20名(国外排名,国内没数据)左右徘徊的古老语言SAS的中文论坛,人气可以用青黄不接来形容。http://saslist.net

尽管如此,野百合也有春天,SASor论坛里面也有很多话题高潮起伏的时段。记得有一段是在2005年左右,一群SASor为了解决一个个实际问题,在里面用代码论战,各种精彩分层。藏龙卧虎,高手辈出,不分年龄,毋论出身,有时还会引来一些美女SASor来调剂气氛,巾帼不让须眉,代码也都是有声有色。论坛里没有虚伪奉承和利益冲突,也没有人生公鸡,只有一段段自鸣得意的代码。可惜美好的时光不长久,春去秋来,草长莺飞。论坛id后面一个个现实生活中的SASor,或结婚生子,或迁徙他乡,或跳槽转行,人生变幻,几度春秋,论坛里新人经常有,故人不常在。美好时光,竞成稀缺的回忆。作为另一个专门的中文SAS论坛——SAS中文论坛,与SASor论坛互为兄弟论坛,境况类似,特别是这几年在尝试社交圈子和改版后,人气暴跌。和站长shiyiming有个几次聚会见面,谈到过往,不禁唏嘘。除了这两个论坛外,国内还有些综合性论坛下面有SAS版块,大多忙着交换资料和软件下载安装信息,为入门者提供了些许方便。但是大多都是好贴不常有,高手不常在,无法形成当年的氛围。http://saslist.net

网络技术发展很快,建设论坛技术到傻瓜自动的程度。然而,曾经几时,我也想着做一个SASor论坛,大家可以互通有无、交流切磋SAS编程技术。可惜无法忍受着人气凄凉的预期,于是就开了个人博客网站,写着些自娱自乐的技术文章。