FREQ TTEST ANOVA REG CORR CHART 对指定的分类变量进行简单的统计描述 对指定的变量做t检验 对指定的变量做方差分析 对指定的变量做回归分析 对指定的变量做相关分析 绘出低分辨率的统计图 NPAR1WAY 对指定的变量做非参数检验 PROC就是程序(procedure)的缩写,而程序步的名字大都是其功能相对应的单词或词组的缩写。
可见SAS的许多功能就是通过程序步来体现的,可如此多的种类也使我们难以总结出一个程序步的通式来。不过仍可大致给出如下结构:
PROC 过程名 [DATA=数据集名] [选项]; 该过程的专用语句描述; [VAR 变量序列;] [WHERE 条件表达式...;] [BY 变量序列;] Run; 方括号里的语句均可以省略,在这时该过程按最通常的情况来处理,即:
o 处理最新建立的SAS数据集。
o 处理所有的变量(或对一个计算过程来说处理全部数值变量)。 o 一次处理整个数据集而不是某个子集。
我们在第一章中用到的PRINT程序步就是采用的这种默认方式。
但有时我们的要求超出了默认方式所提供的范围,这时就要动用方括号里的秘密武器了。
o DATA参数 指明所需处理的数据集名,请注意在这里它是一个参数而不是语
句。
o VAR语句 如果只想分析某一个或几个特定的变量,则可用VAR语句指定它
们。例如只想显示变量x的列表,则PRINT过程如下:
Proc print ; Var x; Run;
如果想显示x和y两个变量,则将VAR语句改为如下形式即可:
11
var x y;
当然,也可以将VAR语句删除,结果相同。
o Where语句 如果你想处理的不是整个数据集而只是其中符合某种条件的子
集,那么WHERE语句将会非常有用,如上例中我们只想显示大于50的x变量的值,则在PRINT过程中加入where语句如下:
Where x>50;
如果条件变为x、y两个变量的值都要大于50,则where语句改为: where x>50 and y>50;
SAS语言中常用的逻辑表达符号有and(和)、or(或)、xor(异或)、ne(不等)等。
o By语句 如果你需要分组处理数据,例如要按性别分组输出统计结果,你有
两种选择,一是用不同的where语句将同一个程序步反复写几遍;另一种显然更酷的方法就是采用by语句。如上例我们想按不同的y值输出x值,则加入by语句如下:
By y;
使用BY语句要求数据集已经按BY语句中指定的变量排序。如果没有排序,则程序无法正确运行。可以用SORT过程来排序,语法结构如下:
PROC SORT DATA=数据集名; BY 变量名列; RUN;
§3.4 结构化语句简介
每一种结构化语言编写的程序都由顺序、分支、循环三种结构构成, SAS语言也不例外。在这里简要介绍一下分支和循环语句的语法。这些语句均可直接在数据步和程序步中使用,适当地使用它们可以大大简化我们的工作。 3.4.1 分支(条件)语句 【语法格式】 语法格式如下:
12
IF 条件 THEN 程序块;
ELSE
程序块;
可见其语法和FOXBASE语言十分相似,只是前面多了THEN,结尾没有ENDIF,可以将两者相比较来理解。其中程序块如果只有一句,则可直接写出,否则应以DO开头,以END结束。 【应用实例】
例3.1 在产生数据集temp的同时为其增加变量class,当x>50时class=1,否则class=2。 解:程序如下:
data temp; input x y@@; if x>50 then class=1; else class=2; cards; 34 56 78 90 35 67 89 10 23 65 77 45 ; proc print; run; 数据步开始,定义要建立的数据集为WORK库的TEMP 要输入的变量为X和Y,并且采用数据连续读入方式 建立新变量CLASS,如果X>50,则CLASS=1 否则,CLASS=2 数据块开始 数据块 数据块结束 列表输出数据集中的数据,检查有无错误 程序结束,开始运行以上程序 以上程序在书写时采用了缩进格式,使程序的结构更清楚。当然大家可以左对齐写完所有的语句,但这样书写的程序在较长时难以阅读。
为什么可以这样写?在这里有必要解释一下数据步的执行过程,input语句按变量顺序将数据读入内存缓冲区,直至每一个变量都有值相对应。然后数据步继续向下执行,从而其它语句可以修改内存缓冲区,如修改值、增加变量等,在执行到数据步结束后,程序又回到input语句处继续执行,直到数据读完为止。现在再看看这个程序,大家可以理解它了吧! 3.4.2 循环语句 【语法格式】 语法格式如下:
DO 起始条件 TO 终止条件; 程序块;
13
END;
该语句主要用于建立数据集。 【应用实例】
例3.2 在产生数据集temp的同时为其增加变量class,取值依次为1、2。 解:程序如下:
Data temp; do class = 1 to 2; input x y@@; output; end; cards; 34 56 78 90 35 67 89 10 23 65 77 45 ; run; 数据步开始,定义要建立的数据集为WORK库的TEMP 循环开始,循环控制变量为CLASS,取值从1到2 要输入的变量为X和Y,并且采用数据连续读入方式 用OUTPUT语句将循环控制变量写入数据集中 循环结束 数据块开始 数据块 数据块结束 程序结束,开始运行以上程序 注意在数据步中,我们不需要用语句改变循环变量的大小,系统会自动改变。 现在,SAS语言的基本知识算是介绍完了。在理论上,你现在可以坐在计算机前,独立编写程序以做出你的统计作业或者是向SAS公司发射核导弹。但为了使你能尽可能地少走弯路(我指的是做统计作业而不是后者),在以后的各章中我们将重点介绍一些常用的程序步,并且在必要的时候介绍一些较为深入的内容。
第四章 统计图
统计图是统计描述的重要工具,它可以直观的反映出事物间的数量关系。因此,许多统计软件均提供了强大的统计做图功能。SAS的许多程序步,如Univariate过程等,也附有相应的绘图功能,这些我们拟在相关章节中讲述。本章将向大家介绍两个专门用于绘图的程序步――GCHART过程和GPLOT过程。前者用于绘制各种常用的统计图,而后者则用于绘制散点图。
在早期的DOS版本中,SAS只提供低分辨率图形(即用键盘字符模拟输出的图形)。而在WINDOWS时代,美观漂亮也成为了软件最重要的性能指标之一,因此SAS公司推出了高分辨率图形。虽然比起EXCEL等软件来,它的高分辨率图形仍然不那么令人满意,但至少已经跟上了时代的潮流。
14
高分辨率图形在专门的GRAPH视窗中输出,而低分辨率图形在OUTPUT视窗中一同输出。只要将绘图过程名中的字母G去掉,做出的就是低分辨率图形,你可以比较一下两种图形的“天壤之别”。
§4.1 GCHART过程
Gchart过程可以绘制水平/竖直条图(直方图)、立体直方图、饼图和星状图。我们可以用这些图来了解单个变量的分布或者多个变量之间的关系。 4.1.1 语法格式
PROC GCHART [ DATA=<数据集名> [选项] ] ; HBAR <变量名列> / [选项] ; VBAR <变量名列> / [选项]; BLOCK <变量名列> / [选项]; PIE <变量名列> / [选项]; STAR <变量名列> / [选项]; AXISn [选项]; BY <变量名列>;
指定要分析的数据集名及一些选项 绘出条形图 绘出水平条形图 绘出三维直方图 绘出饼图 绘出星状图
控制坐标轴的形状和颜色
按该变量取值分层绘制,要求数据集已按该变量排序
方括号中的为可选项,如果不写,系统会以默认值代替或者忽略该功能;而尖括号中的为必选项,表示如果写了该语句,则必须提供尖括号中的信息,否则可能出错。如[ DATA= <数据集名> ],表示你可以不写这一项,此时系统默认处理的是最新建立的数据集;而如果写了DATA=这一项,你就必须指定一个数据集名,不然SAS跟你没完。 4.1.2 语法说明
事实上,绘图程序步中的选项极为繁杂,如果合理地使用这些选项可以做出非常漂亮的统计图来。但这些选项也给大家的学习带来很大的不便,因此在这里我们只简要介绍几个常用的绘图语句中的选项。 【绘图语句选项】
? ? ? ? ? ?
MISSING 指定绘图时要将变量的缺失值也包括在内。
TYPE=做图类型关键字 指定要做图的类型,即图中条块代表的含义:缺省值是频数(FREQ);如果指定了选择项SUMVAR,则缺省值为总和(SUM)。可选的关键字有: FREQ 要求按指定变量的频数做图。
PERCENT 要求按在横轴刻度表示范围内出现的频数占总数的百分比做图。 CFREQ 按累计频数做图。
CPERCENT 按累计百分比做图。
15