sxlion

11月 222019
 

sxlion

大家有一个普通的印象:SAS的更新很慢,很老很落后。可能跟它的版本命名有关,SAS9.0是2004年出来的,到现在都快20年了,版本号 还停留在9字头,并且还没有继续更新的迹象。当然这个与SAS公司的明面

原创文章: ”难道是SAS10?云分析服务时代的到来“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/454

11月 222019
 

sxlion

大家有一个普通的印象:SAS的更新很慢,很老很落后。可能跟它的版本命名有关,SAS9.0是2004年出来的,到现在都快20年了,版本号 还停留在9字头,并且还没有继续更新的迹象。当然这个与SAS公司的明面

原创文章: ”难道是SAS10?云分析服务时代的到来“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/454

7月 012017
 


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

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 写到:
PROC SQL NOPRINT;

1
2
3
4
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
%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分别取值。
我去做饭,不能多写了,希望多开一些这样的题目,做深入的讨论。
两位周末快乐!

原创文章: ”【论坛沉钩_001】何种方式最有效地得到数据表的观测数?“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/448


6月 102017
 


The most essential short QA lists on the way of SAS learning

by sxlion

导读:今天遇见畅销SAS图书作者谷鸿秋博士(“畅销”是“预测”出来的,暂无数据支撑),匆忙会面后简单聊了一下,感慨颇多,一时兴起(咖啡喝多了,睡不着。),为弥补2016年零博文记录的遗憾(凑个数),在此行文一篇。纯属胡拼乱凑,尽可一笑了之。

注:画了重点,看粗体。

Q:为什么要学SAS?

A:因为这个世界是随机的,但是人类总想认识世界

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

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

Q: SAS怎么安装?

A:网上搜。SAS很难安装,但是学习SAS的难度远大于安装SAS的难度。

Q:学好SAS到底难不难?

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

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

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

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只讲怎么用,不讲为什么这样用。

。。。。。。编不下去了。。。。。。

原创文章: ”SAS学习过程必提问题简答列表“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/445


6月 072017
 


by sxlion

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

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

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

邵小龙

原创文章: ”《SAS编程演义》推荐语“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/442


9月 282015
 


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_chartssample421.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_chartssample422.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_chartssample423.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_chartssample424.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_chartssample425.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;

原创文章: ”SAS绘图即学即用系列连载4.2-面图“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/420


8月 172015
 


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_chartssample411.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_chartssample413.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_chartssample414.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_chartssample415.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_chartssample416.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;

原创文章: ”SAS绘图即学即用系列连载4.1-曲线图“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/409


8月 052015
 


    以下代码 可以拷贝到SAS编辑器中,直接使用;稍作更改便可得到自己满意的图形。以下来自一本关于SAS绘图的书稿(未出版),均为本人原创。 

by sxlion

4.1  点图
4.01 散点图

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

sample401

1
2
3
4
5
6
7
8
FILENAME file "d:SAS_chartssample401.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_chartssample402.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_chartssample403.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_chartssample404.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;

原创文章: ”SAS绘图即学即用系列连载4.1“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/403


11月 022014
 


SASor论坛回忆录

by sxlion

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

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

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

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

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

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

原创文章: ”SASor论坛回忆录“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/391


1月 122014
 


SAS与R的优缺点讨论:从工业界到学界

翻译 by JosephYX  校对 by sxlion  原文链接

导读:尽管这个话题已经讨论过很多次,但是这个翻译是比较系统的总结了一下两个软件的优缺点,值得一看。PS: 此话题已老,推荐新人看,另见以前一篇SAS评论引发的思考 by sxlion

摘要

尽管在工业界还是被 SAS 所统治,但是 R 在学术界却得到广泛的应用,因为其免费、开源的属性使得用户们可以编写和分享他们自己的应用。然而,许多正在获得数据分析相关学位的学生们由于缺乏 SAS 经验的情况而在找工作的路上困难重重,与此同时,他们要面对从学校熟悉的 R向 SAS 转型的痛苦。理想情况是,你需要知道所有可能的编程语言,工作的时候使用与工作情况最匹配的那个,当然这个基本上是痴人说梦。我们的目的就是展示这两种差异巨大的语言各自优点,并且共同发挥他们的优势,我们同时还要指出那些不使用 SAS 好多年的、现在正在使用 R语言的人们的一些误解和偏见,因为他们已经很少关注 SAS 的发展和进步了。

 前言

我们选取 SAS 和 R 的原因是因为他们是目前在统计领域中最有统治地位的两个编程语言。 现在我们注意到一个不好的现象,就是在学术界重度使用R的用户认为R在被SAS霸占的工业界有具有相当优势的,然而熟练掌握这两个软件对于想在数据分析领域取得小有成就的年轻人来说很关键。教授误解加上对某个软件的偏好往往对学生有着不利的引导,因此需要在这里指出:教授们,别偷懒了,对某种语言的主观偏好将会影响学生的钱途。

