SAS过程初步
关键词:SAS过程用法及常用语句、用PRINT过程制作列表报告、用SORT过程排序、用SAS/GRAPH绘图、MEANS过程、UNIVARIATE过程、FREQ过程
SAS系统用SAS数据步生成和管理数据,用过程步进行分析、报表、绘 图。本章介绍SAS过程步的一般用法和常用语句的含义,以及几个简单报表、分析、绘图过程 的使用。
SAS过程用法及常用语句
SAS过程用法
SAS过程步的一般形式为:
PROC 过程名 DATA=输入数据集 选项; 过程语句 / 选项; 过程语句 / 选项; …… RUN;
其中PROC语句的选项是可选的,用来规定过程运行的一些设置,如果有多个选项用空格分 开。DATA=输入数据集也是可选的,如果缺省的话使用最近生成的数据集。过程步一般以RUN 语句结束,也可以省略RUN语句而在下一个过程步或数据步的开始处结束,另外还有一种所谓 “交互式过程”可以在遇到RUN语句时不结束过程运行,只有遇到QUIT语句或者下一个过程步 、数据步时才结束。过程步在PROC语句之后、结束之前可以有若干个过程语句。通常情况下 ,过程语句与数据步中的语句不同,数据步中的语句不能用在过程步中。过程步语句一般以 某一个关键字开头,比如VAR、BY、TABLES、WEIGHT等,语句中有一些有关说明,如果有选择 项的话要写在斜杠后。
SAS过程步有些是对数据集作某种变换(比如SORT过程对数据集排序),不生成显示 结果;多数过程步是对数据集作某些分析、报表,这时结果出现在OUTPUT窗口(高精度绘图 过程的输出在GRAPHICS窗口)。对OUTPUT窗口的结果,我们可以用“File | Save As”菜单 把它保存到一个文本文件进行进一步的修饰,插入到其它报告中,也可以用“File | Print ”菜单之间打印。
SAS过程步常用语句
本小节简单介绍几个在SAS过程步中常见的语句,更具体的用法可以在以后实际用到 时再仔细体会。
一、VAR语句
VAR语句在很多过程中用来指定分析变量。在VAR后面给出变量列表:
VAR 变量名1 变量名2 … 变量名n;
变量名列表可以使用省略的形式,如X1-X3,MATH–CHINESE等。VAR用法例如:
var math chinese;
二、MODEL语句
MODEL语句在一些统计建模过程中用来指定模型的形式。其一般形式为
MODEL 因变量 = 自变量表 / 选项;
比如
model math=chinese;
即用语文成绩预测数学成绩。
三、BY语句和CLASS语句
BY语句在过程中一般用来指定一个或几个分组变量,根据这些分组变量值把观测 分组,然后对每一组观测分别进行本过程指定的分析。在使用带有BY语句的过程步之前一般 先用SORT过程对数据集排序。比如,假设我们已经把C9501数据集按性别排序,则下列PRINT 过程可以把男、女生分别列出:
proc print data=c9501; by sex; run;
结果为
The SAS System 2 ----------------------------------- SEX=男 ----------------------------------- OBS NAME MATH CHINESE 1 李明 92 98 2 王思明 86 90 3 张聪 98 109 ----------------------------------- SEX=女 ----------------------------------- OBS NAME MATH CHINESE 4 张红艺 89 106 5 刘颍 80 110
在一些过程(如方差分析)中,使用CLASS语句指定一个或几个分类变量,它实际相 当于因变量。而在另一些过程(如MEANS)中,CLASS语句作用与BY语句类似,可以指定分类 变量,把观测按分类变量分类后分别进行分析。使用CLASS时不需要先按分类变量排序。
四、OUTPUT语句
在过程步中经常用OUTPUT语句指定输出结果存放的数据集。不同过程中把输出结 果存入数据集的方法各有不同,OUTPUT语句是用得最多的一种,其一般格式为:
OUTPUT OUT=输出数据集名 关键字=变量名 关键字=变量名 …;
其中用OUT=给出了要生成的结果数据集的名字,用“关键字=变量名”的方式指定了输 出哪些结果(关键字的例子比如MEANS过程中的MEAN,VAR,STD等等),等号后面的变量名指 定了这些结果在输出数据集中叫什么名字。例如
proc means data=sasuser.c9501; var math; output out=result n=n mean=meanmath var=varmath; run; proc print data=result; run;
五、FREQ语句和WEIGHT语句
FREQ语句指定一个重复数变量,每个观测中此变量的值说明这个观测实际代表多 少个完全相同的重复观测。FREQ变量只取整数值。如
freq numcell;
WEIGHT语句指定一个权重变量,在某些允许加权的过程中代表权重,其值与观测对应 的方差的倒数成比例。
六、ID语句
有些过程(如PRINT、UNIVARIATE)需要输出观测的代号,这一般使用观测的序 号。但是,如果数据集中有一个变量可以用来区分观测(如人名、省市名),就可以用ID语 句指定这个变量作为观测标识,如:
id name;
指定用变量NAME的值来标识观测。
七、WHERE语句
用WHERE语句可以选择输入数据集的一个行子集来进行分析,在WHERE关键字后指 定一个条件。比如:
where math>=60 and chinese>=60;
指定只分析数学、语文成绩都及格的学生。
八、LABEL语句和FORMAT语句
LABEL语句为变量指定一个标签,很多过程可以使用这样的标签。其格式为
LABEL 变量名='标签' 变量名='标签' …;
例如
proc print data=sasuser.c9501 label; id name; var math chinese; label name='姓名' math='数学成绩' chinese='语文成绩'; run;
结果显示
姓名 数学成绩 语文成绩 李明 92 98 张红艺 89 106 王思明 86 90 张聪 98 109 刘颍 80 110
FORMAT语句可以为变量输出规定一个输出格式,比如
proc print data=sasuser.c9501; format math 5.1 chinese 5.1; run;
使得列出的数学、语文成绩宽度占5位,带一位小数。
事实上,在生成数据集的DATA步中也可以用FORMAT语句规定变量的输出格式,用LABEL 语句规定变量的标签,用LENGTH语句规定变量的存贮长度,用ATTRIB语句同时规定变量的各 属性。在数据步中规定的变量属性是附属于数据集本身的,是永久的;在过程步中规定的变 量属性(标签、输出格式等)只用于此过程的本次运行。
用PRINT过程制作列表报告
本节讲解PRINT过程的使用,并用它来辅助讲解一些常用语句的使用。
基本用法
PRINT过程是最常用的SAS过程之一。我们在生成了一个数据集之后,如果不是太大, 一般都用一个
proc print;run;
过程步来列出数据集的内容,这样可以检查变量与值之间对应是否正确,数据输入是否正 确。为了列出一个指定的数据集,在PROC语句中使用DATA=选项指定要列表的输入数据集名 ,比如:
proc print data=sasuser.gpa; run; 在过程内使用VAR语句可以指定要列出的变量并指定顺序。比如, proc print data=c9501; var name chinese sex; run;
列出变量NAME、CHINESE、SEX的值。注意这已不是生成时的变量顺序。变量MATH未列出。 结果如下
The SAS System 3 OBS NAME CHINESE SEX 1 李明 98 男 2 张红艺 106 女 3 王思明 90 男 4 张聪 109 男 5 刘颍 110 女
注意PRINT的输出第一列总是标为OBS,值为观测序号。我们有时不想输出这一列,可 以在PROC PRINT语句中加入NOOBS选项,如:
proc print data=c9501 noobs; run;
结果中就没有了OBS这一列。
在过程中使用WHERE语句可以从输入数据集中选一个子集来处理,在PRINT过程中使用WHERE 可以指定只列出满足条件的观测。比如,
proc print data=c9501; where name in ('李明', '张聪'); run;
结果为
OBS NAME SEX MATH CHINESE AVG 1 李明 男 92 98 86.8333 4 张聪 男 98 109 94.4167
只列出了李明和张聪两个人的观测。注意其观测序号分别为1和4,这是生成C9501数据集 时确定的。
使用中文列标题
为了对列标题使用中文,可以在过程内用LABEL语句给变量指定标签,同时在PROC PRINT语句中加LABEL选项,例如:
proc print data=c9501 noobs label; var name sex math chinese avg; label name='姓名' sex='性别' math='数学' chinese='语文' avg='平均分'; run;
则结果如下:
The SAS System 6 姓名 性别 数学 语文 平均分 李明 男 92 98 86.8333 张红艺 女 89 106 88.6667 王思明 男 86 90 80.5000 张聪 男 98 109 94.4167 刘颍 女 80 110 85.8333
实际上,我们还可以在生成数据集的数据步中使用如上的label语句,结果数据集中 的变量就有了标签,在过程步中可以直接使用而不需再次用label语句定义。
标题及全程语句
我们从上面的输出结果看到,在每页输出结果上面有一行标题,内容为“The SAS System”。事实上,我们可以指定自己的标题来取代SAS缺省的标题。指定标题的TITLE语句 的格式为:
TITLE ‘ 标题内容‘;
例如,在前一例的程序前面加上一行
title '95级1班成绩表';
则输出结果的标题为“95级1班成绩表”。要注意的是,TITLE语句是一个所谓的“全程” 语句,“全程”语句与一般语句不同,一般语句必须用在数据步或过程步内,作为数据步或 过程步的一部分,而全程语句则既可以用在数据步和过程步内,又可以单独使用(在数据步 、过程步外部)使用。全程语句的作用一般有持续性,即:全程语句的效果将持续到退出SAS 系统或用另一个同样的全程语句来修改它。比如,我们在上面用TITLE语句指定了一个标题, 那么,这个标题的作用将持续下去,虽然下一个过程没有用TITLE语句指定标题它也会出现在 下一个过程的输出中,例如在上面用TITLE语句为C9501数据集的列表输出加了标题后,再运 行如下程序:
proc means data=sasuser.gpa; run;
你会发现标题“95级1班成绩表”仍出现在输出的每一页,而这个标题已经与输出内容矛 盾了(现在分析的是SASUSER.GPA数据集而不是C9501数据集)。为了取消这个标题,只要用 一个没有规定内容的空TITLE语句,即:
title;
这时连缺省的“The SAS System”标题也没有了。
用全程语句FOOTNOTE可以为输出加脚注,如:
footnote '第三章例子输出';
则其后的输出每页下方会有脚注“第三章例子输出”,直到用另一个FOOTNOTE语句指定新 的脚注,或用空FOOTNOTE语句取消脚注为止。
另一个全程语句OPTIONS语句可以规定系统运行的一些选择项,比如输出是否每页有 页号,是否有日期,输出的行宽,输出每一页的高度(行数),等等。其使用例如:
options nonumber nodate linesize=78 pagesize=60;
其中NONUMBER表示输出不显示页号(改用NUMBER则规定显示页号),NODATE表示不在每页显示 运行日期和时间(改用DATE则显示),LINESIZE=78规定输出每行最宽不超过78个字符,PAGESIZE=60 规定输出每页为60行,不足时用空行补齐。
用BY语句分组处理
前面我们已经讲过,在过程步中使用BY语句可以指定分类变量,把观测分类处理。在 使用带有BY语句的过程之前一般用SORT过程对数据集按照分类变量排序。例如:
proc sort data=c9501; by sex; run; proc print data=c9501; by sex; run;
结果为:
----------------------------------- SEX=男 ----------------------------------- OBS NAME MATH CHINESE AVG 1 李明 92 98 86.8333 2 王思明 86 90 80.5000 3 张聪 98 109 94.4167 ----------------------------------- SEX=女 ----------------------------------- OBS NAME MATH CHINESE AVG 4 张红艺 89 106 88.6667 5 刘颍 80 110 85.8333
计算总计和小计
在PRINT过程中可以用SUM语句计算某个变量的总计(总和)。例如,9501班的同学购 买课外书所用的钱数用如下程序输入数据集:
data bkmoney; input name $ amount; cards; 李明 20 张红艺 15 王思明 10 张聪 20 刘颍 50 ; run;
为了列出此数据集并计算全班的总书款,只要在PRINT过程中加上SUM语句,SUM语句中指 定要求和的变量名AMOUNT:
proc print data=bkmoney noobs; sum amount; run;
结果为:
NAME AMOUNT 李明 20 张红艺 15 王思明 10 张聪 20 刘颍 50 ====== 115
可见总额为115元。
SUM语句中也可以指定多个变量名,可以同时对这些变量求和。
用BY语句与SUM语句就可以既计算总和也计算分组小计。比如,我们除了要计算学生 购买课外书总支出外还想分男、女生计算总支出,可以用下面的程序。注意由于数据集BKMONEY 中没有性别的信息,我们用了带MERGE语句的数据步来横向合并C9501和BKMONEY两个数据集。
proc sort data=c9501; by name; proc sort data=bkmoney; by name; data new; merge c9501 bkmoney; by name; run; proc sort data=new; by sex; proc print data=new; by sex; sum amount; run;
程序的结果为:
----------------------------------- SEX=男 ----------------------------------- OBS NAME MATH CHINESE AVG AMOUNT 1 李明 92 98 86.8333 20 2 王思明 86 90 80.5000 10 3 张聪 98 109 94.4167 20 ------ SEX 50 ----------------------------------- SEX=女 ----------------------------------- OBS NAME MATH CHINESE AVG AMOUNT 4 刘颍 80 110 85.8333 50 5 张红艺 89 106 88.6667 15 ------ SEX 65 ====== 115
可见总额为115,男生小计为50,女生小计为65。
用TABULATE过程作统计量表格
PRINT过程可以制作列表,它列出所有观测。当观测个数很多时,这样的列表意义不 大。TABULATE过程制表不是列出观测,而是计算观测的分类统计量,绘制统计量的表格。这 对于数据的汇总比较有用。
TABULATE可以作出很复杂的表,其一般格式为:
PROC TABULATE DATA=数据集名; CLASS 分类变量; VAR 分析变量; TABLE 页维说明,行维说明,列维说明 / 选项; RUN;
其中CLASS语句给出分类变量,用分类变量可以给观测分类,计算统计量时可以对每一类 分别计算。VAR语句给出分析变量,分析变量必须是数值型(区间)变量,要计算的统计量是 对这些变量计算。
在TABLE语句中给出表格绘制规定。我们用例子说明。比如,对C9501NEW数据集,我 们希望表中绘出男、女生的课外书支出总和,可以用如下例子:
proc tabulate data=c9501new; class sex; var amount; table sex, amount; run;
结果为:
------------------------------------ | | AMOUNT | | |------------| | | SUM | |---------------------+------------| |SEX | | |---------------------| | |男 | 50.00| |---------------------+------------| |女 | 65.00| ------------------------------------
可见在TABLE语句中指定一个分类变量可以对表格按此变量的值分格,指定一个分析变量 可以计算其和。因为变量SEX和AMOUNT中间用逗号分隔,所以SEX在行维,表格的行用SEX的值 区分,AMOUNT在列维,它画在列标题中。
如果我们不是要计算总和,而是计算其它统计量,可以用“分析变量名*统计量名” 的形式。统计量名包括N、NMISS、MEAN、STD、MIN、MAX、RANGE、SUM、USS、CSS、STDERR、CV 、T(检验均值为0的t统计量值)、PRT(t统计量的p值)、VAR、SUMWGT(权数变量的和)、PCTN (某类观测占总观测个数的百分比)、PCTSUM(某类观测的总和占全部总和的百分比)。例 如,我们可以用如下程序求男、女生的数学、语文成绩平均值及标准差:
proc tabulate data= c9501new; class sex; var math chinese; table sex, (math chinese)*(mean std); run;
结果为:
----------------------------------------------------------------------- | | MATH | CHINESE | | |-------------------------+-------------------------| | | MEAN | STD | MEAN | STD | |-----------------+------------+------------+------------+------------| |SEX | | | | | |-----------------| | | | | |男 | 92.00| 6.00| 99.00| 9.54| |-----------------+------------+------------+------------+------------| |女 | 84.50| 6.36| 108.00| 2.83| -----------------------------------------------------------------------
我们看到,要并列变量或并列统计量的话只要把各项用空格连接,如MATH CHINESE和MEAN STD。变量和统计量名之间用星号连接。
上面的表格只计算了分类统计量值,如果要计算总的统计量值,只要加一个ALL关键 字。把上面的例子中的TABLE语句改成:
table sex all, (math chinese)*(mean std);
结果为
----------------------------------------------------------------------- | | MATH | CHINESE | | |-------------------------+-------------------------| | | MEAN | STD | MEAN | STD | |-----------------+------------+------------+------------+------------| |SEX | | | | | |-----------------| | | | | |男 | 92.00| 6.00| 99.00| 9.54| |-----------------+------------+------------+------------+------------| |女 | 84.50| 6.36| 108.00| 2.83| |-----------------+------------+------------+------------+------------| |ALL | 89.00| 6.71| 102.60| 8.47| -----------------------------------------------------------------------
事实上,我们可以用星号连接分类变量和分类变量以构成交叉分组,用星号连接分类 变量和分析变量以构成分类计算分析变量的统计量。例如,要考察性别的频数分布,使用统 计量N和PCTN,TABLE语句可以写成
table (sex all)*(N PCTN);
结果如下:
------------------------------------------------------------------------------- | SEX | | |---------------------------------------------------| | | 男 | 女 | ALL | |-------------------------+-------------------------+-------------------------| | N | PCTN | N | PCTN | N | PCTN | |------------+------------+------------+------------+------------+------------| | 3.00| 60.00| 2.00| 40.00| 5.00| 100.00| -------------------------------------------------------------------------------
如果要计算的统计量不是N、PCTN这样的基于计数统计量,则还需要指定用来计算统计量 的分析变量,例如TABLE语句写成
table (sex all)*math*(mean std);
则结果为
------------------------------------------------------------------------------- | SEX | | |---------------------------------------------------| | | 男 | 女 | ALL | |-------------------------+-------------------------+-------------------------| | MATH | MATH | MATH | |-------------------------+-------------------------+-------------------------| | MEAN | STD | MEAN | STD | MEAN | STD | |------------+------------+------------+------------+------------+------------| | 92.00| 6.00| 84.50| 6.36| 89.00| 6.71| -------------------------------------------------------------------------------
在这两个例子中没有行维,只有列维。
可以在TABULATE过程中使用KEYLABEL语句指定各统计量的标签。其格式为
KEYLABEL 关键字='标签';
例如,下例用KEYLABEL指定了MEAN和STD标签,又用LABEL语句指定了变量的标签:
proc tabulate data=c9501new; class sex; var math chinese; table (sex all), (math chinese)*(mean std); keylabel mean='平均值' std='标准差' all='总计'; label sex='性别' math='数学' chinese='语文'; run;
结果为
-------------------------------------------------------------------------- | | 数学 | 语文 | | |-------------------------+-------------------------| | | 平均值 | 标准差 | 平均值 | 标准差 | |--------------------+------------+------------+------------+------------| |性别 | | | | | |--------------------| | | | | |男 | 92.00| 6.00| 99.00| 9.54| |--------------------+------------+------------+------------+------------| |女 | 84.50| 6.36| 108.00| 2.83| |--------------------+------------+------------+------------+------------| |总计 | 89.00| 6.71| 102.60| 8.47| --------------------------------------------------------------------------
我们得到了一个全中文的统计表格。
注意:有时用TABULATE过程作表时表格线是一些乱码,这是SAS系统设置文件CONFIG.SAS 中关于FORMCHAR的设置的问题。调入SAS系统的CONFIG.SAS文件,把其中的所有以“-FORMCHAR ”开始的行都注释掉,只留下如下的行不注释:
-FORMCHAR |----|+|---+=|-/\<>*
就可以解决这个问题。
用SORT过程排序
在SAS过程中用BY语句可以把观测分类进行处理,但在此之前需要先用SORT过程排序 。SORT过程可以把数据集按某一个或若干个变量的次序进行排序。比如,我们要把数据集C9501 的观测(行)按性别排序(分类),可以用此程序:
proc sort data=c9501; by sex; run;
注意这样用DATA=指定的数据集既是输入数据集又是输出数据集。过程的结果在输出窗口 没有显示,只是把数据集按要求进行了排序。
可以按几个变量排序,比如,要按男、女性别排序,并在男生、女生内部按平均分由 高到低排序,可以这样作:
proc sort data=c9501; by sex descending avg; run;
BY语句内在一个变量名前面加上DESCENDING关键字表示此变量的排序是由大到小的。
结果可以用proc print;run;显示出来。
在INSIGHT中我们也可以对数据集排序,请自己复习如何在INSIGHT中对数据集排序( 使用数据窗口菜单的sort功能)。
MEANS过程、UNIVARIATE过程、FREQ过程
这三个过程用来计算简单的数据汇总信息。MEANS和UNIVARIATE过程对区间变量计算 均值、标准差等数字特征,而FREQ过程对离散变量计算取值频数分布。
例如,我们要对C9501中的数学成绩、语文成绩计算简单统计量,只要用如下MEANS过程:
proc means data=c9501; var math chinese; run;
结果为
Variable N Mean Std Dev Minimum Maximum ------------------------------------------------------------------- MATH 5 89.0000000 6.7082039 80.0000000 98.0000000 CHINESE 5 102.6000000 8.4734881 90.0000000 110.0000000 -------------------------------------------------------------------
如果使用UNIVARIATE过程则可以计算较多的统计量,例如我们分析SASUSER.GPA中的 变量GPA,可以用如下程序:
proc univariate data=sasuser.gpa; var gpa; run;
结果为
Univariate Procedure Variable=GPA College Grade Point Average Moments N 224 Sum Wgts 224 Mean 4.635223 Sum 1038.29 Std Dev 0.779395 Variance 0.607456 Skewness -0.6895 Kurtosis 0.364817 USS 4948.169 CSS 135.4628 CV 16.81461 Std Mean 0.052076 T:Mean=0 89.00965 Pr>|T| 0.0001 Num ^= 0 224 Num > 0 224 M(Sign) 112 Pr>=|M| 0.0001 Sgn Rank 12600 Pr>=|S| 0.0001 Quantiles(Def=5) 100% Max 6 99% 6 75% Q3 5.215 95% 5.73 50% Med 4.74 90% 5.61 25% Q1 4.165 10% 3.66 0% Min 2.12 5% 3.11 1% 2.4 Range 3.88 Q3-Q1 1.05 Mode 5.06 Extremes Lowest Obs Highest Obs 2.12( 159) 5.9( 93) 2.39( 75) 6( 48) 2.4( 13) 6( 49) 2.58( 221) 6( 141) 2.65( 87) 6( 188)
它显示的各统计量已在1.3.7中作了介绍。其中T:Mean=0是用来检验变量的平均值是否为0 的t统计量,Pr>|T|是相应的p值。另外,M(Sign)和Sgn Rank也是检验同样的零假设,使 用符号检验和符号秩检验。输出中还包括五个最低值和五个最高值。
FREQ过程可以考察离散变量的取值分布,在TABLES语句中指定要分析的变量。比如, 我们想了解C9501中性别的分布情况,可以用:
proc freq data=c9501; tables sex; run;
结果为
Cumulative Cumulative SEX Frequency Percent Frequency Percent ------------------------------------------------- 男 3 60.0 3 60.0 女 2 40.0 5 100.0
可见FREQ的分析结果包括变量每个值的取值频数(观测个数)、百分比、累积频数、累积 百分比。也可以对区间变量使用FREQ过程列出频数分布,如
tables math;
MEANS、UNIVARIATE、FREQ的结果可以在INSIGHT的“Analyze|Distribution”和“Tables|Frequency Table”得到。
用CORR过程计算相关系数
相关系数可以反映变量两两之间的线性相关。比如,为了计算SASUSER.GPA中的三个 变量HSM、HSS、HSE两两之间的相关系数(普通的Pearson相关系数),只要用如下程序:
proc corr data=sasuser.gpa; var hsm hss hse; run;
结果如下:
Correlation Analysis 3 'VAR' Variables: HSM HSS HSE Simple Statistics Variable N Mean Std Dev Sum HSM 224 8.321429 1.638737 1864.000000 HSS 224 8.089286 1.699663 1812.000000 HSE 224 8.093750 1.507874 1813.000000 Simple Statistics Variable Minimum Maximum Label HSM 2.000000 10.000000 High School Math Average HSS 3.000000 10.000000 High School Science Average HSE 3.000000 10.000000 High School English Average Pearson Correlation Coefficients / Prob > |R| under Ho: Rho=0 / N = 224 HSM HSS HSE HSM 1.00000 0.57569 0.44689 High School Math Average 0.0 0.0001 0.0001 HSS 0.57569 1.00000 0.57937 High School Science Average 0.0001 0.0 0.0001 HSE 0.44689 0.57937 1.00000 High School English Average 0.0001 0.0001 0.0
输出分为两个部分,第一部分是各变量的简单统计量,第二部分是三个变量两两之间的相 关系数矩阵。比如,HSM和HSS之间的相关系数为0.57569,这个相关系数为零的显著性概率值 为0.0001。表格共有三行三列,每个单元有两个数,第一个数是行变量和列变量之间的相关 系数,第二个数是检验这两个变量之间相关系数为0的检验的显著性概率值(p值)。
CORR的结果也在INSIGHT中可以由“Analyze|Multivariate”菜单得到。
用SAS/GRAPH绘图
SAS可以把存贮在SAS数据集中的数据以图形的方式形象直观地显示出来。在SAS/GRAPH 模块的支持下,SAS可以作散点图、曲线图、直方图、扇面图、三维曲面图、等高线图、地图 ,等等。
散点图和曲线图
用GPLOT过程绘制散点图和曲线图。比如,我们要绘制SASUSER.GPA中SATV对SASM的散 点图,只要用此程序:
proc gplot data=sasuser.gpa; symbol i=none v=star; plot satv*satm; run;
结果显示了一个GRAPHICS窗口,绘出了以SATV为纵轴、以SATM为横轴的散点图(见图 1) 。在GPLOT过程中,用PLOT语句指定绘图用的变量。SYMBOL语句是一个全程语句,指定绘图用 的连线方式、颜色、散点符号、大小,等等。SYMBOL语句可以带编号,如SYMBOL2,SYMBOL3 等,不带编号的相当于SYMBOL1。
为了绘制连线,只要在SYMBOL语句中指定I=JOIN。比如,对SASUSER.AIR数据集,以DATETIME 为横轴、以CO为纵轴绘曲线图图,可以用:
proc gplot data=sasuser.air; symbol i=join v=star; plot co*datetime; run;
见图 2。如果不想在图中出现散点符号可以在SYMBOL语句中用V=NONE。
为了在图中作几条曲线,只要在PLOT语句中指定多个因变量(自变量一般应为同一个 ),并使用OVERLAY选项,如:
proc gplot data=sasuser.air; symbol1 i=join v=none line=1 ; symbol2 i=join v=none line=2 ; plot co*datetime=1 so2*datetime=2 / overlay; run;
其中我们指定了两个SYMBOL语句,第一个SYMBOL语句指定了LINE=1,表示线型为实线,第 二个SYMBOL语句指定了LINE=2表示线型为虚线。我们在PLOT语句中用了“纵轴*横轴= n”的格式来指定曲线使用哪一个SYMBOL语句的规定来画, n对应于SYMBOL语句的序号。
SYMBOL语句的I=选项还可以取SPLINE表示在散点间连接连样条曲线,取I=SM nn( nn取00-99值)表示绘制样条曲线但可以不经过散点, nn值代表曲线光滑性与拟和度的折中。取I=NEEDLE绘制每个点到横轴的垂线。取I=RL 绘制线性回归直线,I=RQ为二次曲线,I=RC为三次曲线,后面加上CLI nn如RLCLI95表示在回归直线之外绘制预测值的95%置信限曲线,比如:
proc gplot data=sasuser.gpa; symbol i=rlcli95 v=star; plot satv*satm; run;
见图 3。GPLOT过程还可以有其它灵活的用法,可以参考有关资料或用SAS系统菜单“Help | Extended Help”,从中找“SAS System Help: Main Menu | Graphics | GPLOT”。
直方图和扇形图
用GCHART过程绘制直方图、扇形图、三维直方图等表示变量分布的图形。例如,要绘 制SASUSER.GPA中GPA的分布直方图,只要用:
proc gchart data=sasuser.gpa; vbar gpa; run;
其中绘图用的变量用VBAR语句给出。图形见图 4。如果把VBAR改成HBAR则条形方向变为横 向。用GCHART绘制的直方图和在INSIGHT中绘制的直方图有所不同,它在横轴标的是区间的中 点值,而在INSIGHT中横轴标的是区间的端点值。
可以绘制分组的直方图,例如按性别分组绘制两个直方图并排放置,可以用如下程序:
proc gchart data=sasuser.gpa; vbar gpa / group=sex; run;
结果见图 5。
在GCHART中用PIE语句绘制表示频数的扇形图,例如:
proc gchart data=sasuser.gpa; pie sex; run;
结果见图 6。如果想显示百分比值,只要在PIE语句中加入TYPE=PERCENT选项,如“pie sex / type=percent;”。
GCHART过程还可以用BLOCK语句绘制三维直方图。例如,在SASUSER.HOUSES有各种房 子的情况,其中BEDROOMS表示卧室个数,STYLE表示房子的式样,都是分类变量,我们可以用 如下程序画出反映卧室个数和房子式样的联合分布的三维直方图:
goptions hpos=90 vpos=70; proc gchart data=sasuser.houses; block style / group=bedrooms; run;
三维曲面图和等高线图
假设对一个二元函数z=f(x,y),我们有了x取等间隔值、y取等间隔值时z的值,这时 我们可以用G3D过程绘制曲面图形,用GCONTOUR绘制曲面的等高线图。
例如,我们想绘制一个二维正态分布曲面的图形,假设(X,Y)服从联合正态分布,其均值 都是0,方差分别为1和a,相关系数为r。这时,我们可以得到(X, Y)的联合密度函数的公式 为:
我们可以在一个网格上计算曲面的值:
data dnorm2; a=2; a2=sqrt(a); r=0.5; det=a*(1-r*r); do x=-3 to 3 by 0.3; do y=-3*a2 to 3*a2 by 0.3*a2; z=1/(2*3.1415926*det)*exp(-0.5/det*(a*x*x + y*y - 2*r*a2*x*y)); output; end; end; keep x y z; run;
然后,我们就可以用G3D过程来绘制曲面图:
proc g3d data=dnorm2; plot x*y=z; run;
见图 8。用GCONTOUR过程可以绘制曲面对应的等高线图,例如:
proc gcontour data=dnorm2; plot x*y=z; run;
图形的调整与输出
各绘图过程中都指定了丰富的选项来调整图形,读者可以参考有关资料或查系统的帮 助。另外,在图形中也可以用TITLE语句和FOOTNOTE语句给图形加标题和脚注。 为了在图形的标题、标签中也能使用汉字,老的SAS版本需要比较多的步骤, 但是在Windows下的SAS 8.0以后只要很简单的语句就可以在图形中使用True Type字型的汉字,例如:
goptions ftext="宋体"; proc gplot data=sasuser.class; title "试验FONTS的汉字功能"; plot weight * height; label weight = "体重" height="身高"; run;
为了把SAS/GRAPH绘制的图形保存为兼容的图形文件,只要在显示某一页图形输出时 ,选“File | Export”菜单,在出现的输入文件名的窗口选择适当的文件类型,如BMP、WMF 、JPEG、PS,等等。本讲义中的SAS/GRAPH图形就是从SAS中用“File | Export”输出为WMF 文件调入MS Word的结果。
要打印SAS/GRAPH生成的图形,只要选“File | Print”。这样用Windows的打印驱动 程序与SAS/GRAPH的图形驱动配合来打印。另外,SAS/GRAPH模块还提供了许多种打印机的独 立的驱动程序,可以不依赖于Windows的打印驱动,具体请参考有关资料或帮助。
练习
- (1)列出数据集SASUSER.GPA的内容,要求给各列加上合理的中文列标题,不要观测 序号。(2)只列出SEX、SATV、SATM三个变量,并按性别分类列出,计算SATV和SATM的总和 和按性别小计。
- 用TABULATE过程绘制SASUSER.GPA中GPA按性别分类及不分类的平均值、标准差,及男 女生人数。使用中文标签。
- 对SASUSER.GPA中的GPA用UNIVARIATE过程分析分布并简述结果。叙述性别分布。
- 绘制F分布自由度为(1,30),(2,30),(3,30),(4,30),(5,30),(10,30)的密度曲线 图(画在同一坐标系中)。
转载请注明:数据分析 » SAS过程初步——SAS过程用法及常用语句