msgbartop
List for SAS fans and programmer
msgbarbottom

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编程技术。可惜无法忍受着人气凄凉的预期,于是就开了个人博客网站,写着些自娱自乐的技术文章。

12 1月 14 SAS与R优缺点讨论:从工业界到学界

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时,也不需要知道它在后台调用的函数。你所做的就是按章操作而已。

 画图 (更多…)

05 12月 13 SAS DATA步之全解密

SAS DATA步之全解密

Swati Agarwal,OPTUM,Eden Prairie,MN

空谷幽兰  翻译  sxlion 校对  原文链接

译言:SAS DATA步对于SAS入门学习者来说是个难以理解的东西,因为SAS封装了一些过程,这种封装对于有语言基础的人来说反而是一个障碍。本文非常详细的解释了SAS 数据的编译、执行过程,对于了解SAS的基本运行有很大帮助。不管SAS老鸟,新鸟,相信你都会有收获,因为这篇文章是难得的如此系统 !

摘要

每个SAS数据步(SAS Data step,以后写成简写“DATA步”)在整个SAS程序中编译和执行过程中。大量DATA步的处理过程都是非明示的(即隐藏不可见)。例如,尽管程序中没有使用循环控制语句不包含循环,但DATA步都像一个自封装的小程序以一种非明示的循环形式执行。

这篇文章探讨了一些非明示的DATA处理过程怎么控制你的DATA步实际运行的。

需要提前说明的概念:

  •   程序数据向量(Logical Program Data Vector简写成PDV,台湾地区翻译成“程式资料向量”)
  •   SAS自动变量名及其使用
  •   理解data步的内部处理过程
  •   代码编译期间发生的事情
  •   程序执行期间实际发生了什么
  •   如何获取和存储变量属性

你或许在程序中写过大量的DATA步:一些能运行,一些则运行不了。有时候你知道为什么;有时你不知道为什么,甚至你冥思苦想而百思不得其解。如果碰到过这些问题,那么这篇文章很适合你。

Data步设计的非常好,但是有些另类。如果你想写出很漂亮的代码,就很有必要知道DATA步的工作原理。读完这篇文章以后,“哦,哦,… 原来如此!”,一个即使使用SAS多年的老鸟,也会发出这样的感叹。 from http://saslist.net

引言

DATA步是建SAS数据集的主要方法之一。要想成为一个优秀的SAS程序员很有必要理解DATA步的各个环节,主要是因为一些涉及数据处理和创建数据集的任务可能只能通过DATA步才能解决(这些任务不能通过SAS过程步(SAS procedures,以后简写成“SAS过程步”)解决、或者使用SAS过程步太过复杂而难以使用)。

了解DATA步的生命周期非常重要,它分为编译和执行两个阶段。同时学习PDV也非常重要。PDV贯穿SAS的编译和执行两个阶段,而且能决定了信息在DATA步中的存储及变化。

编译阶段包括:

  •   编译SAS语句,包括检查语法
  •  创建一个输入缓存区(input buffer)(如果需要读入原始数据文件)、一个PDV和描述性信息

执行阶段包括:

  •   计算Data步迭代的次数(从Data语句开始)
  •   将PDV中的所有变量设成缺失值并初始化自动变量
  •   读取输入观测(从原始文件或SAS数据集)
  •   执行附加的处理或计算语句
  •  将一条数据记录写入输出数据集并返回到DATA步语句

PDV贯穿编译和执行阶段:

  •  PDV是内存中的一个临时逻辑区域,SAS建立数据集时,每条观察值只有一次机会用到PDV。
  •  包含所有变量的当前值
  •  包含两个自动变量:_N_和_ERROR_

(更多…)

21 6月 13 大数据之核心技术 by SAS刘政

近期SAS公司研发总经理刘政先生在2013年6月14日中美创新系列活动之2013大数据创新峰会所做的演讲,主题为:“大数据之核心技术”  内容精彩、图片惊艳,全文pdf见文后链接。 

 

大数据 SAS公司 核心技术

大数据 SAS公司 核心技术

 

大数据 SAS公司 核心技术

大数据 SAS公司 核心技术

 

大数据 SAS公司 核心技术

大数据 SAS公司 核心技术

(更多…)