SAS经常有一些更新(有点慢,sxlion注),非SAS程序员由于没有技术跟进往往并不知情。SAS绘图模块就是一个快速发展并成长的例子,然而许多人并不注意到这些升级以至于他们仍然固执的使用 R画图。SAS另一个不广为人知的例子是SAS可以轻松自定义函数,这正是 R 的强项。这个SAS过程步(PROC)有全面的语法检查、翔实的文档和技术支持;然而一个新的使用者很可能不知道这些工具可用,或者根本不知道它们的存在。另外,SAS 还拥有卓越的培训课程,网络及用户组分享资源,不同相关主题的大量书籍。知道并合理的使用这些技术以及工具 有助于减少使用 SAS的畏惧之心。

 相关问题讨论

本文就在我们学院碰到的一些共同误解的地方,在此对比列出两种语言的优缺点。当然还有更多的争论在进行中,但是本文汇中我们将选取最为普遍的来进行讨论。我们希望能够消除误解,并且尽可能地为那些不能及时跟进R或SAS的分析人士提供新的信息。

统计方法的新进展

SAS

  • Ÿ  优点:SAS 的软件及算法都是经过检验的,SAS 有技术支持去快速解决用户的需求。 如果需要的话,SAS  会尝试在已存在的步骤中嵌入新的方法,例如增加一个选项或者新增一个语句(statement),因此用户不需要学习另外一个过程步。SAS也 会发布最新通讯来详细说明软件的更新。
  • Ÿ   缺点:更新升级较慢。

R

  • 优点:用户可以快速实施新方法,或者寻找已经存在的软件包。很容易学习和理解新方法,因为学生们可以看到代码中的函数。
  • 缺点:R 文档的更新都是通过用户进行的,所以新的方法并没有被很好调试和检验。 开发者们散布于各地,而并没有在一起来进行团队合作的开发。

在这个问题上,SAS 和 R 的优缺点是互补的。对于 R,有人认为它的代码是开放的,可以看到 R 是如何工作的,这对于拥有相关背景的人是比较容易理解的。然而对于 SAS,它的过程步是预装的,文件中对不同的语句(Statement)及选项( Option) 存储了大量的数学公式。如果用户真的想看到底层程序,这个也是很容易实现的。对两种语言的使用着者来说,不管是学生还是其它用户,只是运行代码的话对于两种语言是没有什么不同的。你运行SAS,不需要知道它在干什么,类似的是,你运行R时,也不需要知道它在后台调用的函数。你所做的就是按章操作而已。

 画图

SAS

  • 优点:SAS画图模块正变得越来越灵活、精良和易于使用。在一些分析过程步(PROCs) 中,ODS Graphics可以自动的生成一些图形,而不需要额外的代码。这使得用户多了一个选择,即可以使用默认的图表生成图表,也可以自己来创造个性化的图表。
  • 缺点:图形背后的模板语言(TL)是庞大及不易使用的,特别是对于新手来说。新的高级功能如交互式绘图功能( interactive graphs),对于新手来说也是难以掌握的。

R:

  • 优点:可以简单的生成漂亮的图表,还可以使用循环语句来生成动画。
  •  缺点:在 R 中图表功能与统计分析无关,绘图和分析是相互独立的。用户必须自己来决定什么样的图形是合适的,使用效果的好坏取决于用户们的统计背景和喜好。尽管改变图形去达到特别的维度或角度并不是一个简单事儿。

SAS9.2 之前版本的图表功能不足是 R 更吸引人的一个主要原因之一。R的一个最好的特性之一就是其图表功能的高质量性和易用性。但是,当前 SAS/GRAPH 搭配 ODS Graphics 及 SG 过程在软件中增加了制图的能力。联合使用 ODS graphics 和 PROCS 可以使用户简单地生成与分析相关的展示图表。 特定的绘图过程步如PROC SGPLOT,SGPANEL和SGSCATTER等越来越多,当然需要的一定代码来实现。另外,SAS 中还有一些其他不错的绘图选择,如 SGDESOGNER 和 SAS Enterprise Guide。

 函数及可重复使用的代码

SAS

  • Ÿ 优点:SAS有可在 DATA 和 PROC 步使用的大量函数和自定义函数。另外强大无所不能的、也可以被DATA步和PROC步使用的宏语言。宏变量可定义为局部或者全局类型。
  • Ÿ  缺点:编写自定义函数和详细的宏代码需要深厚的编程知识来确保正确性。

