1.1 SAS软件简介
1.1.1 SAS软件结构
SAS软件采取模块式结构,每个模块可称为一个SAS产品。有些SAS产品中仅有具体的SAS过程(即编译后的SAS程序),如SAS/STAT;有些SAS产品中不仅有SAS过程,还有其他内容,如SAS语言、SAS窗口、SAS宏、SAS SQL等,见SAS/BASE;有些SAS产品本身就是一个功能比较齐全的软件,可以完成一系列相关的功能,如SAS/ASSIST模块、SAS/ANALYST模块和SAS/INSIGHT模块等;还有些SAS产品是其他SAS产品的开发工具,如SAS/AF等。
1.1.2 SAS界面简介
不同版本的SAS软件,其界面不尽相同。比较新的SAS软件(SAS 9.2)的主界面如图1-1所示。
图1-1 进入SAS9.2后的主界面
由图1-1可知,在SAS 9.2主界面上,顶部有两行,分别为“菜单栏”和“工具栏”,左边有一个“SAS资源管理器”窗口,与它重叠的一个窗口叫“结果”窗口;右边有两个窗口,上方的窗口叫“日志”窗口,下方的窗口叫“程序编辑器”窗口,通过顶部菜单栏中的“窗口”选项,可以切换到其他窗口,如“输出”窗口。
可以说,基本的SAS窗口有“SAS资源管理器”、“结果”、“程序编辑”、“日志”和“输出”窗口,但另外还有30多个窗口可供用户处理打印和微调SAS会话之类的操作。这些窗口的名称和窗口命令的详细列表从略。若用户想获得此列表,可通过下面的方法实现:首先选中主界面第2行工具栏最后一个选项(图标为一本书),即帮助(help);然后,按照“帮助(help)→SAS产品→Base SAS→SAS窗口引用→SAS窗口索引”的步骤显示全部SAS窗口列表。
1.1.3 SAS过程与SAS程序
SAS过程是SAS软件中经过编译后的程序,这些程序解决问题所依赖的理论和方法是被公认的,因此,可以做到标准化、程序化和系统化。然而,用户要解决的问题却是千变万化的,用户的数据是什么,存放在何处,都是事先无法预知的。用户在调用某个具体的SAS过程之前,必须将上述信息传递给SAS系统。这些信息必须依据SAS语言规则来组织,它们称为SAS引导程序,简称为SAS程序。
1.1.4 运行SAS软件的两种常用方式
在SAS系统中运行SAS软件通常有两种方式:
(1)非编程法(或称为菜单驱动法),即用户不需要编写SAS程序就可以直接调用SAS过程实现希望达到的目的。事实上,当用户通过菜单驱动系统选择某些项时,SAS系统内部就在进行自动编程(即自动产生SAS程序),等用户的选择工作结束时,SAS程序也就全部被产生出来,故也实现了用户的目的。但并非所有的任务都能通过此法来实现。
(2)编程法,即用户亲自在程序编辑窗口写SAS程序(或直接调用别人事先写好的SAS程序)并提交给SAS系统执行。提交SAS程序的方法是单击图1-1中工具栏的倒数第4个图标(一个小人图像)按钮。
用非编程法运行SAS的方法见本书配套光盘,此处从略。本章仅介绍如何用编程法运行SAS软件。
1.1.5 SAS程序结构
SAS程序通常由两部分组成:一部分用于提供待分析的数据,称为SAS数据步;另一部分调用SAS系统中已编译过的能处理某个具体问题的真正程序,称为SAS过程步。一段SAS程序可以有多个SAS数据步和多个SAS过程步,有时,也可以仅有其中的一种。若仅有SAS数据步,就需要利用SAS语言编写程序,以达到某个特定的研究目的;若仅有SAS过程步,必须事先提供可供调用的数据(称为SAS数据集)。先通过下面的一个简单实例,来直观了解这些抽象的概念。
【例1-1】从两个同类和规模相近的大工厂里随机地各抽取254个相同规格的零件,其中甲厂出现的次品数为5个;乙厂出现的次品数为10个。请问:甲、乙两工厂生产的这种零件的次品率之间的差别是否具有统计学意义?
【分析与解答】这是两样本率比较问题,更确切地说,是关于两个总体率是否相等的假设检验问题,通常称为四格表资料的统计分析。可通过在SAS编程窗口中输入下面的SAS程序来实现,设程序名为SASTJFX1_1.SAS。
DATA rate; DO a=1 TO 2; DO b=1 TO 2; INPUT f @@; OUTPUT; END; END; CARDS; 5 249 10 244 ; RUN; ODS HTML; PROC FREQ DATA=rate; WEIGHT f; TABLES a*b / CHISQ; RUN; ODS HTML CLOSE;
程序说明与修改指导:
(1)SAS数据步。从“DATA rate;”语句开始到第1个“RUN;”语句结束的这一段SAS程序称为SAS数据步,其功能是创建SAS数据集,即为SAS系统提供待分析的数据所需要的SAS程序,包括与数据有直接联系的变量名。这里,变量a代表工厂类别,即代表两行的总名称,a=1代表第一行上的甲工厂,a=2代表第2行上的乙工厂;变量b代表产品检查结果,即代表两列的总名称,b=1代表次品,b=2代表合格品;f代表与特定工厂及特定检查结果对应的产品数,即四格表资料中每个格子上的频数,如249代表来自甲工厂的合格品。
(2)SAS过程步。介于“ODS HTML;”与“ODS HTML CLOSE;”两语句(其作用是使SAS输出结果以网页格式呈现)之间的语句段称为过程步,即从“PROC FREQ DATA=rate;”到最后的“RUN;”语句的这段SAS程序称为SAS过程步,其功能是调用SAS软件中能达到用户要求的真正程序(即FREQ过程)并产生相应的输出结果。
1.1.6 简单SAS程序中的SAS语句简介
全部SAS语句内容十分丰富,因篇幅所限,详见本书配套光盘。这里仅介绍SAS程序SASTJFX1_1.SAS中所涉及的几个SAS语句的大致含义。
每个SAS语句以分号(注意:必须是英文状态下的分号)结束,一行上可写多个SAS语句;不区分字母的大小写。上节这段SAS程序的数据步涉及8种SAS语句,现扼要介绍如下。
(1)DATA语句,创建一个名为rate的临时SAS数据集(一旦退出SAS系统,它就消失了)。
(2)DO语句,循环体的起始语句。
DO语句与END语句成对出现,构成一个循环体。在上节SAS程序中,第1个DO语句与第2个END语句构成一个外循环,第2个DO语句与第1个END语句构成一个内循环。循环体的功能是创建标志性变量,同时使循环体内部的语句被重复执行规定的次数。
两个DO语句中的a和b称为循环变量,DO语句中TO前面的数称为循环变量将取的最小值(或起始值),TO后面的数称为循环变量将取的最大值(或终止值)。因这段SAS程序中的外循环变量执行两次,内循环变量先后各执行两次,故对循环体内的两个语句而言,总共被执行了4次。
(3)INPUT语句,创建一个名为f的变量,通过它去读取CARDS语句和空语句(即独占一行的分号)之间的数据,该语句中的“@@”为指针控制符,当INPUT语句中变量的个数少于一行上数据个数时,必须加上这两个符号,以确保完整地读入全部数据。
若INPUT语句中包含字符型变量,例如,若数据中性别变量SEX的具体取值为SEX=MALE代表男性、SEX=FEMALE代表女性,则在INPUT语句中,变量SEX应写成“SEX $”。若数据中第1列为人的姓名,其中最长的姓名占18个字符,不仅要将NAME写成“NAME $”,还应在INPUT语句前加一个定义字符型变量长度的语句,即“LENGTH NAME $ 18.;”
(4)OUTPUT语句,即输出语句,将INPUT语句变量f读取的每一数值送到循环体外面去(即放入计算机缓冲区中),以免后读取的数据将先读取的数据覆盖掉。
(5)END语句,循环体结束语句。
(6)CARDS语句,标志着其后为数据。
(7)空语句,以一个“;”独占一行的语句称为空语句,标志着数据行的结束。千万不要将这个分号与最后一个数据写在同一行上。
(8)RUN语句,SAS数据步中的该语句标志着SAS数据步的结束。此语句可以不写,但写上显得完整。
上节这段SAS程序的过程步涉及4种SAS语句,现扼要介绍如下。
(1)PROC语句,它是SAS过程步开始的标志,其后跟随着一个具体的SAS过程名,本例中为FREQ,它是用于分析定性资料的一个SAS过程,其后写“DATA=rate”,它是一个选择项,意味着待分析的SAS数据集名为rate。若在此之前,程序中只有一个数据集,可以不加此选择项。
(2)WEIGHT语句,指明SAS数据集中哪个变量代表列联表资料中各格上的频数,本例为变量f。
(3)TABLES语句,指明SAS数据集中哪个定性变量为行变量(本例为a)、哪个为列变量(本例为b),“/”代表其后为选择项,CHISQ选项要求FREQ过程对SAS数据集中的数据进行χ2检验。
(4)RUN语句,SAS过程步中的该语句标志着SAS过程步的结束,此语句不可省略。
初学者只需将自己的四格表资料中的4个数正确地替换掉此段程序中的4个数,将SAS程序提交给SAS系统执行(单击SAS窗口上方第2行工具栏中倒数第4个图标按钮)即可。
何为正确替换?就本例而言,来自一个工厂的两个数据必须写在同一行(或列)上,而同一种检查结果必须写在同一列(或行)上。还应注意:检查结果必须按“次品与合格品”频数来表达,不能是“次品数与被检查总数”。
1.1.7 SAS语言简介
1.SAS语言概述
在编写像SASTJFX1_1.SAS那样的SAS程序时,所涉及的全部内容可概括为SAS语言。以笔者之见,SAS语言由基本SAS语言(如SAS文件、基本SAS语句、常用SAS函数、SAS数组和SAS过程等)和高级SAS语言(如宏、SAS SQL、SAS ODS、SAS/IML等)两部分组成。这些内容十分丰富,需要用大量篇幅才能对它们做一粗略的介绍,请读者参见本书配套光盘。详细内容请查阅SAS说明书或从SAS软件的帮助窗口中查询,下同,不再赘述。
2.SAS函数概述
SAS中提供的常用SAS函数近500个,如求−12.3的绝对值,其对应的SAS语句为:“Y=ABS(−12.3);”,也可这样写:“X= −12.3; Y=ABS(X);”;再比如,求49的平方根,其对应的SAS语句为:“Y=SQRT(49);”,也可这样写:“X=49; Y=SQRT(X);”。有些函数使用起来就没有这么简单了,因为那些函数中可能带有多个参数,需要搞清楚这些参数的含义,才能正确调用那些函数,获得用户需要的结果。
3.SAS过程概述
SAS软件中有30多个模块,每个模块中一般都有几十个SAS过程。这些SAS过程都能完成些什么任务,如何正确调用这些SAS过程,也不是轻而易举能交代清楚的。像SASTJFX1_1.SAS中所调用的SAS过程名为“FREQ”,总共写了4个SAS语句就能完成。其实,仅这一个SAS过程的全部语句和选择项所涉及的内容就相当多,不花上大约一周时间,可能无法全部掌握它。
1.1.8 SAS数据集简介
1.SAS数据集的概念
无论采用非编程法还是编程法运行SAS,首先都必须创建SAS数据集。直接在SAS编辑窗口录入原始数据,将其存储在某个外部设备上,只能称其为一个外部数据文件,不能称其为SAS数据集。何为SAS数据集呢?数据只有经过SAS系统加工后并按特定方式存储才能被称为SAS数据集,它将变量名及其取值(即具体数据)有机地结合在一起。
2.SAS数据集的种类
SAS数据集分为两类:一类称为临时SAS数据集(如程序SASTJFX1_1.SAS中的数据集rate),它被存储在SAS/WORK库(即文件夹)中,一旦退出SAS系统,它就消失了;另一类称为永久SAS数据集,即使退出SAS系统,它仍被保留。这种数据集必须被保存在非SAS/WORK库中,可以是SAS系统默认的某个库,也可以是用户自己创建的某个库(即文件夹)。
3.创建SAS数据集的方法
创建临时SAS数据集很简单,只需要像程序SASTJFX1_1.SAS那样去做就可以了。下面介绍一种创建永久SAS数据集的方法。假定在D盘上有一个文件夹名为SASTJFX,试将程序SASTJFX1_1.SAS中的数据步改造成能创建永久SAS数据集,并将永久数据集存储在D盘SASTJFX文件夹中。所需要的SAS数据步如下,设程序名为SASTJFX1_2.SAS。
LIBNAME table 'D:\SASTJFX'; DATA table.rate; DO a=1 TO 2; DO b=1 TO 2; INPUT f @@; OUTPUT; END; END; CARDS; 5 249 10 244 ; RUN;
程序说明:LIBNAME语句是创建文件关联名的重要语句,其后引号中的内容为路径(包括盘符和文件夹名),table是用户自己取的关联名(一般不要超过8个字符),它就代表其后所写的路径。在DATA语句中,写“table.rate”,就意味着要创建一个名为rate的永久SAS数据集,它被存储在D盘SASTJFX文件夹中,存储后的实际数据集名为:rate.sas7bdat。
4.SAS数据集名的种类
通常,SAS数据集名有两类:一类称为“一词名”,另一类称为“两词名”。如上所述,临时SAS数据集为一词名(如rate),而永久SAS数据集为两词名(如table.rate)。
在“一词名”中又可细分为以下三种:
(1)用户自己取的一个词(如rate)。
(2)直接将DATA语句写成“DATA;”的形式,用户未给数据集取名,SAS系统会自动给数据集取名,当执行一次SAS数据步后,系统将所创建的SAS数据集取名为DATA1,再运行一次,取名为DATA2……
(3)使用SAS系统保留的特殊数据集名,如_DATA_、_NULL_和_LAST_。写成“DATA _DATA_;”与写成“DATA;”是等价的,将给各次创建的数据集依次命名为DATA1,DATA2,…;若写成“DATA _NULL_;”则表明SAS系统将执行数据步,可用“PUT”等SAS语句输出中间结果,但观测值并不被写入SAS数据集_NULL_,这样可以节省计算机资源;用“DATA _LAST_;”时,表明在此之前(指此次进入SAS系统以来),无论创建了多少个SAS数据集,只调用最后被创建的那个SAS数据集。
1.1.9 如何利用SAS帮助窗口
与SAS语言、SAS过程和SAS用法对应的内容非常丰富,难以记全那么多内容。怎么办?只要用户知道一些基本的线索,就可以通过SAS软件提供的丰富帮助功能来查询。通过单击SAS主界面上菜单栏的“帮助”菜单或工具栏的倒数第4个图标按钮,就可进入SAS帮助窗口,也可在SAS主界面左边的命令盒内发送命令,如HELP FREQ,回车后,就可直接查询有关SAS中FREQ过程的全部信息。