|
SAS Book
SAS初阶
§1.1 初识SAS
启动
用如下方法可以进入SAS系统的显示管理界面运行环境:
在Win95或NT环境中,从开始菜单的程序文件夹中找到SAS系统文件夹,从中启动SA
S系统。或者生成SAS.EXE的快捷方式(把SAS.EXE用鼠标右键拖到桌面),双击SAS.EXE启动
。
在Windows 3.xx环境中找到SAS系统程序组中的SAS图标双击启动。
SAS AWS(SAS应用工作空间)
图 1 SAS AWS
启动后,出现如图 1的SAS运行界面,术语称为"SAS工作空间(SAS Application WorkSpac
e)"。它象其它Windows应用程序一样,在一个主窗口内,包含若干个子窗口,并有菜单条
、工具栏、状态栏等。
SAS有三个最重要的子窗口:程序窗口(PROGRAM EDITOR)、运行记录窗口(LOG)、输出窗
口(OUTPUT)。
程序窗口的使用类似于Windows中的记事本程序,可以在其中编辑文本文件,主要是编辑SA
S程序。程序可以之间在窗口中键入,插入新行用回车,插入点光标(闪动的竖线)可以用
光标键(上下左右箭头、Home、End)移动或用鼠标单击到某一处。按住Shift再按光标键可
以加亮显示一块文
本,然后用复制、剪切、粘贴命令(Edit菜单中的Cut、Copy、Paste,或工具栏图标)可以
复制或移动加亮显示的文本。这些编辑操作具体请参考Windows的有关文档。
运行记录窗口记录程序的运行情况,运行是成功还是出错,运行所用时间,如果出错,错在
什么地方。运行记录窗口中以红色显示的是错误信息。
输出窗口显示SAS程序的文本型输出(图形输出单独有一个GRAPHICS窗口)。输出分页显示
。
要把光标移动到某一窗口,可以用主菜单中的Window菜单选择要显示的窗口。用功能键F5可
以切换到程序窗口,F6可以到运行记录窗口,F7可以到输出窗口。
SAS主窗口标题栏下是主菜单。SAS菜单是动态的,其内容随上下文而不同,即光标在不同窗
口其菜单也不同。其中,File(文件)菜单主要是有关SAS文件调入、保存及打印的功能。E
dit(编辑)菜单用于窗口的编辑(如清空、复制、剪切、粘贴、查找、替换)。Locals(
局部)菜单与当
前正在进行的操作有关,如果你正在程序窗口中编辑程序,则Locals菜单有提交运行、调回
修改等项,如果在运行记录窗口或输出窗口则Locals菜单项根本不出现。Globals菜单内容
比较复杂,它可以打开被关闭的程序窗口、运行记录窗口、输出窗口、图形窗口,可以进入
SAS提供的各个独
立模块。主菜单下是一个命令条和工具栏菜单。命令条主要是用于与SAS较早版本的兼容性
,可以在这里键入SAS的显示管理命令。工具栏图标提供了常见任务的快捷方式,比如保存
、打印、帮助等等。鼠标光标在某一工具栏图标上停留几秒可以显示一个说明。工具栏图标
的解释如下:
Submit - 提交编辑窗口中的程序
New - 清空编辑窗口
Open - 打开文件到编辑窗口。用户指定一个文件调入到编辑窗口内。这个文件从此与编
辑窗口相关联,以后的存盘操作将自动存入这个文件。
Save - 存盘,保存编辑窗口内容,注意如果此窗口已经与一个文件相联系的话此功能将
覆盖文件的原有内容而不提示。
Print - 打印当前窗口内容
Print preview -打印预览。
Cut - 剪切选定文本。
Copy - 复制选定文本。
Paste - 粘贴。注意这些操作是对Windows剪贴板进行的,可以用来与其它Windows应用
程序交换文本、数据等。剪切或复制到剪贴板的内容可以被其它应用程序粘贴,其它应用程
序放到剪贴板的内容也可以粘贴到SAS的编辑窗口中。
Undo - 撤销刚才的编辑操作。
DOS prompt - 临时进入DOS。
Browse - 打开WWW浏览器并进入SAS公司的主页www.sas.com。
Directories - 进入Directory(目录)窗口,可以浏览各SAS目录的内容,可以浏览目
录中的数据集、SAS目录的内容。
SAS/ASSIST - 启动SAS的菜单驱动界面SAS/ASSIST。
Help - 启动Windows的帮助系统进入SAS的帮助。
简单运行样例
假设我们有一个班学生的数学成绩和语文成绩,数学满分为100,语文满分为120,希望计算
学生的平均分数(按百分制)并按此排名,可以在程序窗口输入此程序:
title '95级1班学生成绩排名';
data c9501;
input name $ 1-10 sex $ math chinese;
avg = math*0.5 + chinese/120*100*0.5;
cards;
李明 男 92 98
张红艺 女 89 106
王思明 男 86 90
张聪 男 98 109
刘颍 女 80 110
;
run;
proc print;run;
proc sort data=c9501;
by descending avg;
run;
proc print;run;
实际上,输入这样包含中文的程序最好办法不是在SAS程序窗口直接输入,因为SAS目前对中
文输入的处理还不够完善,好的办法是打开一个其它的编辑程序如Windows中的记事本(在W
in95中用开始菜单中的"程序 | 附件 |
记事本"启动),在记事本中复制输入的程序,然后到SAS系统程序窗口中使用粘贴命令(用
Edit菜单的Paste或工具栏上的粘贴图标),把程序复制到SAS中。也可以在记事本中把编好
的程序存盘,然后在SAS程序窗口用File菜单的Open命令打开保存好的程序文件。
要运行此程序,只要用鼠标单击工具栏的提交图标 ,或用Locals菜单的Submit命
令。运行后,运行记录窗口出现如下内容:
50 title '95级1班学生成绩排名';
51 data c9501;
52 input name $ 1-10 sex $ math chinese;
53 avg = math*0.5 + chinese/120*100*0.5;
54 cards;
NOTE: The data set WORK.C9501 has 5 observations and 5 variables.
NOTE: The DATA statement used 0.11 seconds.
60 ;
61 run;
62 proc print;run;
NOTE: The PROCEDURE PRINT used 0.0 seconds.
63 proc sort data=c9501;
64 by descending avg;
65 run;
NOTE: The data set WORK.C9501 has 5 observations and 5 variables.
NOTE: The PROCEDURE SORT used 0.05 seconds.
66 proc print;run;
NOTE: The PROCEDURE PRINT used 0.0 seconds.
其中记录了每段程序的运行情况、所用时间、生成数据保存情况。如果有错误还会用红色指
示错误。比如,最后的proc print后面的分号如果丢失,记录窗口显示如下错误:
67 proc printrun;
--------
181
ERROR 181-322: Procedure name misspelled.
错误说明为过程名错拼,但实际上是丢了分号导致print和run连成了一个词。正确运行后输
出窗口出现如下结果:
95级1班学生成绩排名 3
OBS NAME SEX MATH CHINESE AVG
1 李明 男 92 98 86.8333
2 张红艺 女 89 106 88.6667
3 王思明 男 86 90 80.5000
4 张聪 男 98 109 94.4167
5 刘颍 女 80 110 85.8333
95级1班学生成绩排名 4
OBS NAME SEX MATH CHINESE AVG
1 张聪 男 98 109 94.4167
2 张红艺 女 89 106 88.6667
3 李明 男 92 98 86.8333
4 刘颍 女 80 110 85.8333
5 王思明 男 86 90 80.5000
这里有两页输出,第一页是输入数据后用PROC PRINT显示的数据集,第二页为按平均分排名
后的结果。
从上面的例子程序可以看出SAS程序的一些特点。SAS程序由语句组成,语句用分号结束。SA
S程序中大小写一般不区分(字符串中要区分大小写)。SAS程序中的空格、空行一般可以任
意放置,这样我们可以安排适当的缩进格式使得源程序结构清楚易读。SAS程序由两种"步"
构成,一种叫数
据步(data step),一种叫过程步(proc step),分别以DATA语句和PROC语句开始。数据
步和过程步由若干个语句组成,一般以RUN语句结束。
SAS基本概念
本节介绍一些SAS特有的概念,其中最重要的是数据集。
SAS数据集。
SAS数据集(SAS
Datasets)由若干行和若干列组成,类似于一个矩阵,但各列可以取不同的类型值,比如整
数值、浮点值、时间值、字符串、货币值等等。SAS数据集存放在以特殊格式存放的二进制
文件中,我们用一个SAS中的逻辑名来使用SAS数据集而不需关心它到底如何存储在磁盘上。
比如,0的例子生
成了一个名为C9501的数据集,它的逻辑形式如下表:
NAME SEX MATH CHINESE AVG
李明 男 92 98 86.8333
张红艺 女 89 106 88.6667
王思明 男 86 90 80.5000
张聪 男 98 109 94.4167
刘颍 女 80 110 85.8333
数据集的每一行叫做一个观测(Observation),每列叫做一个变量(Variable)。SAS数据
集等价于关系数据库系统中的一个表,实际上一个SAS数据集有时也称作一张表。在数据库
术语中一个观测称作一个记录,一个变量称作一个域。在C9501数据集中有5个观测,分别代
表5个学生的情况
,而每个学生有5个数据,分别为姓名、性别、数学成绩、语文成绩、平均分,所以此数据
集有5个变量。
从上面看出,数据集要有名字,变量要有名字,所以SAS中对名字(数据集名、变量名、数
据库名,等等)有约定:SAS名字由英文字母、数字、下划线组成,第一个字符必须是字母
或下划线,名字最多用8个字符,大写字母和小写字母不区分。比如,name,abc,aBC,x1
,year12,_NULL_
等是合法的名字,且abc和aBC是同一个名字,而class-1(不能有减号)、a bit(不能有空
格)、serial#(不能有特殊字符)、Documents(超长)等不是合法的名字。
SAS数据库
SAS数据集是各种特殊格式的SAS文件中最重要的一种。另一种重要的SAS文件是SAS目录(Ca
talog),用来保存各种不能表示成行列结构表格形式的数据,比如系统设置、图象、声音
等。多个SAS文件可以放在一起,称为一个SAS数据库(Library)。数据库有一个库名(Lib
name),其命名
遵循上述SAS名字命名原则。在MS
DOS/Windows环境中,一个SAS数据库实际是磁盘上的一个子目录(特殊情况下一个数据库可
以由几个子目录组成)。为了把库名和子目录联系起来,使用LIBNAME语句。比如,我们在C
:\Y1995子目录中保存了几个SAS数据集,可以用如下语句把库名MYLIB与子目录C:\Y1995联
系起来:
libname mylib "c:\y1995";
有三个预定义的SAS数据库:WORK、SASUSER、SASHELP。其中,WORK数据库叫做临时库,存
放在其中的SAS文件叫临时文件,这些临时文件当退出SAS系统时会被自动删除。SASUSER库
保存与用户个人设置有关的文件,它是永久的,即退出SAS时文件不会被删除。SASHELP库保
存用SAS帮助系统
、例子有关的文件,是永久的。
从上面看出,SAS文件分为临时文件和永久文件:临时文件在退出SAS系统时自动被删除,永
久文件在退出SAS系统时不自动被删除。所以,我们把作为中间结果使用的数据集或练习用
的数据集作为临时数据集保存,而需要以后再用的数据集则可以保存为永久数据集。临时数
据集和永久数据
集的区别是:临时数据集可以用单水平名,即只有数据集名,比如C9501,而永久数据集名
由两部分组成,前一部分是它的库名,后一部分才是数据集名,两部分中间用小数点连接,
比如放在MYLIB库(即"C:\Y1995"子目录)中的数据集TEACH必须用MYLIB.TEACH表示。这样
指定的数据集名在
生成时可以放到由库名指定的子目录中,在读取时可以到指定的子目录读取,并且不会被自
动删除。
临时数据集除用单水平名外 ,也可以用库名为WORK的两水平名,如WORK.C9501和C
9501是一样的。
要生成永久数据集,只要在指定要生成的数据集名时使用两水平名且库名已有定义
,比如,要把上面的C9501数据集在生成时就放到"C:\Y1995"子目录中,可以用如下语句:
libname mylib "c:\y1995";
data mylib.c9501;
……
proc sort data=mylib.c9501;
……
图 2 Libraries窗口
这个程序和0的例子相比只是增加了一个定义库名的LIBNAME语句,然后在所有用到数据集名
C9501的地方换成了两水平名MYLIB.C9501。要注意生成的数据集是MYLIB.C9501后面在用到
它的时候(在PROC
SORT中)也必须使用两水平名MYLIB.C9501而不能使用单水平名C9501,这两个名字指向的不
是同一个SAS文件。
为了显示现有定义的数据库,只要单击工具栏的 图标,如图 2。
不需编程的SAS应用――SAS/INSIGHT
图 3 打开数据集
SAS的使用方法一般是象0那样输入一个程序,运行,修改,最后在输出窗口得到结果。随着
图形界面、用户友好等程序思想的发展,SAS也逐渐提供了一些不需要学习SAS编程就能进行
数据管理、分析、报表、绘图功能,其中做得比较出色的一个是SAS/INSIGHT模块。SAS/INS
IGHT是在基本的
SAS系统基础上添加的一个模块,提供了数据交互输入、数据探索、研究分布、相关分析、
各种图形等功能。这里我们简单介绍SAS/INSIGHT的简单使用。
图 4 SAS/INSIGHT
要启动SAS/INSIGHT,选Globals | Analyze | Interactive data analysis菜单,
首先出现图 3那样的选择数据集的窗口,这是SAS/INSIGHT必须先选择一个要分析、观察的
数据集。如果要生成新数据集,按New按钮,如果要打开已有数据集,按Open按钮。图
4是SAS/INSIGHT运行时的样子。
数据窗口
图 5 SAS/INSIGHT数据窗口
图 6 数据窗口菜单
图 7 修改变量名和属性
SAS/INSIGHT提供了一个类似于电子表格的数据窗口来管理数据集。图 5为显示了数据集SAS
USER.CLASS的数据窗口,我们看到,其标题行显示了打开的数据集的名字,标题行下左上角
有一个小的向右三角,这是数据窗口的菜单,见图
6。三角下方的19是观测行数,右方的5是变量个数。窗口内每行最左边的方块是观测的绘图
标记,用于在图形中标记标量;然后是观测序号;再往右是各变量的值。数据窗口中的各变
量用作列标题,如图
5中的NAME、SEX、AGE、HEIGHT、WEIGHT就是数据集SASUSER.CLASS中的五个变量的名字。在
每一个变量名的上面有两个标签,右边一个代表变量的量测水平,分为区间变量(Int)和
名义变量(Nom)。区间变量是取连续值的变量,只能为数值;名义变量是取离散值的变量
,一般为字符型,
也可以取数值。变量名上面左边的标签代表变量在分析中的缺省用途,比如NAME上面的Labe
l表示此变量的值(学生姓名)在绘图中用来标记观测,SEX上面的Group表示此变量(性别
)用来分组,等等。
数据窗口可以用来建立新数据集。在SAS/INSIGHT内用"File | New"菜单或在启动INSIGHT的
窗口(图
3)按"New"按钮。这时出现一个空的数据窗口。这时,可以直接向第一行输入数据,比如要
输入0中的C9501数据集,就可以在第一行的前四列中分别输入李明、男、92、98,这时各列
自动取变量名为A、B、C、D,而且量测水平自动定为前两个字符型是名义变量(Nom),后
两个数值型是区
间变量(Int)。为了修改变量名和变量的用途,从数据窗口的菜单(图 6)选Define Vari
ables,出现图 7的定义变量窗口,在这里可以修改变量名,可以选择变量的量测水平,可
以规定变量的用途。
图 8 保存数据集
定好变量名等属性后就可以继续输入数据,直至把全部数据输完。为了保存输入的数据集,
选"File | Save | Data"菜单,出现图
8那样的输入数据集的窗口,可以选择数据集放在哪一个数据库,可以输入一个数据集名,
把这里的A改成c9501,按OK钮就可以保存数据集。对于比较小的数据集(几个、十几个变量
,几十个观测),用SAS/INSIGHT的数据窗口可以迅速而直观地输入。对于更大量的数据,
一般从其它格式转
换而得。
在数据窗口中如果需要修改某一个值,只要直接用鼠标点到其单元格修改,然后把输入光标
离开其所在行就实现了修改。在单元格之间移动可以用鼠标单击、制表键、回车、上下光标
键等方法。要保存所作的修改还需要用"File | Save | Data"菜单。
当数据窗口中变量较多时,可以用滚动条滚动窗口内容来查看。如果某个变量比较重要,可
以考虑把它放到第一列的位置,这只要先单击该变量的名字选中它,然后在图 6的菜单中选
Move to First。要把某列移到最后,选中它后用Move to Last菜单。
选中一列只要单击其变量名。如果要选中多个列,在选中一个后按住Ctrl键单击其它的名字
可以添加选中其它变量。选中一个变量后按住Shift单击另一个变量名可以选中这两个变量
及它们之间的所有变量。选中的多个列也可以用Move to First和Move to Last移动。
要选中一个观测(行),只要单击其观测号(行号)。选多个观测可以用Ctrl单击或Shift
单击的方法。选中的观测也可以用Move to First和Move to Last移动到最前或最后。
要取消所有选中,只要单击某一单元格而不是行、列标题即可。
-- |
|
第1章 SAS初阶
§1.1 初识SAS
1.1.1 启动
用如下方法可以进入SAS系统的窗口运行环境:
在Win95或NT环境中,从开始菜单的程序文件夹中找到SAS系统文件夹,从中启动SA
S系统。或者生成SAS.EXE的快捷方式(把SAS.EXE用鼠标右键拖到桌面),双击SAS.EXE启动
。
在Windows 3.xx环境中找到SAS系统程序组中的SAS图标双击启动。
1.1.2 SAS AWS(SAS应用工作空间)
图 1 SAS AWS
启动后,出现如图 1的SAS运行界面,术语称为"SAS工作空间(SAS Application WorkSpac
e)"。它象其它Windows应用程序一样,在一个主窗口内,包含若干个子窗口,并有菜单条
、工具栏、状态栏等。
SAS有三个最重要的子窗口:程序窗口(PROGRAM EDITOR)、运行记录窗口(LOG)、输出窗
口(OUTPUT)。
程序窗口的使用类似于Windows中的记事本程序,可以在其中编辑文本文件,主要是编辑SA
S程序。程序可以直接在窗口中键入,插入新行用回车,插入点光标(闪动的竖线)可以用
光标键(上下左右箭头、Home、End)移动或用鼠标单击到某一处。按住Shift再按光标键可
以加亮显示一块文
本,然后用复制、剪切、粘贴命令(Edit菜单中的Cut、Copy、Paste,或工具栏图标)可以
复制或移动加亮显示的文本。这些编辑操作具体请参考Windows的有关文档。
运行记录窗口记录程序的运行情况,运行是成功还是出错,运行所用时间,如果出错,错在
什么地方。运行记录窗口中以红色显示的是错误信息。
输出窗口显示SAS程序的文本型输出(图形输出单独有一个GRAPHICS窗口)。输出分页显示
。
要把光标移动到某一窗口,可以用主菜单中的Window菜单选择要显示的窗口。用功能键F5可
以切换到程序窗口,F6可以到运行记录窗口,F7可以到输出窗口。
SAS主窗口标题栏下是主菜单。SAS菜单是动态的,其内容随上下文而不同,即光标在不同窗
口其菜单也不同。其中,File(文件)菜单主要是有关SAS文件调入、保存及打印的功能。E
dit(编辑)菜单用于窗口的编辑(如清空、复制、剪切、粘贴、查找、替换)。Locals(
局部)菜单与当
前正在进行的操作有关,如果你正在程序窗口中编辑程序,则Locals菜单有提交运行、调回
修改等项,如果在运行记录窗口或输出窗口则Locals菜单项根本不出现。Globals菜单内容
比较复杂,它可以打开被关闭的程序窗口、运行记录窗口、输出窗口、图形窗口,可以进入
SAS提供的各个独
立模块。主菜单下是一个命令条和工具栏菜单。命令条主要是用于与SAS较早版本的兼容性
,可以在这里键入SAS的显示管理命令。工具栏图标提供了常见任务的快捷方式,比如保存
、打印、帮助等等。鼠标光标在某一工具栏图标上停留几秒可以显示一个说明。工具栏图标
的解释如下:
Submit - 提交编辑窗口中的程序
New - 清空编辑窗口
Open - 打开文件到编辑窗口。用户指定一个文件调入到编辑窗口内。这个文件从此与编
辑窗口相关联,以后的存盘操作将自动存入这个文件。
Save - 存盘,保存编辑窗口内容,注意如果此窗口已经与一个文件相联系的话此功能将
覆盖文件的原有内容而不提示。
Print - 打印当前窗口内容
Print preview -打印预览。
Cut - 剪切选定文本。
Copy - 复制选定文本。
Paste - 粘贴。注意这些操作是对Windows剪贴板进行的,可以用来与其它Windows应用
程序交换文本、数据等。剪切或复制到剪贴板的内容可以被其它应用程序粘贴,其它应用程
序放到剪贴板的内容也可以粘贴到SAS的编辑窗口中。
Undo - 撤销刚才的编辑操作。
DOS prompt - 临时进入DOS。
Browse - 打开WWW浏览器并进入SAS公司的主页www.sas.com。
Directories - 进入Directory(目录)窗口,可以浏览各SAS目录的内容,可以浏览目
录中的数据集、SAS目录的内容。
SAS/ASSIST - 启动SAS的菜单驱动界面SAS/ASSIST。
Help - 启动Windows的帮助系统进入SAS的帮助。
1.1.3 简单运行样例
假设我们有一个班学生的数学成绩和语文成绩,数学满分为100,语文满分为120,希望计算
学生的平均分数(按百分制)并按此排名,可以在程序窗口输入此程序:
title '95级1班学生成绩排名';
data c9501;
input name $ 1-10 sex $ math chinese;
avg = math*0.5 + chinese/120*100*0.5;
cards;
李明 男 92 98
张红艺 女 89 106
王思明 男 86 90
张聪 男 98 109
刘颍 女 80 110
;
run;
proc print;run;
proc sort data=c9501;
by descending avg;
run;
proc print;run;
实际上,输入这样包含中文的程序最好办法不是在SAS程序窗口直接输入,因为SAS目前对中
文输入的处理还不够完善,好的办法是打开一个其它的编辑程序如Windows中的记事本(在W
in95中用开始菜单中的"程序 | 附件 |
记事本"启动),在记事本中复制输入的程序,然后到SAS系统程序窗口中使用粘贴命令(用
Edit菜单的Paste或工具栏上的粘贴图标),把程序复制到SAS中。也可以在记事本中把编好
的程序存盘,然后在SAS程序窗口用File菜单的Open命令打开保存好的程序文件。
要运行此程序,只要用鼠标单击工具栏的提交图标 ,或用Locals菜单的Submit命
令。运行后,运行记录窗口出现如下内容:
50 title '95级1班学生成绩排名';
51 data c9501;
52 input name $ 1-10 sex $ math chinese;
53 avg = math*0.5 + chinese/120*100*0.5;
54 cards;
NOTE: The data set WORK.C9501 has 5 observations and 5 variables.
NOTE: The DATA statement used 0.11 seconds.
60 ;
61 run;
62 proc print;run;
NOTE: The PROCEDURE PRINT used 0.0 seconds.
63 proc sort data=c9501;
64 by descending avg;
65 run;
NOTE: The data set WORK.C9501 has 5 observations and 5 variables.
NOTE: The PROCEDURE SORT used 0.05 seconds.
66 proc print;run;
NOTE: The PROCEDURE PRINT used 0.0 seconds.
其中记录了每段程序的运行情况、所用时间、生成数据保存情况。如果有错误还会用红色指
示错误。比如,最后的proc print后面的分号如果丢失,记录窗口显示如下错误:
67 proc printrun;
--------
181
ERROR 181-322: Procedure name misspelled.
错误说明为过程名错拼,但实际上是丢了分号导致print和run连成了一个词。在程序窗口用
"Locals | Recall text"菜单或按F4功能键可以调回程序修改。正确运行后输出窗口出现如
下结果:
95级1班学生成绩排名 3
OBS NAME SEX MATH CHINESE AVG
1 李明 男 92 98 86.8333
2 张红艺 女 89 106 88.6667
3 王变量作,而是对两个离散变量来作。比如,先把SASUSER.CLASS中变
量AGE的量测水平由Int改为Nom,然后取消所有变量的选定,启动"Box Plot/Mosai Plot",
选SEX为Y变量,选AGE为X变量,作图如图
16。这种图的好处是直观显示了两个变量每种取值组合的观测个数和比例。单击或双击其中
一个方块可以迅速选中一个分组,比如双击年龄为11性别为女(F)的方块可以看到这一组
的学生。
1.3.4 数据探索――二维
SAS/INSIGHT可以作曲线图、散点图、散点图矩阵,可以在散点图中刷亮观测。
图 17 曲线图选择变量的对话框
图 18 CO和WIND的曲线图
曲线图有一个取值由小到大的X变量,有一个或几个Y变量,以X变量为横坐标对Y变量画曲线
。为了演示曲线图,打开SASUSER.AIR数据集(用"File |
Open"菜单)。这个数据集是德国某城市一周的每小时记录的空气污染情况。变量DATETIME
是记录的日期时间,为特殊SAS格式数据,变量DAY为星期几,HOUR为几点钟,CO、O3、SO2
、NO、DUST分别为一氧化碳、臭氧、二氧化硫、一氧化氮、粉尘的浓度,WIND为风速。要画
一氧化碳的曲线图
,可以在未选任何变量的情况下用"Analyse | Line Plot",弹出变量对话框(图
17),选DATETIME为X变量,CO为Y变量,可以画出CO的时间序列曲线图。单击曲线上某一个
点可以显示其观测序号,双击可以检查观测。如果想单击曲线上点时不显示观测序号而显示
记录时间是几点,可以在曲线图窗口中选主菜单的"Edit | Window |
Renew",可以再弹出变量窗口,选HOUR并按Label钮把时间指定为标签变量。这时在作的CO
的曲线图上单击一个点显示的就是记录时间了。可以看出CO的高峰一般在早晨8点和晚上17
点-21点。用图形菜单(右键或单击向右三角)中的Observations可以画出各个数据点的符
号。
可以在图上同时画出多条曲线。比如,想考察风速对污染的影响,在图形窗口中再用主菜单
的"Edit | Window | Renew",把WIND也作为Y变量,画出的图就有两条不同颜色的曲线,单
击外面的CO变量符号和WIND变量符号可以加重显示对应的曲线以区分这两条曲线。见图
18。图中被选的点是风速的最高值,时间是11点。注意在一条曲线中被选在另一条曲线中也
被选。从此图可以看出风速对污染有较明显的影响,风大时污染较轻。
图 19 体重对身高的散点图
散点图也有一个X变量和一个Y变量,但不要求X变量有从小到大的次序,画图不用连线而是
用散点画出每一对X、Y坐标。比如对SASUSER.CLASS,我们希望通过画图了解身高和体重的
关系。在数据窗口中先选定体重(Y轴变量)再附加选定身高(X轴变量),启动菜单"Analy
ze | Scatter
Plot",就可以生成以体重为纵轴以身高为横轴的散点图(见图 19)。从图可以看出体重与
身高有明显的线性相关关系。
为了解哪一个点代表哪一个学生,单击一个点可以显示其观测序号,双击可以检查观测。为
了在单击时可以显示学生名字而不是观测序号,需要把NAME指定为标签变量。这可以在生成
散点图时先不在数据窗口选X、Y变量而是直接启动"Analyze | Scatter
Plot"菜单,弹出变量对话框,在其中选X、Y变量并把NAME指定为Label变量。这时,单击散
点图中最左下角的那个点可以显示名字Sandy,单击最右上角的那个点可以显示Philip。选
多个点可以用附加选中的办法(Shift或Ctrl单击)。
图 20 年龄、身高、体重的散点图矩阵
为了在散点图中选定多个点,SAS/INSIGHT还提供了一种称为"刷亮(Brushing)"的操作。
在图中拖动鼠标光标可以拖出一个小长方形,在这个长方形中的点都被选中,称它为刷子。
选中的点在、Curves菜单被开放。在Tables菜单中可以选加一些统计表,比如Frequency
Table是频数表,为每一观测值的频数、累计频数、百分比,C.I. for Mean可以计算均值的
各种置信度的置信区间,Location Tests用于检验均值为某常数值(一般是0)的假设,可
以用t检验、符号检验、符号秩检验,Gini's Mean
Difference是变量分布分散程度的一种 冉」兰 ,计算公式为 ,对正态分布其期望值为 。
Trimmed Mean, (1/2)N计算去掉最大(1/2)N个和最小(1/2)N个值后的平均值,(1/2)N可以指
定为1,2,3或自定值,这是变量中心位置的一种 冉」兰 ,但估计量本身不再服从正态分
布。Trimmed
Mean, (1/2)Percent指定去掉最大、最小的百分之多少再计算均值。Winsorized Mean是把
最大的(1/2)N个替换成由大到小第(1/2)N+1号值,把最小的(1/2)N个替换成由小到大第(1/
2)N+1个值,然后计算的均值,它也是一种稳健的均值估计。
图 28 GPA分数的QQ图
图 29 身高的QQ图
图 30 GPA分布直方图
图 31 左偏、右偏、轻尾、重尾的QQ图
在Graphs菜单中已选了直方图、盒形图,还可以作QQ图,即分位数-分位数图。图
29为身高的正态QQ图,其中画出了班上19个学生的19个点,每个点的纵坐标为变量值,而横
坐标为该值的累计百分比频数对应的标准正态分位数。比如,身高最低的一个为51.3,其累
计百分比频数(即51.3的经验分布函数值)为5.3%,即身高小于51.3的占5.3%,而标准正态
分布的0.053分
位数为-1.84570,所以此点的横坐标即-1.84570。如果身高服从正态分布,QQ图的散点应大
致在一条直线附近变动。QQ图的各种不同形状能够反映出变量分布的偏斜情况和重、轻尾情
况。在QQ图中也可以选观测、刷亮等。画出QQ图后选主菜单中的"Curves | QQ Ref
Line"可以为图中散点画一条拟和直线。
图 29的身高的QQ图显示身高基本服从正态分布。如果我们SASUSER.GPA中GPA分数的QQ图(
图
28),就可以看到GPA的分布呈现左偏的情况。这是因为,在QQ图的左下端,GPA散点的走向
比正态(图中直线)偏下,说明GPA分布的左尾比正态长;在QQ图的右上端,GPA散点的走向
比正态偏右下,说明GPA分布的右尾比正态短,即分布左偏。作为验证,可以看一看图 30的
直方图。
图 32 参数密度估计设定
图 31给出了与正态相比左偏、右偏、轻尾、重尾的分布的QQ图的典型模式。
除了可以作正态分布QQ图外,还可以作对数正态、指数分布、威布尔分布的QQ图。对数正态
要指定参数Sigma,威布尔分布要指定形状参数C。
图 33 叠加了正态密度估计的直方图
SAS/INSIGHT为研究一维变量分布除画直方图外还提供了两类分布密度估计:参数估计和非
参数估计。参数估计可以拟和正态、对数正态、指数、威布尔分布密度。非参数估计使用核
估计。
比如,为了估计身高的正态密度并把密度曲线叠加在直方图上,选"Curves | Parametric D
ensity",弹出对话框图 32,指定正态分布且方法为用样本估计分布密度参数。按OK后作出
的图见图 33。
图 34 分布密度估计的参数表(部分)
为了作身高密度的核估计图,选"Curves | Kernel Density",弹出一个对话框,可以选三
种核函数:正态核、三角核、二次函数核,可以自动拟和最优的密度估计(方法为AMISE)
或者自己指定平滑参数C。见图 33。
图 35 经验分布函数及95%置信限
作了密度曲线图后在图形下面将出现显示密度估计主要参数的表格,见图
34。单击其中的曲线标志可以加亮显示图中的曲线。对参数密度估计,给出了估计的参数,
比如正态的均值、方差;对核估计,给出了核函数类型,及平滑参数值。有些参数旁边有一
个滑块,可以手工选择参数的值。比如拖动核估计中的平滑参数,此参数变小时估计的曲线
变粗糙,变大时
曲线变光滑。
在"Curves"菜单中还提供了对样本经验分布函数的估计。选"Curves | Empirical CDF"即绘
制样本经验分布函数。选"Curves | CDF Confidence Band"并选一个置信限可以在经验分布
函数两边画分布函数的置信限,见图 35。
用经验分布函数估计分布函数相当于用直方图估计分布密度。分布函数也可以用参数分布函
数(如正态分布)来估计。选"Curves | Parametric CDF"并选分布类型可以画出估计的分
布函数。图 35中的光滑曲线即用正态分布估计身高的分布函数。
图 36 分布的检验
SAS/INSIGHT还可以进行分布检验,可以检验数据是否来自某一类分布(参数未知),或检
验数据是否来自某一特定分布(参数已知)。选"Analyze | Test for Distribution",并
选择是检验正态、对数正态、指数、威布尔分布中哪一个,选正态后,得到图
36的结果。它给出了分布类型、估计的分布均值、标准差,及Kolmogorov D统计量的值,并
给出了检验H0:样本来自正态分布的检验p值(Prob > D)为>.15,说明检验结果不显著,
不能否定正态假设。
图 37 检验是否标准正态分布
如果要检验数据是否来自某一特定分布,选"Curves | Test for a Specific Distribution
",并指定分布类型、分布参数,可以计算检验的Kolmogorov D统计量及相应p值。图 37是
检验身高是否标准正态分布的结果,可以看出p值为0.0001高度显著,应该否定数据来自标
准正态的假设。
说明:在SAS中,统计假设检验的结果一般用检验的p值给出。这与我们习惯的做法稍有不同
,以单正态总体的均值检验为例。假设我们要检验SASUSER.CLASS中学生的身高是否均值为
零(这当然不可能,我们为简单起见用这种假设),设总体服从 ,要检验的零假设为
,水平0.05,统计量使用t统计量
,一般我们用的假设检验方法定否定域为W={|t|>C},其中C为n-1自由度t分布的双侧0.05分
位数(Pr{|t|>C}=0.05),当用样本算出的t统计量的值(如t=A)落入否定域时(|A|>C)
否定零假设。在SAS中不需要这样指定否定域,它可以先用样本计算出t统计量的值(A),
如果这个A绝对值
很大就否定零假设,t统计量绝对值值是不是很大可以用这样一个p=Pr{|t|>|A|}来衡量,p
是一个0到1之间的数值,显然|A|越大,p越小。p<0.05与|A|>C是等价的。所以,如果p小于
0.05,就否定零假设,称检验结果是显著的。否则不否定零假设。对SASUSER.CLASS中HEIGH
T变量,在其分布
窗口中选菜单"Tables | Location Tests"并从弹出的对换框中选中t检验,要检验的均值为
0,得到的结果见图 38。计算得到的t统计量值为A=52.9971,p值为Pr{|t|>52.9971}小于
等于0.0001。因p值小于0.05所以结果是否定零假设,结论是身高均值不为零。
SAS/INSIGHT还提供了曲线拟和、回归、logistic回归、Poisson回归、相关分析、主成分分
析等高等统计功能,我们在后面再陆续介绍。
图 38 身高均值为0的t检验结果
练习
1. 启动SAS,认识界面。用F5、F6、F7切换三个窗口。
2. 输入1.1.3的例子。在运行记录窗口查看有无错误。有错时回到程序窗口用F4调回程序修
改。
3. 打开Libraries窗口查看各数据库的内容列表。
4. 启动SAS/INSIGHT,打开SASUSER.GPA数据集。作各变量的直方图,查看其分布情况并简
答。把GPA数据集按性别排序,同性别内按GPA分数由大到小排序。
5. 用数据窗口输入C9501数据集。
6. 研究GPA分数的分布。说明极端值情况。在纸上画出GPA的盒形图,并说明如何解释。通
过直方图、盒形图、各统计量、分布检验结果简述GPA分布的特点。
7. 给男女生观测指定不同颜色。画GPA对HSM的散点图。画各数值型变量的散点图矩阵。画H
SM、HSS、HSE的三维散点图。简述各变量间的直观的相互关系。
-- |
|
第2章 SAS语言与数据管理
SAS系统强大的数据管理能力、计算能力、分析能力依赖于作为其基础的SAS语言。SAS语言
是一个专用的数据管理与分析语言,它的数据管理功能类似于数据库语言(如FoxPro),但
又添加了一般高级程序设计语言的许多成分(如分支、循环、数组),以及专用于数据管理
、统计计算的函
数。SAS系统的数据管理、报表、图形、统计分析等功能都可以用SAS语言程序来调用,只要
指定要完成的任务就可以由SAS系统按照预先设计好的程序去进行,所以SAS语言和FoxPro等
一样是一种第四代语言。
本章简单介绍SAS语言的基本成分与规则,SAS语言如何用来管理数据,SAS语言作为一个统
计计算语言的用法,以及SAS过程使用的初步知识。
§2.1 SAS语言构成
2.1.1 SAS语句
SAS语言程序由数据步和过程步组成。数据步用来生成数据集、计算、整理数据,过程步用
来对数据进行分析、报告。SAS语言的基本单位是语句,每个SAS语句一般由一个关键字(如
DATA,PROC,INPUT,CARDS,BY)开头,包含SAS名字、特殊字符、运算符等,以分号结束
。
SAS关键字是用于SAS语句开头的特殊单词,SAS语句除了赋值、累加、注释、空语句以外都
以关键字开头。SAS名字在SAS程序中标识各种SAS成分,如变量、数据集、数据库,等等。S
AS名字由1到8个字母、数字、下划线组成,第一个字符必须是字母或下划线。SAS关键字和S
AS名字都不分大
小写。
2.1.2 SAS表达式
SAS数据步程序中的计算用表达式完成。表达式把常量、变量、函数调用用运算符、括号连
接起来得到一个计算结果。
SAS常量主要有数值型、字符型两种,并且还提供了用于表达日期、时间的数据类型。例如
l 数值型:12,-7.5,2.5E-10
l 字符型:'Beijing',"Li Ming","李明"
l 日期型:'13JUL1998'd
l 时间型:'14:20't
l 日期时间型:'13JUL1998:14:20:32'dt
数值型常数可以用整数、定点实数、科学计数法实数表示。字符型常数为两边用单撇号或两
边用双撇号包围的若干字符。日期型常数是在表示日期的字符串后加一个字母d(大小写均
可),中间没有空格。时间型常数是在表示时间的字符串后加一个字母t。日期时间型常数
在表示日期时间的
字符串后加字母dt。
因为SAS是一种数据处理语言,而实际数据中经常会遇到缺失值,比如没有观测到
数值,被访问人不肯回答,等等。SAS中用一个单独的小数点来表示缺失值常量。
SAS变量的基本类型有两种:数值型和字符型。日期、时间等变量存为数值型。SAS的数值型
变量可以存储任意整数、定点实数、浮点实数,一般不关心其区别。数值型变量在数据集中
的存贮一般使用8个字节。SAS的字符型变量缺省的长度是8个字符,但是如果在INPUT语句中
输入字符型变量
时指定了长度则不受此限制。可以用LENGTH语句直接指定变量长度,LENGTH语句一般应出现
在变量定义之前,格式为:
LENGTH 变量名 $ 长度;
例如
LENGTH name $ 20;
SAS运算符包括算术、比较、逻辑等运算符。
算术运算符为 + - * / **,运算优先级按通常的优先规则。
比较运算符用于比较常量、变量的值大小、相等,包括
= ^= > <
>= <= IN
EQ NE GT LT
GE LE
其中EQ等名字和=等特殊字符是同一运算符的等价写法。比较运算符得到"真"或"假"的结果
,主要用于需要条件的分支、循环等语句中。运算符IN是一个SAS特有的比较运算符,用来
检查某个变量的取值是否在一个给定列表中,比如
prov in ('Beijing', 'Tianjin', 'Shanghai', 'Chongqing')
可以判断变量prov的取值是否为四个直辖市之一。
呒…?
OTHERWISE 语句;
END;
这种SELECT语句没有选择表达式,而是在每一个WHEN语句指定一个条件(逻辑表达式),执
行第一个满足条件的WHEN后的语句。如果所有条件都不满足则执行OTHERWISE后的语句。例
如:
SELECT;
WHEN(age<=12) put '少年';
WHEN(age<35) put '青年';
OTHERWISE put '中老年';
END;
注意上例中第二个WHEN语句的条件等价于age>12 and age<35,因为如果年龄小于等于1
2的话则会执行第一个WHEN语句,然后退出SELECT结构,根本不会判断第二个条件。这与其
它语言中的IF-ELSEIF-ELSE结构的用法是一致的。
2.2.4 循环结构
SAS数据步可以使用丰富的循环结构,主要的是两种:计数DO循环和当型、直到型循环。
计数DO循环的写法是:
DO 计数变量 = 起始值 TO 结束值 BY 步长;
循环体语句……
END;
在DO和END之间可以有多个语句。程序先把计数变量赋值为起始值,如果此值小于等于结束
值则执行循环体语句,然后把计数变量加上步长,再判断它是否小于等于结束值,如果是则
继续执行循环体,直到计数变量的值大于结束值为止。上述结构中"BY
步长"可以省略,这时步长为1。如果步长取负值,则继续循环的条件是计数变量大于等于结
束值。例如:
data;
DO i = 1 TO 20 BY 2;
j = i**3;
put i 3. j 5.;
END;
run;
可以输出一个1,3,5,7,…,19的立方表。
在循环体中可以用LEAVE语句跳出循环,相当于C语言的break语句。例如在上例中
的循环体最后加上这样一句可以在立方大于1000时停止循环:
if j>1000 then LEAVE;
在循环体内用CONTINUE语句可以立即结束本轮循环并转入下一轮循环的判断与执行
。比如:
data;
do x=0 to 3.1415926 by 0.01;
y = sin(x);
if y<0 then CONTINUE;
z = cos(x);
put x 5.2 y 10.7 z 10.7;
end;
run;
这个程序对0到 之间的数每隔0.01计算正弦值,如果正弦值为负则考虑下一个值,正弦值非
负时计算余弦值并显示。
当型循环的语法是:
DO WHILE(循环继续条件);
循环体语句……
END;
程序先判断循环继续条件是否成立,成立时执行循环体语句,再判断循环继续条件,如此重
复,直到循环继续条件不再成立。例如,下面的程序判断1333333是不是素数:
data;
x=1333333;
i=3;
DO WHILE (mod(x,i) ^= 0);
i=i+2;
END;
if i<x then put x '不是素数';
else put x '是素数';
run;
其中mod(x,i)表示x除以i的余数。
直到型循环的写法是:
DO UNTIL (循环退出条件);
循环体语句……
END;
程序先执行循环体,然后判断循环退出条件是否成立,成立则结束循环,否则继续。注意每
轮循环都是先执行循环体再判断是否退出。例如:
data;
n=0;
do until (n>=5);
n+1;
put n=;
end;
run;
可以依次输出n=1,2,3,4,5,当n=5时退出条件"n>=5"满足,循环结束。上例中语句n+
1是一种特殊的写法,叫做累加语句,等价于n=n+1。
事实上,SAS的循环语句比上面所述还要灵活得多,它在DO语句中可以指定一个循
环列表,比如:
data;
do i=3,7, 11 to 17 by 3 while (i**2<200);
j=i**2;
put i j;
end;
run;
循环变量i取5,7,11,14循环体被执行,当i取17时i的平方为289故循环体不被执行,循环
结束。注意WHILE条件只作用于用逗号隔开的最后一项。
2.2.5 数组
SAS可以把一组同为数值型或同为字符型的变量合在一起,使用同一个名字称呼,用下标来
区分。这与通常的程序设计语言中的数组略有区别,通常的程序设计语言中数组元素没有对
应的变量名,而SAS数组每个元素都有自己的变量名。
一、数值型数组
定义数值型数组的格式为:
ARRAY 数组名(维数说明) 数组元素名列表 (初始值表);
例如:
ARRAY tests(3) math chinese english (0, 0, 0);
数组名是一个合法的SAS名字且不能与同一数据步中的变量重名。对一维数组,维数说明只
要说明元素个数,这时下标从1开始。数组元素名列表列出这个数组的各个元素实际代表的
变量名,各变量名以空格分隔。比如,上例中tests(1)代表数学成绩,tests(2)代表语文成
绩,tests(3)代表
英语成绩。初始值表给各数组元素赋初值,按顺序对应。
数组说明中初始值表可以省略,这时其初始值为相应数组元素的值(如果其数组元
素还没有值则初值为缺失值)。
数组说明中的数组元素名列表可以省略,这时其元素也有对应的变量名,变量名为
数组名后附加序号,比如:
ARRAY x(3);
中数组x的各元素名为x1,x2,x3。
也可以在说明维数时用"下标下界:下标上界"来说明一个其它的下标下界,如
ARRAY sales(95:97) yr95-yr97 ;
这时sales(95)为yr95,sales(96)为yr96,sales(97)为yr97。上面的变量名列表是一种特
殊的语法,在用到变量名列表时如果连续写几个前面字母相同,后面是连续的序号的变量,
只要写出第一个和最后一个,中间用减号连接。
一维数组的维数说明还可以是一个星号,这时数组大小由提供的元素列表中的变量
个数决定,如上面的数组tests可以等价地说明为:
ARRAY tests(*) math chinese english (0, 0, 0);
可以用函数DIM(数组名)来获得数组的长度。
可以定义二维数值型数组,只要在维数说明中指定用逗号分开的两个下标界说明,
例如:
array table(2,2) x11 x12 x21 x22;
说明table(1,1)为x11,table(1,2)为x12,table(2,1)为x21,table(2,2)为x22。二维数组
元素按行排列。
二、字符型数组
定义字符型数组的语法略复杂,它需要加一个$符来说明数组元素类型为字符型,
并且要说明每一元素所能存储的字符串的最大长度。说明格式如下:
ARRAY 数组名(维数说明) $ 元素长度说明 数组元素名列表 (初始值
表);
例如:
ARRAY names(3) $ 10 child father mother;
字符型数组其它方面用法与数值型相同。
三、临时数组
上面格式说明的数组都是把若干个变量集合在一起使用同一个数组名称呼,每个数组元素是
一个独立的变量。SAS也提供了与其它程序设计语言相同的数组,即数组元素只由数组名和
序号决定,没有对应的变量名。这种数组叫住?30。下一个INPUT语句从数据行中读入下一个
观测,把变量X、
Y赋值100、200。读取位置由运行时设置的一个数据指针指示。然后计算变量Z的值得300。
于是PUT语句输出的X、Y、Z值分别为100、200、300。然后,运行控制跳过CARDS语句到空语
句,到数据步结尾,把第二号观测输出到数据集,再返回到数据步开头,把变量值赋初值为
缺失值,所以第
一个PUT语句输出的三个变量值为缺失值。然后运行到INPUT语句,应该读入下一个观测,但
是查询数据指针发现已经读完了所有数据,所以本数据步结束,并把两个观测写入数据集WO
RK.A中。提交PROC PRINT;RUN;就可以显示此数据集的内容如下:
OBS X Y Z
1 10 20 30
2 100 200 300
从这个例子可以看出SAS数据步程序和普通程序的一个重大区别:SAS数据步如果有数据输入
,比如用INPUT、SET、MERGE、UPDATE、MODIFY等语句读入数据,则数据步中隐含了一个循
环,即数据步程序执行到最后一个语句后,会返回到数据步内的第一个可执行语句开始继续
执行,直到读入
数据语句(INPUT、SET、MERGE、UPDATE、MODIFY等)读入了数据结束标志为止才停止执行
数据步,并把读入的各个观测写入在DATA语句中指定的数据集。如果没有数据输入而只是直
接计算,则数据步程序不需要此隐含循环。数据步因为有这样一个隐含循环,所以也提供了
用来查询某一步
是第几次循环的特殊变量 _N_,它的值为数据步循环计数值。
数据步流程见图 1。
图 1 数据步流程图
2.3.2 用INPUT语句输入数据
在数据步中输入数据可以从原始数据输入,也可以从已有数据集输入。从原始数据输入要使
用INPUT语句来指定输入的变量和格式。数据行写在CARDS语句和一个只有一个分号的行之间
。
最简单的INPUT语句使用自由格式:按顺序列出每个观测的各个变量名,中间用空格分开。
变量如果是字符型的需要在变量名后面加一个$符号,$符与变量名可以直接相连也可以隔
一个空格。例如:
data c9501;
input name $ sex $ math chinese;
cards;
李明 男 92 98
张红艺 女 89 106
王思明 男 86 90
张聪 男 98 109
刘颍 女 80 110
;
run;
注意这个例子的数据有五个观测,四个变量,每行数据的各变量之间用空格分隔。为输入这
些数据,INPUT语句中依次列出了四个变量名,并在字符型变量NAME和SEX后加了$符。要生
成一个数据集这是最简单的写法。
使用自由格式也有一些限制条件,如果不满足这些条件时需要改用其它输入格式:
l 数据每行为一个观测,各数据值之间用空格或制表符分隔
l 无论是字符型还是数值型缺失数据都必须用小数点表示
l 字符型数据长度不能超过8个字符,不允许完全是空白,中间不允许有空白,开头和结尾
如果有空白将被忽略
l 在INPUT语句中必须列出观测中的每一项数据对应的变量名而不能省略中间的某一个
在满足以上条件时就可以使用自由格式,它也有明显的优点:使用简单;输入数据时不必上
下对齐;不需要知道每个变量的具体列数而只需知道它的次序。
如果各数据行的各个数据项是上下对齐的,还可以使用INPUT语句的列方式。这时,除了在I
NPUT关键字后面列出变量名外,还需要在每个变量名(及$符)后面列出该变量在数据行中
所占据的列起始位置与结束位置,比如上面的例子可以改写成:
data c9501;
input name $ 1-10 sex $ 11-13 math 14-16 chinese 18-20;
cards;
李明 男 92 98
张红艺 女 89 106
王思明 男 86 90
张聪 男 98 109
刘颍 女 80 110
;
run;
使用列方式时一定要正确数出每一项所占的位置。列方式有如下特点:
l 要求数据行各项上下对齐
l 各项之间可以没有任何分隔,连续写在一起
l 字符型数据长度可以超过8个字符,中间可以有空格,头尾的空格仍将被忽略。
l 不论字符型变量还是数值型变量如果指定列位置都是空白则输入值为缺失值。小数点仍表
示数值型和字符型变量的缺失值。
l 可以只输入数据行中的某些项而忽略其它项。
列方式不要求数据项之间分开,所以经常用来输入紧缩格式的数据。比如,我们要输入一批
身份证号码,但只输入其中的出生年、月、日信息,就可以用如下程序:
data pids;
input year 7-8 mon 9-10 day 11-12;
cards;
110103751209223
110101690215005
;
run;
列格式可以与自由格式混用,见1.1.3的例子。
如果需要完全原样地输入字符型数据(包括头尾空格、单独的小数点),可以用有
格式输入,即在字符型变量名和$符后加上一个输入格式如CHAR10.表示读入10个字符。
有特殊格式的数据需要用有格式输入,即在变量名后加格式名。其中最常见的是用来输入日
期。数据中的日期写法经常是多种多样的,比如1998年10月9日可以写成"1998-10-9","199
81009","9/10/98"等等,为读入这样的日期数据就需要为它指定特殊的日期输入格式。另
外,日期数据在S
AS中是按数值存储的,所以如果要显示日期值,也需要为它指定特殊的日期输出格式。例如
:
data a;
input date yymmdd8. sales;
format date yymmdd10.;
cards;
56-6-13 1100
67.12.15 1200
78 10 2 1300
891001 1400
19960101 1500
20020901 1600
;
run;
proc print;run;
其中日期数据占据8列位置,如果不满8列要用空格补充,不能让后面的数据进入这8列。这
样可以输入没有世纪数,年、月、日之间用减号、小数点、空格分隔的日期,可以输入YYMM
DD格式的六位数的日期(一位数的月、日前面补0),可以输入带世纪数的YYYYMMDD格式的
日期(一位数的月
、日前面补0)。FORMAT语句规定输出日期变量时使用的显示格式。结果为:
1 1956-06-13 1100
2 1967-07-11 1200
3 1978-10-02 1300
4 1989-10-01 1400
5 1996-01-01 1500
程序语句对生成的数据集进行修改。比如,我们把超过100分的语文成
绩都改为100分,就可以用如下程序:
data c9501a;
set c9501;
if chinese>100 then chinese=100;
run;
当然,这种修改也可以在读入原始数据的数据步中使用而不限于使用SET的数据步。也可以
生成新的变量。
在数据步中可以用KEEP语句或DROP语句指定要保留的变量或要丢弃的变量。比如,
data c9501b;
set c9501;
keep name avg;
run;
生成的数据集C9501B只包含NAME和AVG两个变量。用KEEP语句指定要保留的变量。用DROP语
句指定要丢弃的变量,比如上例中的KEEP语句可以换成:
drop sex math chinese;
用这种方法可以取出数据集的一部分列组成的子集。
也可以指定一个条件取出数据集的某些行组成的子集。比如,我们希望取出数学分
数90分以上,语文分数100分以上的学生的观测,可以用如下的"子集IF语句":
data c9501c;
set c9501;
IF math>=90 and chinese>=100;
run;
注意子集IF语句不同于我们前面所讲的分支语句,它没有THEN部分,只有条件,用于取出满
足条件的行子集。
2.3.5 用SET和OUTPUT语句拆分数据集
有时我们需要根据某一分类原则把数据行分别存放到不同的数据集。比如,我们希望把数据
集C9501中的所有男生的观测放到数据集C9501M中,把所有女生的观测放到C9501F中,可以
使用如下程序:
data c9501m c9501f;
set c9501;
select(sex);
when('男') output c9501m;
when('女') output c9501f;
otherwise put sex= '有错';
end;
drop sex;
run;
proc print data=c9501m;run;
proc print data=c9501f;run;
这个程序中有两个地方需要注意:在DATA语句中,我们指定了两个数据集名,这表示要生成
两个数据集。程序中用SET语句引入了一个数据集,这个数据集的观测如何分配到两个结果
数据集中呢?关键在于OUTPUT语句。OUTPUT语句是一个可执行语句,它命令把当前观测写到
语句指定的数据
集中。这样,我们根据SELECT的结果把不同性别分别放到了两个不同数据集中。
OUTPUT语句还可以用来强行写入数据集而不必象我们在数据步流程图中说明的那样等到数据
步最后一个语句完成。数据步中有了OUTPUT语句后数据步流程中不再有自动写入观测的操作
,而只能由OUTPUT语句指定输出。不指定数据集名的OUTPUT语句输出到第一个结果数据集。
比如下面的程序
生成一个包含1到10的及其平方的有10个观测的数据集:
data sq;
do i=1 to 10;
j=i*i;
output;
end;
run;
proc print;run;
如果删去上面的OUTPUT语句则结果数据集中只有i=11,j=100的一个观测。
2.3.6 数据集的纵向合并
Classes
几个结构相同的数据集可以上下地连接到一起。比如,我们有四个班的学生情况的数据集Cl
ass1-Class4,每个数据集包含一个班学生的学号、姓名、性别信息,我们希望把这些数据
集合并为一个大数据集,可以用如下代码:
data classes;
set class1 class2 class3 class4;
run;
可见,要把若干个结构相同的数据集合并为一个数据集,只要在DATA语句中指定要生成的大
数据集的名字,然后在数据步中使用SET语句并在SET语句中依次列出各小数据集。
有时我们需要在合并数据集时加入一个变量来指示每一个观测原来来自哪一个小数据集,这
可以在SET语句的每一个数据集名后面加一个括号,里面写上IN=变量名,变量名所给的变量
取1表示观测来自此数据集,取0表示观测非来自此数据集。例如,在2.3.5中我们把C9501数
据集按男、女拆
分成了C9501M和C9501F两个数据集并抛弃了性别变量,就可以用如下程序连接两个数据集并
恢复性别信息:
data new;
set c9501m(in=male) c9501f(in=female);
if male=1 then sex='男';
if female=1 then sex='女';
run;
在数据步中,如果观测来自C9501M,则变量MALE值为1,如果观测来自C9501F则变量FEMALE
值为1,可以使用这两个变量的值定义新变量SEX。用数据集选项的IN=指定的变量不能直接
进入结果数据集而只能用于数据步程序中。
2.3.7 数据集的横向合并
两个(或多个)数据集如果包含了同样的一些观测的不同属性(变量),比如,数据集C950
1U包含学生的姓名、性别,数据集C9501V包含学生的数学成绩,数据集C9501W包含学生的语
文成绩,且各数据集的观测是按顺序一一对应的,就可以用如下带有MERGE语句的数据步把
它们左右横向合
并到一个数据集NEW:
data new;
merge c9501u c9501v c9501w;
run;
这样虽然可以横向合并数据集,但是如果各数据集的观测顺序并不一样,就会把不同人的成
绩合并到一起。所以横向合并一般应该采用按关键字合并的办法,即先把每个数据集按照相
同的、能唯一区分各观测的一个(或几个)变量排序,然后用BY语句和MERGE语句联合使用
,这样即使原来
观测顺序不一致也可以保证横向合并的结果没有错。下例先把C9501数据集横向拆分为包含
姓名、性别的数据集C9501X和包含姓名、数学成绩、语文成绩的数据集C9501Y,然后按关键
字横向合并:
data c9501x;
set c9501;
keep name sex;
run;
data c9501y;
set c9501;
keep name math chinese;
run;
proc sort data=c9501x;
by name;
run;
proc sort data=c9501y;
by name;
run;
data new;
merge c9501x c9501y;
by name;
run;
proc print;run;
其中的PROC SORT是排序过程,用来把数据集按照某个变量的次序排序(这里是按变量NAME
的次序排列,用BY语句指定排序的变量名)。
2.3.8 用UPDATE语句更新数据集
如果我们发现数据集中的某些数据值有错误或者现在的值已经改变了,我们可以从更正了的
原始数据重新生成数据集,或者使用更有效的方法,即建立一个只包含新数据值的数据集,
用此数据集修改原数据集。使用如下的DATA步中可以实现数据集的更新:
DATA 新数据集名;
UPDATE 原数据集 更新用数据集;
BY 关键变量;
RUN;
例如,比如我们发现数据集C9501中王思明的语文成绩实际应该是91分,张红艺性别应为男
,可以先生成如下的只包含更正数据值的数据集,不需要改的观测不列入,不需要改的变量
不列入或取缺失值:
data upd;
input name $ sex $ chinese;
cards;
张红艺 男 .
王思明 . 91
;
run;
然后,把原数据集C9501和更新用数据集UPD均按姓名(NAME)排序:
proc sort data=c9501;
by name;
run;
proc sort data=upd;
by name;
run;
最后用UPDATE和BY更新得到新数据集NEW,其中王思明的语文成绩改成了91分,张红艺性别
改成了男。
data new;
update c9501 upd;
by name;
run;
proc print;run;
2.3.9 用PROC SQL管理数据
SAS系统首先是一个数据管理系统,因此它除了可以用SAS语言程序管理SAS数据库、数据集
外,还提供了其它大型数据库管理系统(如Oracle、Sybase)通用的SQL语言功能。在SAS系
统中SQL语言实现在SQL过程中。SAS的SQL过程可以从一个或多个表中查询信息,生成表,向
表中插入行,更
新表的内容,对表进行纵向合并、横向连接等等。SQL语言可以实现极其复杂的数据管理功
能,在这里我们只对它的查询功能作简单介绍,感兴趣的读者可以自己阅读一些数据库管理
方面的书籍。
用PROC SQL作查询的最简单的用法如下:
PROC SQL;
SELECT 第一项,第二项,…,第n项
FROM 数据集
WHERE 观测选择条件;
RUN;
其中SELECT是一个语句,FROM和WHERE叫做子句,注意语句是在最后结尾的,中间没有分号
。SELECT子句中指定的各项一般为变量名,中间用逗号分隔(注意不是用空格分隔)。FRO
M子句指定要从哪个数据集查询。WHERE子句指定选择观测的条件。所以,SELECT语句可以很
方便地从一个表查
询一个子集,并可以自动输出到输出窗口而不需再使用PROC PRINT。例如,下面的程序显示
语文成绩在100分以上(包含)的学生的姓名和数学成绩:
proc sql;
select name, math
from c9501
where chinese>=100;
run;
结果显示
NAME MATH
--------------------
张红艺 89
张聪 98
刘颍 80
在SELECT语句中还可以加入ORDER BY子句,可以为查询结果排序。比如,下程序
proc sql;
select name, math
from c9501
where chinese>=100
order by math desc;
run;
结果为
NAME MATH
--------------------
张聪 98
张红艺 89
刘颍 80
SELECT的强大查询功能还表现在它可以从几个表联合查询。比如,考虑2.3.7中的C9501X和C
9501Y,我们要从这两个数据集查询与从C9501一个数据集同样的结果,可以用此程序:
proc sql;
select c9501x.name, math
from c9501x, c9501y
where c9501x.name=c9501y.name
and chinese>=100
order by math desc;
run;
其中连接两个数据集的办法是在WHERE子句指定C9501X.NAME=C9501Y.NAME这样的连接条件。
在SELECT中指定变量时如果有两个数据集中共有的变量要用C9501X.NAME这样的带有表名(
数据集名)的形式。
连接的两个表有时是同一个表。比如,我们有几个学生的姓名和生日,希望找出那
些有相同生日的人。可以用如下的SQL过程:
title '找出生日相同的人';
data class;
input name $ 1-8 birth yymmdd10.;
format birth yymmdd10.;
label name='姓名' birth='生日';
cards;
李明 78-6-1
王思明 78-5-19
张聪 78-6-1
刘颖 78-10-18
张红艺 78-5-19
;
proc sql;
select name, birth
from class a
where birth in select birth
from class b
where b.name ^= a.name
order by a.birth;
run;
结果如下:
找出生日相同的人 21
姓名 生日
--------------------
王思明 1978-05-19
张红艺 1978-05-19
张聪 1978-06-01
李明 1978-06-01
如果我们还希望把查询的结果存入一个数据集,可以在上面的第一个SELECT语句前面加上CR
EATE TABLE 表名 AS:
proc sql;
CREATE TABLE bsame AS
select name, birth
from class a
…………………
run;
proc print data=bsame label;
id name;
by birth;
run;
结果如下:
找出生日相同的人 22
------------------------------ 生日=1978-05-19 -------------------------------
姓名
王思明
张红艺
------------------------------ 生日=1978-06-01 -------------------------------
姓名
张聪
李明
如果不用SQL过程想得到同样的结果,可以使用如下数据步和过程步:
proc freq data=class noprint;
tables birth / out=bfreq;
run;
proc sort data=class;
by birth;
proc sort data=bfreq;
by birth;
data bsame;
merge class bfreq;
by birth;
if count>1;
run;
proc print data=bsame label noobs;
var name;
by birth;
run;
练习
1.用SAS数据步列出10000以下的素数,写出程序。
2.生成t分布的双侧分位数表。水平取0.001,0.002,0.005,0.01,0.02,0.05,0.10,0
.20,自由度取1-100,分位数精确到小数点后3位。表格应为行、列对齐的形式,并有列标
题。写出生成这样的表格并存放到一个文本文件中的SAS程序。
3.写出计算从自己生日到2000年初经过的天数的程序。
4.下表为某邮购服务部的部分顾客记录:
姓名 性别 地区 日期 金额
章文 男 华东 1996-3-20 1099
王国铭 男 华东 1996-5-19 39
童子敏 女 华北 1996-1-5 986
刘念新 男 东北 1997-10-1 3581
李思今 女 华北 1997-4-4 659
关昭 女 东北 1996-11-5 358
赵霞 女 东北 1998-9-6 2010
(1)用数据步把此数据输入到SAS数据集;
(2)用程序找出男性顾客购买金额超过1000的哪些人;
(3)把数据拆分为包含姓名、性别、地区的一个数据集和包含姓名、日期、金额的一个数
据集;
(4)用MERGE和BY合并上一步拆开的两个数据集。
-- |
|
第3章 SAS过程初步
前面讲过,SAS系统用SAS数据步生成和管理数据,用过程步进行分析、报表、绘图
。本章介绍SAS过程步的一般用法和常用语句的含义,以及几个简单报表、分析、绘图过程
的使用。
§3.1 SAS过程用法及常用语句
3.1.1 SAS过程用法
SAS过程步的一般形式为:
PROC 过程名 DATA=输入数据集 选项;
过程语句 / 选项;
过程语句 / 选项;
……
RUN;
其中PROC语句的选项是可选的,用来规定过程运行的一些设置,如果有多个选项用空格分开
。DATA=输入数据集也是可选的,如果缺省的话使用最近生成的数据集。过程步一般以RUN语
句结束,也可以省略RUN语句而在下一个过程步或数据步的开始处结束,另外还有一种所谓
"交互式过程"可
以在遇到RUN语句时不结束过程运行,只有遇到QUIT语句或者下一个过程步、数据步时才结
束。过程步在PROC语句之后、结束之前可以有若干个过程语句,过程语句一般与数据步中的
语句不同,数据步中的语句一般不能用在过程步中。过程步语句一般以某一个关键字开头,
比如VAR、BY、TA
BLES、WEIGHT等,语句中有一些有关说明,如果有选择项的话要写在斜杠后。
SAS过程步有些是对数据集作某种变换(比如SORT过程对数据集排序),不生成显
示结果;多数过程步是对数据集作某些分析、报表,这时结果出现在OUTPUT窗口(高精度绘
图过程的输出在GRAPHICS窗口)。对OUTPUT窗口的结果,我们可以用"File | Save
As"菜单把它保存到一个文本文件进行进一步的修饰,插入到其它报告中,也可以用"File |
Print"菜单之间打印。
3.1.2 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等等),等号后面的变量名指定
了这些结果在输出数据集中叫什么名字? 6.00| 99.00| 9.54|
|--------------------+------------+------------+------------+-----------
-|
|女 | 84.50| 6.36| 108.00| 2.8
3|
|--------------------+------------+------------+------------+-----------
-|
|总计 | 89.00| 6.71| 102.60| 8.4
7|
------------------------------------------------------------------------
--
我们得到了一个全中文的统计表格。
§3.4 用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功能)。
§3.5 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(S、以SATM为横轴的散点图(见图
1)。在GPLOT过程中,用PLOT语句指定绘图用的变量。SYMBOL语句是一个全程语句,指定绘
图用的连线方式、颜色、散点符号、大小,等等。SYMBOL语句可以带编号,如SYMBOL2,SYM
BOL3等,不带编号的相当于SYMBOL1。
图 2 一氧化碳的时间序列图
为了绘制连线,只要在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;
图 3 带有95%预测限的回归直线和散点
其中我们指定了两个SYMBOL语句,第一个SYMBOL语句指定了LINE=1,表示线型为实线,第二
个SYMBOL语句指定了LINE=2表示线型为虚线。我们在PLOT语句中用了"纵轴*横轴=n"的格式
来指定曲线使用哪一个SYMBOL语句的规定来画,n对应于SYMBOL语句的序号。
SYMBOL语句的I=选项还可以取SPLINE表示在散点间连接连样条曲线,取I=SMnn(nn取00-9
9值)表示绘制样条曲线但可以不经过散点,nn值代表曲线光滑性与拟和度的折中。取I=NEE
DLE绘制每个点到横轴的垂线。取I=RL绘制线性回归直线,I=RQ为二次曲线,I=RC为三次曲
线,后面加上CLIn
n如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"。
3.7.2 直方图和扇形图
图 4 GPA的直方图
用GCHART过程绘制直方图、扇形图、三维直方图等表示变量分布的图形。例如,要绘制SASU
SER.GPA中GPA的分布直方图,只要用:
proc gchart data=sasuser.gpa;
vbar gpa;
run;
图 5 并排直方图
其中绘图用的变量用VBAR语句给出。图形见图 4。如果把VBAR改成HBAR则条形方向变为横向
。用GCHART绘制的直方图和在INSIGHT中绘制的直方图有所不同,它在横轴标的是区间的中
点值,而在INSIGHT中横轴标的是区间的端点值。
可以绘制分组的直方图,例如按性别分组绘制两个直方图并排放置,可以用如下程
序:
proc gchart data=sasuser.gpa;
vbar gpa / group=sex;
run;
结果见图 5。
图 6 扇形图
在GCHART中用PIE语句绘制表示频数的扇形图,例如:
proc gchart data=sasuser.gpa;
pie sex;
run;
结果见图 6。如果想显示百分比值,只要在PIE语句中加入TYPE=PERCENT选项,如"pie sex
/ type=percent;"。
GCHART过程还可以用BLOCK语句绘制三维直方图。例如,在SASUSER.HOUSES有各种
房子的情况,其中BEDROOMS表示卧室个数,STYLE表示房子的式样,都是分类变量,我们可
以用如下程序画出反映卧室个数和房子式样的联合分布的三维直方图:
图 7 三维直方图
proc gchart data=sasuser.houses;
block style / group=bedrooms;
run;
图形见图 7。
3.7.3 三维曲面图和等高线图
假设对一个二元函数z=f(x,y),我们有了x取等间隔值、y取等间隔值时z的值,这时我们可
以用G3D过程绘制曲面图形,用GCONTOUR绘制曲面的等高线图。
例如,我们想绘制一个二维正态分布曲面的图形,假设(X,Y)服从联合正态分布,其均值都
是0,方差分别为1和a,相关系数为r。这时,我们可以得到(X, Y)的联合密度函数的公式为
:
图 8 曲面图
我们可以在一个网格上计算曲面的值:
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));
图 9 等高线图
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;
见图 9。
3.7.4 图形的调整与输出
图 10 使用标题和汉字
各绘图过程中都指定了丰富的选项来调整图形,读者可以参考有关资料或查系统的帮助。另
外,在图形中也可以用TITLE语句和FOOTNOTE语句给图形加标题和脚注。为了在图形的标题
、标签中也能使用汉字,需要安装一套汉字字型库,文件名为FONTS.SC2,我们可以把它安
装在SAS系统子目
录的GFONT0目录中,在CONFIG.SAS设置文件中加一行
SET GFONT0 "C:\SAS\GFONT0"
设置(需要把路径设定为正确SAS系统路径)。这样,我们为了使用汉字标题,只要在标题
的汉字字符串之前加上F=SONG的说明即可。SONG表示宋体,还有HEI(黑)、KAI(楷)、FS
ONG(仿宋)。这时如果有英文的话需要指定F=COMPLEX之类的英文字体,例如:
title f=song '在' f=complex 'TITLE' f=song '语句中使用汉字的技巧';
title2 f=complex 'GPA' f=song '的直方图';
proc gchart data=sasuser.gpa;
vbar gpa;
run;
见图 10。
为了把SAS/GRAPH绘制的图形保存为兼容的图形文件,只要在显示某一页图形输出
时,选"File | Export"菜单,在出现的输入文件名的窗口选择适当的文件类型,如BMP、WM
F、JPEG、PS,等等。本讲义中的SAS/GRAPH图形就是从SAS中用"File | Export"输出为WMF
文件调入MS
Word的结果。
要打印SAS/GRAPH生成的图形,只要选"File | Print"。这样用Windows的打印驱动
程序与SAS/GRAPH的图形驱动配合来打印。另外,SAS/GRAPH模块还提供了许多种打印机的独
立的驱动程序,可以不依赖于Windows的打印驱动,具体请参考有关资料或帮助。
练习
1.(1)列出数据集SASUSER.GPA的内容,要求给各列加上合理的中文列标题,不要观测序
号。(2)只列出SEX、SATV、SATM三个变量,并按性别分类列出,计算SATV和SATM的总和和
按性别小计。
2.用TABULATE过程绘制SASUSER.GPA中GPA按性别分类及不分类的平均值、标准差,及男女
生人数。使用中文标签。
3.对SASUSER.GPA中的GPA用UNIVARIATE过程分析分布并简述结果。叙述性别分布。
4.绘制F分布自由度为(1,30),(2,30),(3,30),(4,30),(5,30),(10,30)的密度曲线图
(画在同一坐标系中)。
-- |
|
第4章 SAS的基本统计分析功能
前面我们已经看到了SAS的编程计算、数据管理能力、数据汇总、数据探索分析能力。这一
章我们讲如何用SAS进行基本的统计检验、线性回归、方差分析等基本统计分析。我们既使
用SAS语言编程,也使用SAS/INSIGHT的菜单界面。
§4.1 一些单变量检验问题
对单个变量,我们可能需要作正态性检验、两独立样本均值相等的检验、成对样本均值相等
的检验。
4.1.1 正态性检验
在PROC UNIVARIATE语句中加上NORMAL选项可以进行正态性检验。例如,我们要检验SASUSER
.GPA中GPA是否服从正态分布,只要用如下UNIVARIATE过程:
proc univariate data=sasuser.gpa normal;
var gpa;
run;
结果(部分)如下:
Univariate Procedure
Variable=GPA College Grade Point Average
Moments
…………
W:Normal 0.951556 Pr<W 0.0001
…………
其中W:Normal为Shapiro-Wilk正态性检验统计量,Pr<W为检验的显著性概率值(p值)。当
N≤2000时正态性检验用Shapiro-Wilk统计量,N>2000时用Kolmogorov D统计量。我们可以
看到,p值很小,所以在0.05水平(或0.10水平)下应拒绝零假设,即认为GPA分布非正态。
在SAS/INSIGHT中为了检验GPA的分布,先选"Analyze | Distribution"菜单打开GP
A变量的分布窗口,然后选"Curves | Test for Distribution"菜单。除了可以检验是否正
态分布外还可以检验是否对数正态、指数分布、Weibull分布。
4.1.2 两独立样本的均值检验
假设我们有两组样本分别来自两个独立总体,需要检验两个总体的均值或中心位置是否一样
。如果两个总体都分别服从正态分布,而且方差相等,可以使用两样本t检验过程TTEST。
比如,我们要检验SASUSER.GPA数据集中男生和女生的SATM分数是否具有相等的平均值,只
要用如下程序:
proc ttest data=sasuser.gpa;
class sex;
var satm;
run;
过程中用CLASS语句指定分组变量,用VAR语句指定要比较的变量。结果如下:
TTEST PROCEDURE
Variable: SATM Math SAT Score
SEX N Mean Std Dev Std Error
-----------------------------------------------------------------------------
Female 145 611.77241379 84.02056171 6.97752786
Male 79 565.02531646 82.92937599 9.33028376
Variances T DF Prob>|T|
---------------------------------------
Unequal 4.0124 162.2 0.0001
Equal 3.9969 222.0 0.0001
For H0: Variances are equal, F' = 1.03 DF = (144,78) Prob>F' = 0.9114
结果有三个部分:两个总体的SATM简单统计量,两样本均值的检验,以及两样本方差是否相
等的检验。标准的两样本t检验要求两总体方差相等,所以第三部分结果检验两样本方差是
否相等。如果检验的结果为相等,则可使用精确的两样本t检验,看第二部分结果的Equal那
一行。如果方差
检验的结果为不等,则只能使用近似的两样本t检验,看第二部分结果的Unequal那一行。这
里我们看到方差检验的p值为0.9114不显著,所以可以认为方差相等,所以我们看Equal行,
p值为0.0001在0.05水平下是显著的,所以应认为男、女生的SATM分数有显著差异,女生分
数要高。
上面的检验中对立假设是羇riables"改变量名),然后对此差值变量选"Analyze |
Distribution",选"Tables | Location Tests"并选中t检验、符号检验和符号秩检验即可
在分布窗口显示结果。
§4.2 回归分析
本节先讲述如何用SAS/INSIGHT进行曲线拟合,然后进一步讲如何用SAS/INSIGHT进行线性回
归,简单介绍SAS/INSIGHT的广义线性模型拟合,最后介绍如何用编程进行回归分析。
4.2.1 用SAS/INSIGHT进行曲线拟合
图 1 身高对体重的散点图及回归直线
两个变量Y和X之间的相关关系经常可以用一个函数来表示,一元函数可以等同于一条曲线,
实际工作中经常对两个变量拟合一条曲线来近似它们的相关关系。最基本的"曲线"是直线,
还可以用多项式、样条函数、核估计和局部多项式估计。其模型可表示为
例如,我们要研究SASUSER.CLASS数据集中学生体重与身高之间的相关关系。为此
,我们可以先画出两者的散点图(Analyze | Scatter plot)。从图中可以看出,身高越高
的人一般体重越重。我们可以把体重作为因变量、身高作为自变量拟合一条回归直线,只要
选"Analyze |
Fit (Y X)",并选体重为Y变量,身高为X变量,即可自动拟合出一条回归直线,见图 1。窗
口中还给出了拟合的模型方程、参数估计、诊断信息等,我们在下一小节再详细介绍。
在拟合了直线后,为拟合多项式曲线,只要选"Curves |
Polynomial",然后输入阶次(Degree(Polynomial)),就可以在散点图基础上再加入一条
多项式曲线。对于本例,我们看到二次多项式得到的曲线与直线差别很小,所以用二次多项
式拟合没有优势。还可以试用三次、四次等多项式。为了改变阶次还可以使用拟合窗口中的
多项式阶次滑块
(Parametric Regression Fit中的Degree(Polynomial))。
样条曲线是一种非参数回归的曲线拟合方法。光滑样条为分段的三次多项式,曲线
在每一段内是一个三次多项式,在两段的连接点是连续、光滑的。为拟合样条曲线,只要选
"Curves |
Spline",使用缺省的GCV准则(广义交叉核实)来选取光滑系数(光滑系数c越大,得到的
曲线越光滑,但拟合同时变差,光滑系数c小的时候得到的曲线较曲折,而拟合较好),就
可以在散点图的基础上画出样条曲线。可以用光滑系数c的滑块来调整曲线的光滑程度/拟合
优度。对于本例,
GCV准则得到的样条曲线与回归直线几乎是重合的,说明直线拟合可以得到满意的结果。
核估计是另一种非参数回归的曲线拟合方法。它定义了一个核函数 ,例如使用标
准正态分布密度曲线,然后用如下公式估计经验公式 :
其中 为光滑系数, 越大得到的曲线越光滑。为了画核估计曲线,只要选"Curves | Kernel
",权重函数使用缺省的正态核,选取光滑系数的方法采用缺省的GCV法,就可以把核估计图
附加到散点图上。本例得到的核估计曲线与回归直线、样条曲线有一定差别。可以手动调整
光滑系数
的值,可以看到,当 过大时曲线不仅变光滑而且越来越变水平,因为这时的拟合值基本是
一个常数,这与样条曲线的情形不同,样条曲线当 增大时曲线变光滑但不趋向与常数(水
平线)。
局部多项式估计(Loess)是另一种非参数回归的曲线拟合方法。它在每一自变量值处拟合
一个局部多项式,可以是零阶、一阶、二阶,零阶时与核估计相同。SAS/INSIGHT缺省使用
一阶(线性)局部多项式。改变Loess的系数alpha可以改变曲线的光滑度。alpha增大时曲
线变光滑,而且使
用一阶或二阶多项式时曲线不会同时变水平。
固定带宽的局部多项式是另一种局部多项式拟合方法。它有一个光滑系数c。
4.2.2 用SAS/INSIGHT进行线性回归分析
上面我们已经看到,用菜单"Analyze | Fit (Y X)"就可以拟合一条回归直线,这是对回归
方程
的估计结果。这样的线性回归可以推广到一个因变量、多个自变量的情况。线性模型写成矩
阵形式为
其中 为 向量, 为 矩阵,一般第一列元素全是1,代表截距项。 为 未知参数向量, 为
随机误差向量,元素独立且方差为相等的 (未知)。正常情况下,系数的估计为 ,拟合值
(或称预报值)为 ,其中 是 空间内向 的列张成的线性空间
投影的投影算子矩阵,叫做"帽子"矩阵。拟合残差为 ,残差平方和为 ,误差项方差的估计
为(要求设计阵 满秩)均方误差(MSE) ,在线性模型的假设下,若设计阵 满秩, 和 分
别是 和 的无偏估计,系数估计的方差阵
。判断回归结果优劣的一个重要指标为复相关系数平方(决定系数) (其中 ),它代表在
因变量的变差中用模型能够解释的部分的比例,所以 越大说明模型越好。
例如,我们在"Fit (Y X)"的选择变量窗口选Y变量(因变量)为体重(WEIGHT),选X变量
(自变量)为身高(HEIGHT)和年龄(AGE),则可以得到体重对身高、年龄的线性回归结
果。下面对基本结果进行说明。
回归基本模型:
WEIGHT = HEIGHT AGE
Response Distribution: Normal
Link Function: Identity
回归模型方程:
Model Equation
WEIGHT = - 141.2238 + 3.5970 HEIGHT + 1.2784 AGE
拟合概况:
Summary of Fit
Mean of Response 100.0263 R-Square 0.7729
Root MSE 11.5111 Adj R-Sq 0.7445
其中Mean of Response为因变量(Response)的均值,Root MSE叫做根均方误差,是均方误
差的平方根,R-Square即复相关系数平方,Adj R-Sq为修正的复相关系数平方,其公式为
,其中 当有截距项时取1,否则取0,这个公式考虑到了自变量个数 的多少对拟合的影响,
原来的
随着自变量个数的增加总会增大,而修正的 则因为 对它有一个单调减的影响所以 增大时
修正的 不一定增大,便于不同自变量个数的模型的比较。
方差分析表:
Analysis of Variance
Source DF Sum of Squares Mean Square F Stat Prob > F
Model 2 7215.6371 3607.8186 27.2275 0.0001
Error 16 2120.0997 132.5062 . .
C Total 18 9335.7368 . . .
这是关于模型是否成立的最重要的检验。它检验的是 :模型中所有斜率项系数都等于零,
这等价于说自变量的线性组合对因变量没有解释作用。它依据的是一个标准的方差分解,把
因变量的总离差平方和(C
Total)分解为能用模型解释的部分(Model)与不能被模型解释的部分(随机误差,Error
)之和,如果能解释的部分占的比例大就否定 。F统计量(F Stat)就是这个比例(用自由
度修正过)。从上面结果看我们这个模型很显著(p值不超过万分之一),所以可以否定 。
第三类检验:
Type III Tests
Source DF Sum of Squares Mean Square F Stat Prob > F
HEIGHT 1 2091.1460 2091.1460 15.7815 0.0011
AGE 1 22.3880 22.3880 0.1690 0.6865
这个表格给出了对各斜率项是否为零( )的检验结果。检验利用的是所谓第三类平方和(T
ype III
SS),又叫偏平方和,它代表在只缺少了本变量的模型中加入本变量导致的模型平方和的增
加量。比如,HEIGHT的第三类平方和即现在的模型平方和减去删除变量HEIGHT的模型的模型
平方和得到的差。第三类平方和与模型中自变量的次序无关,一般也不构成模型平方和的平
方和分解。表中
用F统计量对假设进行了检验,分子是第三类平方和的均方,分母为误差的均方。实际上,
当分子自由度为1时,F统计量即通常的t检验统计量的平方。从表中可见,身高的作用是显
著的,而年龄的作用则不显著,有可能去掉年龄后的模型更好一些。
参数估计及相关统计量:
Parameter Estimates
Variable DF Estimate Std Error T Stat Prob >|T|
INTERCEPT 1 -141.2238 33.3831 -4.2304 0.0006
HEIGHT 1 3.5970 0.9055 3.9726 0.0011
AGE 1 1.2784 3.1101 0.4110 0.6865
Parameter Estimates
Tolerance Var Inflation
. 0.0000
0.3416 2.9276
0.3416 2.9276
图 2 残差对预测值散点图
对截距项系数和各斜率项系数,给出了自由度(DF),估计值(Estimate),估计的标准误
差(Std Error),检验系数为零的t统计量,t统计量的p值,检验共线性的容许度(Tolera
nce)和方差膨胀因子(Var Inflation)。其中自变量 的容许度定义为1减去
对其它自变量的复相关系数平方,因此容许度越小(接近0),说明 对其它自变量的复相关
系数平方大,即 可以很好地被其它自变量的线性组合近似,这样 在模型中的作用不大。记
,则 , 叫做方差膨胀因子,它代表
的系数估计的方差的比例系数,显然其值越大说明估计越不准确,也说明 在模型中的作用
不大。方差膨胀因子与容许度互为倒数。
下一个结果为残差对预测值的散点图,用它可以检验残差中有无异常情况,比如非
线性关系、异方差、模型辨识错误、异常值、序列相关等等。此例中各散点较随机地散布在
0线的上下,没有明显的模式,可认为结果是合适的(多余的不显著的变量AGE不反映在残差
图中)。
用Tables菜单可以加入一些其它的统计量。用Graphs菜单可以加入残差的正态概率
图(Residual Normal QQ)和偏杠杆图(Partial Leverage)。
在Vars菜单中可以指定一些变量,这些变量可以加入到数据窗口中。数据窗口的内
容保存在内存中,不自动改写磁盘中的数据集,所以要保存数据窗口的修改结果的话需要用
"File | Save |
Data"命令指定一个用来保存的数据集名。为了了解加入的变量的具体意义,选数据窗口菜
单中的"Data Options",选中"Show Variable Labels"选项。各变量中,Hat Diag为帽子矩
阵的对角线元素(帽子矩阵 恰好是
的),即杠杆率,反映了每个观测的影响大小。Predicted为拟合值(预报值),Linear Pre
dictor为使用线性模型拟合的结果,在线性回归时与Predicted相同。Residual为残差。Res
idual Normal Quantile是残差由小到大排序后对应的标准正态的分位数,第 个残差的正态
分位数用
计算,其中 为标准正态分布函数。Standardized Residual(标准化误差)为残差除以其标
准误差。Studentized Residual(学生化残差)为与标准化残差类似,但计算第 个学生化
残差时预测值和方差估计都是在删除第
个观测后得到的。当学生化残差的值超过2时这个观测有可能是强影响点或异常点。
关于其它的一些诊断统计量请参考帮助菜单的"Extended Help | SAS System Help: Main m
enu | Help for SAS Products | SAS/INSIGHT | Techniques | Multiple Regression",
或《SAS系统:SAS/STAT软件使用手册》第一章和第九章。
在SAS/INSIGHT中,为了保存结果表格,在进行分析之前选中菜单"File | Save | Initial
Tables",这是一个状态开关,选中时输出表格画在分析窗口内的同时显示在输出(Output
)窗口。如果要保存某一个表格,也可以选定此表格(单击表格外框线),然后用菜单"Fil
e | Save |
Tables"。为了保存分析窗口的图形,先选定此图形,然后选"File | Save | Graphics Fil
e",输入一个文件名,选择一种文件类型如BMP即可。为了打印某一表格或图形,先选定它
,然后用菜单"File | Print"。选中"File | Save | Statments"可以开始保存SAS/INSIGH
T语句。
4.2.3 用SAS/INSIGHT拟合广义线性模型
经典线性回归理论的估计与假设检验要求自变量 为常数(非随机),随机误差项满足 。广
义线性模型放宽了这些假设,其模型为
其中因变量 ( 向量)的元素为服从指数族分布(如正态、逆高斯、伽马、泊松、二项分布
)的随机变量, ( 向量)的元素为与 分布类型相同的随机误差项,元素之间相互独立,
单调函数 叫做联系函数,它把因变量的均值 与自变量 ( 阵)的线性组合联系起来。 (
向量)为回归系数。模型中每个自变量对应于设计阵 中的一列或几列, 的第一列一般元素
全为1,对应于截距项。 ( 向量)是表示偏移量的变量。
注:随机变量Y称为服从指数族分布,如果其分布密度(概率函数)有如下形式:
其中 为自然参数或称经典参数, 为分散度参数(与尺度参数相关),a, b, c为确定的函
数函数。这样的自变量Y的均值和方差与参数的关系如下:
图 3 模型选择对话框
为了使用SAS/INSIGHT拟合广义线性模型,在选"Analyze | Fit (Y X)"之后,选定
因变量和自变量,然后按"Method"按钮,出现选择模型的对话框,在这里可以选因变量的分
布类型(Response Dist.),选联系函数,选估计尺度参数的方法。
各联系函数定义如下:
Identity 恒等变换
Log 自然对数
Logit
Probit ,其中 为标准正态分布函数
Comp. Log-Log
Power , 在对话框的Power输入框指定。
对指数族中每一个因变量分布有一个特定的联系函数,使得
,这样的联系函数叫经典(canonical)联系函数。正态分布的经典联系函数为恒等变换,
逆高斯分布为-2次方变换,伽玛分布为-1次方变换,泊松分布为对数变换,二项分布为逻辑
变换(Logit)。注意Logit、probit、复合重对数变换都只适用于二项分布。
例如,SASUSER.INGOTS中存放了一个铸造厂的数据,它记录了各批铸件在一定的加热、浸泡
时间条件下出现的不能开始轧制的铸件数目。HEAT为加热时间,SOAK为浸泡时间,N为每批
铸件的件数,R为加热浸泡后N件铸件中还不能开始轧制的铸件数。R应该服从二项分布,其
分布参数(比例)
可能受加热、浸泡时间的影响。因此,我们拟合以R为因变量,以HEAT和SOAK为自变量的广
义线性模型,因变量分布为二项分布,使用经典联系函数(Logit函数)。模型为
为了拟合这样的模型,选"Analyze | Fit(Y
X)",选R为Y变量,选HEAT和SOAK为自变量,按"Method"钮,选因变量分布为二项分布(Bin
omial),选变量N然后按"Binomial"钮,两次OK后即可以得到模型拟合窗口。可以看到,这
个模型是显著的,但变量SOAK没有显著影响。去掉变量SOAK重新拟合模型。可以看出,HEA
T的系数为0.0807
是正数,说明加热时间越长不能轧制的件数越多。考察拟合结果窗口下方的残差对预报值图
可以发现在右下方有三个异常点,用刷亮方法选定它们,可以看到,这三个观测都是总共只
有一个铸件的,所以对一般结果意义不大。选"Edit | Observations | Exclude in
Calculation"可以把这几个点排除在外,发现结果基本不变。
4.2.4 用REG过程进行回归分析
SAS/STAT中提供了几个回归分析过程,包括REG(回归)、RSREG(二次响应面回归)、ORTH
OREG(病态数据回归)、NLIN(非线性回归)、TRANSREG(变换回归)、CALIS(线性结构
方程和路径分析)、GLM(一般线性模型)、GENMOD(广义 试样。我们希望知道这五种牌?
胶合板的 损量?
形 显著差别,如果无显著差别我们在选购?就不必考虑哪一个更耐磨而只需考虑价格等因?
,但如果结果有显著差异则应考虑使用耐磨性好的牌子。这里,因素是胶合板的牌子,指?
为磨损量,当各种牌子胶合板磨损量有显著差异时,?明因素的取值对指标有显著的影响?
所以,方差分?
的结论是因素对指标?无显著影响。注意,经典的方差分析只判断因素的各水平有?显著?
异,而不管两个因素之间是否有差异,比如说我们的五个牌子即使有四个牌子没?显著差?
,只有一个牌子的胶合板比这?个牌子的都好,结论也是说因素是显著的,或因素的各水?
间有显著差异?
?
方差分析把指标的方差分解为由因素的不同取值能够解释的部分,和剩余的不能解释的部分
,然后比较两部分,当能因素解释的部分明显大于剩余的部分时认为因素是显著的。方差分
析假定观测是彼此独立的,观测为正态分布的样本,由因素各水平分成的各组的方差相等。
在这些假定满足
时,就可以用ANOVA过程来进行方差分析。其一般写法为
PROC ANOVA DATA=数据集;
CLASS 因素;
MODEL 指标=因素;
RUN;
比如,为了分析SASUSER.VENEER中各种牌子的胶合板的耐磨性有无显著差别,首先我们假定
假设检验使用的检验水平为0.05,可以使用如下程序进行方差分析:
proc anova data=sasuser.veneer;
class brand;
model wear=brand;
run;
结果如下:
Analysis of Variance Procedure
Class Level Information
Class Levels Values
BRAND 5 ACME AJAX CHAMP TUFFY XTRA
Number of observations in data set = 20
Dependent Variable: WEAR Amount of material worn away
Source DF Sum of Squares Mean Square F Value Pr
> F
Model 4 0.61700000 0.15425000 7.40 0.
0017
Error 15 0.31250000 0.02083333
Corrected Total 19 0.92950000
R-Square C.V. Root MSE WEAR
Mean
0.663798 6.155120 0.14433757 2.3450
0000
Source DF Anova SS Mean Square F Value Pr
> F
BRAND 4 0.61700000 0.15425000 7.40 0.
0017
结果可以分为四个部分,第一部分是因素水平的信息,我们看到因素只有一个BRAND,它有
5个水平,分别是ACME、AJAX、CHAMP、TUFFY、XTRA。共有20个观测。第二部分就是经典的
方差分析表,表前面指明了因变量(指标)为WEAR,第一列"来源"说明方差的来源,是模型
的(可以用方差分
析模型解释的),误差的(不能用模型解释的),还是总和。第三列为平方和,其大小代表
了各方差来源作用的大小。第二列为自由度。第四列为均方,即平方和除以自由度。第五列
F值是F统计量的值,其计算公式为模型均方除以误差均方,用来检验模型的显著性,如果不
显著说明模型对
指标的变化没有解释能力。第六列是F统计量的p值。由于这里p值小于0.05(我们的检验水
平),所以模型是显著的,因素对指标有显著影响。结果的第三部分是一些与模型有关的简
单统计量,第一个是复相关系0.005就可以保证总错误率不超过0.05,但是,这样得到的实
际总第一类错误率
可能要比预定的水平小得多。在MEANS语句中使用BON语句可以执行Bonferroni t检验,缺省
总错误率控制水平为0.05。对上面的胶合板数据增加如下语句:
means brand / bon;
run;
结果如下:
Bonferroni (Dunn) T tests for variable: WEAR
NOTE: This test controls the type I experimentwise error rate, but
generally has a higher type II error rate than REGWQ.
Alpha= 0.05 df= 15 MSE= 0.020833
Critical Value of T= 3.29
Minimum Significant Difference= 0.3354
Means with the same letter are not significantly different.
Bon Grouping Mean N BRAND
A 2.6000 4 TUFFY
A
B A 2.3750 4 XTRA
B A
B A 2.3750 4 CHAMP
B A
B A 2.3250 4 ACME
B
B 2.0500 4 AJAX
结果先说明了检验类型和指标(变量WEAR),然后说明了检验控制总第一类错误率,但一般
比REGWQ方法的第二类错误概率高(检验功效较低)。下面给出了几个检验用的值。最后给
出了Bonferroni
t检验的结果,有相同分组字母的因素水平间无显著差异,否则有显著差异。我们看到,TUF
FY与XTRA、CHAMP、ACME没有显著差异,与AJAX有显著差异;XTRA、CHAMP、ACME两两之间没
有显著差异,而且与其它两个也都没有显著差异;AJAX与TUFFY有显著差异,与其它三个没
有显著差异。其
分组是有交叉的。
三、用REGWQ检验控制总错误率
用Bonferroni t检验控制总错误率过于保守,功效较低,不易发现实际存在的显著
差异。REGWQ方法可以控制总错误率并且一般比Bonferroni
t检验要好。这种方法执行多阶段的检验,它对因素水平的各种子集进行检验。在MEANS语句
中用REGWQ选项可以进行REGWQ检验。例如,在前面的例子后再运行
means brand/ regwq;
run;
结果如下
Ryan-Einot-Gabriel-Welsch Multiple Range Test for variable: WEAR
NOTE: This test controls the type I experimentwise error rate.
Alpha= 0.05 df= 15 MSE= 0.020833
Number of Means 2 3 4 5
Critical Range 0.264828 0.2917322 0.2941581 0.31516
Means with the same letter are not significantly different.
REGWQ Grouping Mean N BRAND
A 2.6000 4 TUFFY
A
A 2.3750 4 XTRA
A
A 2.3750 4 CHAMP
A
A 2.3250 4 ACME
B 2.0500 4 AJAX
可见它比Bonferroni方法发现了较多的显著差异,除了TUFFY和AJAX仍有显著差异以外,还
发现XTRA、CHAMP、ACME也都与AJAX有显著差异。
MEANS语句的选项可以同时使用。在MEANS语句中可以用ALPHA=水平值来指定检验的
水平。ANOVA过程中还提供了其它的多重比较方法,请自己参考有关资料。
练习
1.下面是一组草原隼的鸟巢高度的数据,试检验其分布是否正态。
15 3.5 3.5 7 1 7 5.75 27 15 8 4.75 7.5 4.25 6.25 5.75 5 8.5
9 6.25 5.5 4 7.5 8.75 6.5 4 5.25 3 12 3.75 4.75 6.25 3.25 2.5
2.有若干人参加了一个减 识 炼,在一年后测量了他们的身体脂肪含量,结果如下(身体
脂肪含量的百分数):
男性组:13.3 19 20 8 18 22 20 31 21 12 16 12 24
女性组:22 26 16 12 21.7 23.2 21 28 30 23
比较这些人中男性和女性的身体脂肪含量有无显著差异。
3.下表为某基础统计课程两次考试的学生成绩。两次考试考同样的知识。试比较这两次考
试难易程度有无显著差异。
学号 1 2 3 4 5 6 7 8 9
10
第一次 93 88 89 88 67 89 83 94 89
55
第二次 98 74 67 92 83 90 74 97 96
81
学号 11 12 13 14 15 16 17 18 19
20
第一次 88 91 85 70 90 90 94 67 87
83
第二次 83 94 89 78 96 93 81 81 93
91
4.为研究 菌酶水平在患胃溃疡的病人与正常人之间有无显著差异,测量了一组病人和一
组正常人的 菌酶水平,结果见下表。是检验两者的 菌酶水平有?显著差异(水平0.05)
。
胃溃疡病人组:0.2 10.4 0.3 10.9 0.4 11.3 1.1 12.4 2.0 16.2 2.1 17.6
3.3 18.9 3.8 20.7 4.5 24.0 4.8 25.4 4.9 40.0 5.0 42.2 5.3 50.0 7.5
60.0 9.8
对照组:0.2 5.4 0.3 5.7 0.4 5.8 0.7 7.5 1.2 8.7 1.5 8.8 1.5 9.1 1.
9 10.3 2.0 15.6 2.4 16.1 2.5 16.5 2.8 16.7 3.6 20.0 4.8 20.7 4.8
33.0
提示:要考虑分布是否正态。
5.为了考察两种测量萘含量的液体层析方法:标准方法和高压方法的测量结果有无显著差
异,取了10份试样,每份分为两半,一半用标准方法测量,一半用高压方法测量,每个试样
的两个结果如下表,试检验这两种化验方法有无显著差异(水平0.05):
标准 14.7 14.0 12.9 16.2 10.2 12.4 12.0 14.8 11.8
9.7
高压 12.1 10.9 13.1 14.5 9.6 11.2 9.8 13.7 12.0
9.1
6.使用放射性金195作示踪元素注射到血液中,下表为注射x天后血液内残留的金元素百分
比y,取了10个血样,对数据分别拟合线性回归、负指数关系 ,并使用各种非参数曲线拟合
方法拟合曲线。比较各结果。
x 1 1 2 2 2 3 5 6 6
7
y 94.5 86.4 71 80.5 81.4 67.4 49.3 46.8 42.3
36.6
7.对数据集SASUSER.GPA中的大学学科平均成绩GPA建模,用高中成绩HSM、HSS、HSE作为自
变量。简述回归的结果。试改进模型。使用SAS/INSIGHT和REG过程两种办法。
-- |
| rebeccazmc | 2005-8-22 11:07 |
|
| 对头,我也需要这个,有没有软件和注册码的下载啊? |
Powered by Discuz! Archiver 4.1.0
© 2001-2006 Comsenz Inc.
Processed in 0.012518 second(s), 2 queries |