R

  • 优点:在 R 中编写函数很简单,用户也可以通过上传自己的函数到 R-CRAN 上与其 它用户分享。
  • 缺点:编写自定义函数需要深厚的编程知识来确保正确性。变量是严格的局部变量。 在这一点上两种软件拥有类似的利弊。SAS 的早期用户运行自己的定制函数主要取决于宏程序的编写,这也是 R 用户认为其低效及笨重的原因。然而,SAS 9 版本的 PROC FCMP允许用户编写个性化的函数,SAS 9.2 版本又允许用户在 DATA 及 PROC 步中调用这些函数。 这对于简单的统计函数是很有用的,对于更加复杂的统计函数也可以通过 IML 语言来实现。

SAS 及 R 两种语言都面临着怎样有效地、正确的使用函数,这就需要用户在函数编写的过 程中拥有深厚的编程背景。从好的角度来说,一个程序员需要知道他们编写的是什么;危险的是,其它人可以下载一个 SAS 宏或者 P 程序包来使用,尽管他们不知道其内在工作原理, 甚至不知道其正确性。所以,有了对宏及函数适当的了解,再来分享它们并应用于具体的需 求是很方便的。

免费软件

SAS

  • 优点:SAS 有OnDemand 版本的软件,免费提供给学位颁发机构。
  • 缺点:真正的 SAS 和 JMP 并不是免费的。OnDemand 版本对使用何种操作系统有一 些限制,而且据反映运行速度很慢。

R

  • 优点:R 是完全免费。
  •  缺点:开源软件对于大公司来讲都会有安全方面的担忧。

SAS公 司 为 教 育 机 构 提 供 的 免 费 替 代 品 可 以 保 证 教 授 们 在 课 堂 上 的 使 用 。 对 于 OnDemand 的安装过程和速度需要注意。总之,SAS 和 JMP 不是免费的,公司需要使用许 可来使用该软件。R 可以免费的安装,但许多参与论战的博主们认为如果那些正在使用 SAS 的公司去使用 R,将会花费远远超过 SAS 授权费用的资源和财力,例如重写代码、构建新 的团队、招聘新的专业人员等等。而且对于那些分析结果需要经得起严格检验要求的公司, 可能 SAS 更加适合。还没有现存分析框架的小公司可以来探讨是选择历史悠久、资源丰富的付费软件(SAS),还是要选择虽然免费、但是还需要其它先期投资(如员工的知识背景, 编写及调试代码)的软件(R)。最终,从时间和金钱的角度来衡量,SAS 和 R 的花费可能 是基本接近的。

 用户支持

SAS

  • Ÿ 优点:SAS 有丰富的网上参考资料,专业的技术支持,专业的培训课程,许多优秀 的出版书籍,一个紧密的用户组及网络社区。SAS 的问题可以直接反映给技术支 持部门,他们会与用户一起来解决。
  • Ÿ  缺点:真的没想到。

R:

  • 优点:R 有很好的示例手册,网上参考材料,R 邮件列表和 R 聚会。
  • 缺点:用户们取决于其它用户对于软件的看法及建议。因为 R 的开发者散布于全球 各地,所以全球的用户是缺乏联系的。程序包(Package)并不是由 R 软件的开发 核心团队来编写的,所以导致了程序的不完善甚至有时候会对结果的正确性有所怀 疑。另外,很难去直接寻找一个针对具体问题的人员或者团队。

SAS 所提供的卓越的支持是他们以客户为中心设计产品的亮点。SAS 支持的优点对初 学者是理想的帮助,其大量的细节也使资深用户受益匪浅。R 较为混乱的参考资料和匮乏的 技术支持在需要寻找帮助时困难重重。这违背了 R 的开发设计者的初衷。

 数据处理

SAS

  • 优点:SAS 可以处理任意类型和格式的数据。DATA 步的设计纯粹就是为了数据的管 理,所以 SAS 擅长处理数据。利用丰富的选项,SAS 可以将大数据处理的很好,拼表以及 PROC SQL 也可以减少运行时间。
  • 缺点:在 DATA 步骤中 SAS 中的DATA步有非明示的循环算法,因此使用者的编程思维需要改变以符合SAS的运行逻辑。

R:

  • 优点:R 在最初就被认为是更加适合大数据的。它对于矩阵的操作和排序的设计是非 常高效的。R 也可以很好的进行各种基于分析的数据模拟。
  •  缺点:R 的设计更加关注统计计算以及画图功能,所以数据的管理是比较耗时的,而 且不如在 SAS 中那么明晰。其中一个主要的原因就是:对于各种不同类型的数据,在 R 中进行很好的数据处理是比较难以掌握的。

数据处理的重要性经常在统计编程中被忽视了,但是它确实是非常关键的,因为实际的数据非常糟糕,不能直接应用于分析。纯粹地使用 R 的学生们对于得到的数据往往有不切实际的期望,而学习 SAS 是一个有效的方法去解决怎样整理原始的数据。SAS可以对大而繁杂的数据集进行管理和分析,而 R更着重于进行分析。

当处理复杂数据时,R 的面向对象的数据结构会遇到很多问题,并且R还缺乏一个内在的循环过程。在SAS中,应用标准化工具经常会进行如下操作:合并含有大量缺失数据的复杂数据集,再生成及修改其中的变量。而在R中,进行复杂的数据处理操作是没有标准化的,而且经常会导致更加复杂的过程。

SAS与R软件运行时间的快慢对比取决于任务。如SAS可以通过设置 MEMLIB,从而像R一样使用内存(而非硬盘)来提升运行速度。但在R中,没有这样的硬件驱动,只能使用内存来执行。

 安装

SAS

  • 优点:SAS所有的分析功能及授权都被整体打包在一起安装。升级授权证书是非常容易。
  • 缺点:首次安装或升级到一个新的版本是很耗时且有点麻烦的。但是这比在课堂上向 学生们讲述如何使用这个软件简单1000倍。现在越来越多的学生们在课堂上使用Macs系统的笔记本,但是SAS没有Mac版,意味着这部分学生无法使用 SAS。

R:

  • 优点:R 和其最常用的用户界面 RStudio 在 Window、Mac 和 Unix 环境下都很容易安 装和打开,且安装速度都很快。
  • 缺点:运行必须知道满足需求的程序包,然后搜索、安装、了解具体功能。截止原文发表时,共有 4379 个可用程序包,这一数量还在每天增加。在提供了更多选择的 同时,也增加了搜寻的时间和难度。

SAS 的获得对用户来说比较困难,首次安装也是比较麻烦的。但是一旦安装完成了, 有关软件本身的问题就很少了,对于特别的分析,也不需要额外的程序包或者步骤了。R 中 相反,安装非常简单,但对于额外分析,需要另外安装程序包,浪费了安装软件所节省的时 间。

报表

SAS

  • 优点:SAS 通过很多有用的过程步来生成详细漂亮的报表。
  • 缺点:能提供更详尽报表的过程如 TABULATE、REPORT 等,在能正确而有效的使用前,将为有一个艰难的学习曲线等待你跨越。

R:

  • 优点:报表方面,R拥有诸多利器。Sweave包可以创造包含文字、表格和图形的 PDF 文件,其中图形可以LaTeX 和 R 命令来装扮。另一个新的程序包 Knitr 可以快速生成格式限制较少的网页内容。
  • 缺点:R 没有一个模式化的方式来生成报表,所以需要在编程上花一些功夫。报表的生成对于 R 来说是一个比较新的方向,所以它不如 SAS 来的简单和快速。在 R 中,Sweave 和 Knitr 是报表这方面的领先的程序包,但是学习起来也比较困难。

重度报表使用用户应该了解这些以上不同,尽管学习 SAS 的报表功能需要花费一些时间,但是一旦掌握了就很有价值并有很高的灵活性。而从最基础学习 R 的报表功能也许不需要像 SAS 那样花那么多时间。

结论

我们可以看到解决 R 与 SAS 的辩论是三合一的。第一,就像在任何一个统计编程社区 一样,我们知道这个PK是没有一个最终赢家。两种软件各有优缺点。他们有共存的必 要,而学术上的教学中,他们也有共存的必要。如果学生们能够明确他们的需求并合理的应 用,那样会获得更好的效果。如果只给学生教授一种软件是有局限性的,这样会使他们难以 发挥学习另外一种软件的潜力。第二,用户们需要保持他们的工具箱与时俱进。SAS 和 R 都有一些很不错的 学习网站去介绍最新 的技术上的进步。 SAS  技 术 支 持 网 站 http://support.sas.com 有许多最新的动态,如 Focus Areas、E-newsletters、RSS 种子和博客。R 博客网站 http://www.r-bloggers.com 包含了许多用户贡献的新闻和练习。第三,最理想的是学习 两种软件并将其融合于分析中。这里有许多方法可以尝试,例如用 SAS 的 IML 和 SAS 的 IML/Studio(IML 是 SAS 的一个加载项)功能,或者通过使用 SAS X Statement 执行外部命 令,使 R 代码在 SAS 中转化成 SAS 命令来运行。对于 R 的用户们,通过转化 R 到 SAS 的 用户界面,可以同时使用 2 种软件。通过使用两种软件可以使处理及分析数据变得事半功倍, 而且使所有的用户都满意。

原创文章: ”SAS与R优缺点讨论:从工业界到学界“,转载请注明: 转自SAS资源资讯列表

本文链接地址: http://saslist.net/archives/370