标签:aaa   name   s函数   十分钟   大小写   属性   编程实践   指定   高级语言   
 
http://web5.pku.edu.cn/pucssr/SASbiancheng.pdf 
 
 
 
 
简明SAS教程
by LongFei 
version:0.11
SAS 统计软件
 
前言
简明致敬郇爷,细节留作习题。(雾)
本教程的内容主要是SAS的简单基本知识和SAS在多元统计分析中的应用。 
侧重在SAS的应用,会介绍如何根据SAS的输出结果得到结论,但不会深入讲解其中的统计原理。 
在每一章的开始,会简要概括本章内容和学习目标,以帮助同学们有针对性地进行学习。
代码讲解将由一条条的statement讲解来构成。
 
作者的话
这篇文章是为了整理自己最近复习SAS的心得笔记而写,旨在梳理自己的学习内容。
我以前修读多元统计分析课程时,SAS上机作业常常是照着课本和课件做的,对代码的含义一知半解,一旦提交了作业,几乎就会忘掉代码了。如今复习,由于已积累了较多的编程实践经验,对代码的理解也加深了。我把自己的理解写出来,希望能帮助正在或打算学习SAS的同学们。
原本只是打算写一个小教程,但写作过程中有点贪多求全,现在越写越多,只能强行“简明”了。
 
注意事项
本教程使用的SAS版本是9.4,SAS版本最低不低于9.3。
 
快速入门
本章介绍SAS编程的基本概念和逻辑,并写一个简单的示例程序,以期让初学者快速上手SAS编程。
 
学习目标
- 了解DataSet(数据集)、Procedure(过程),Statement和Option(选项)的概念
- 了解SAS程序执行流程和SAS代码基本语法结构。
- 了解简单日志信息的含义
- 写一个Hello World程序
 
基本概念
- DataSet(数据集)
- 一张表,每列代表一个变量,每行代表一个观测。数据集是SAS进行统计分析的基本单位。
- Procedure(过程)
- 简称为proc,SAS集成的各种统计分析功能的总称。可以使用不同的过程来完成不同的分析。
- Statement(语句)
- 
SAS代码,无论分成多少行,都要以一个分号结束,这一条到分号结束的代码,就被称为一个statement或语句,这是SAS执行代码的基本单位。一条条的语句,构成了SAS程序。 
 statement之间是有层次关系的。顶层statement是一个独立执行单元的statement,比如data xxx;,proc print;,run;等等。次级statement则需要依赖于顶层statement——先执行顶层statement,才能执行次级statement,典型的次级statement就是by xx;,input a b;等等。
 次级statement是有使用范围的,需要在正确的顶层statement下才能被SAS执行,他们的主要作用是在细节上控制主statement的行为,在某些过程(proc)中,某些次级statement是必须设置的。比如说在排序过程(sort)里,就不能直接执行proc sort;,而必须在它后面添加by 变量名;来指定用于排序的变量后,才能执行。
 以下示例代码的每一行都是一个statement
 
- data xxx;
-     set a;
- proc print data=xxx;
- run;
 
- Option(选项)
- 选项是指写在statement语句后,分号前,以空格间隔的一系列单词或等式,比如noprint,data=xxx等。它们通常不是必要的,但能控制statement的宏观行为如:指定用于分析的数据集,不输出结果,指定绘制直方的数量等等。
 顶层statement和次级statement的option写法稍有不同。顶层statement的option是接空格如proc procname data=xxx noprint;,而次级statement是接/如histogram RM/normal nmidpoints=12;
 
程序编写流程
 
dataprocrun
- data
- 代码以data作为标识符起头,称为data步(数据步)。数据步的作用是建立数据集,进行数据的读取和修改,后续可以提供给过程步进行统计分析。SAS提供了强大的数据输入功能,能够把各种格式的数据输入到SAS中。此外,还能在数据输入的过程中进行计算,生成新的数据列,甚至能处理缺失数据,功能十分强大。
- proc
- 代码以proc起头,称为proc步(过程步)。过程对指定的数据集进行统计分析。SAS提供了丰富多样的统计分析功能,还有各种选项可供细化。
- run
- 写下一个run;,就可以让SAS在读取到这一步时,运行前面的所有语句。如果没有这一条,则代码只是被SAS读取了,但不会运行。
我们编写SAS程序,正是按照上述的运行过程来做的: 
1. data步——获取和整理数据 
2. 写proc步——分析数据 
3. 提交代码给SAS,得到output——输出分析结果
 
程序执行流程
 
提交代码逐条读取语句读取run后运行并输出继续读读完代码
在提交代码后,SAS会逐条读入statement。当读到run;这条statement时,SAS就会执行前面的所有statement,输出分析结果。如果我们的SAS程序中没有run;语句,则程序会处于持续运行状态,但不会执行前面读取到的statement。 
有些proc步的statement是持续性的,会阻止下一个proc的执行。这时就需要加一句quit;来终止该proc步。这是后话,待到用时再说。
在SAS 9.3以后,在默认设置下,proc步的分析结果会被输出到一个html文件上,这个html文件会被SAS用结果浏览器打开。如果不喜欢这种方式,可以使用ODS(Output Delivery System 输出交付系统)来改变输出方式和样式。这在后续的章节中会讲到。
 
基本语法
当初我学习的时候没有特别考究过SAS的语法,老师也没有强调,导致我常常需要记忆整段的代码来解决某个具体问题。这种学习方式效率十分低下,也缺乏拓展性——问题要求稍微变化一点就没辙了。 
事实上,SAS的代码虽然语法简单而选项繁多,但也有基本的编程语法结构。了解语法结构,能让我们在记忆时更有针对性,更容易理解代码含义,从而提高我们解决相似问题的能力。
从上一节的SAS运行过程可以看出,要编写一个SAS程序,就需要编写data步和proc步的代码,它们有着相似的语法结构。编写完成之后,再写一行run;让程序执行statement即可。
- Data步
- 
Data步以data作为开头标识,空格后接自行设定的数据集名,生成一个数据集。下面接上各种statement描述如何处理这个数据集。Data步有自己的次级statement语句,只可在data步中使用。 
 一个完整data步的语法结构如下,以<>括起来的部分都是可选的,不必严格遵守下面的顺序:
 
- DATA datasetname;/* 设定数据集名 */
-     <code that defines the variables in the data set>;/* 定义数据集的变量 */
-     <code to enter data>;/* 输入数据 */
-     <code to create new variables>;/* 创建新变量 */
-     <code to assign missing values>;/* 设定缺失值 */
-     <code to output data>;/* 设定输出的数据集 */
-     <code to assign labels to variables>;/* 设定变量的标签 */
-     <and other data tasks>;/* 其它数据任务 */
 
- Proc步
- 
Proc步以proc 作为开头标识,空格后接SAS过程名,再一个空格后接该过程的选项,最后仍以分号结束。分号后面接上多句次级statement,。同data步一样,proc有自己的次级statement语句。不过每一个过程的次级statement语句都不一样,有些能通用,有些则不能,有些还是必写的,需要具体问题具体分析。一般的语法结构如下,: 
- proc procname <options>;/* 启动过程步 对数据进行统计分析 */
-     <statements>/<options>;/* 次级statement,如果要添加选项,必须加/隔开 */
 
- run和quit
- run;和- quit都是一条statement语句,而且是不依赖于data步和proc步的statement。
 当SAS执行了- run;时,它就会把前面读取到的所有data步或proc步的statement都执行完。如果一个程序里没有- run;,那么这个程序在提交后也不会被执行。
 当SAS执行了- quit;时,它就会把某些会持续运行,占用SAS资源的的proc停掉,让SAS能够执行后面的proc。
- 大小写问题
- 在SAS中,各种statement的关键字,如data,proc等,都是不区分大小写的。不过,在字符串中,则会区分大小写。
学习心得: 
“做中学”是以实际问题驱动学习的方式,这在编程语言的学习中非常高效。我认为这一方式同样适用于SAS的编程学习。在学习中应当多多实践,尽可能完成课本的所有练习,加深对SAS代码的理解。 
对data步,重要的是掌握它的次级statement操作,包括创建、读取、修改、删除、输出等等。处理数据是统计分析的开始,也是重要的一步。在多元统计分析的学习中,我们更关注统计分析的实践。练习中使用的数据一般都是处理好了的标准数据,可以直接使用。不过,在工作中可能会遇到各种各样的数据,有很多可能会有缺失值,如果想要在SAS的使用上更进一步,就一定要对data步有更多的了解。 
对proc步,则需要按不同的过程,逐个学习。对有些功能相似的过程,可以先学习其中一个过程,然后对比另一个过程,进行迁移学习。 
在学习一个过程时,我喜欢首先了解它的应用背景,也就是了解它是用来做什么的。然后学习它常用的statement,知道如何从细节上控制分析过程。做到这一步就足够完成一些基本的统计分析了。但有时候有一些特殊需求,比如不输出分析结果,或者画直方图时顺带画出正态分布曲线,这就需要设置可选项了,这时候再去了解这个过程的可选项,以及相应的某些核心的statement的可选项即可。
 
日志(Log)
在向SAS提交代码之后,务必检查日志里的内容,确认程序的执行情况。特别是需要关注错误和警告。
- 错误
- 红色的字表示错误(error),说明代码出错了,会导致程序在停止在SAS所提示的出错行,不再继续往下执行代码。
- 警告
- 绿色的字表示警告(warning),说明当前提示的这句代码可能有问题,有可能会让你得不到预期的结果,但程序还是能继续运行下去。
学会阅读日志能帮助快速地排除小BUG,避免不必要的时间浪费。 
日志默认是打开的,如果没有打开,或者不小心关掉了。可以手动打开:菜单栏-->视图-->日志
 
Hello World
将以下代码复制到SAS的代码编辑器里并提交
 
- data hellodata;
-     input ISay $ 1-20;
-     datalines;
-     Hello World One
-     Hello World Two
-     Hello World Three
-     ;
- proc print;
- run;
会得到以下输出:
| Obs | ISay | 
|---|
| 1 | Hello World One | 
| 2 | Hello World Two | 
| 3 | Hello World Thre | 
 
数据输入和储存
本章介绍SAS的数据集的基本知识和data步中的数据输入方法。
 
学习目标
- 了解SAS数据集类型、结构和变量数据类型
- 掌握input的使用方法,能够精细地设定数据输入格式
- 掌握infile的使用方法,能够导入数据文件
- 掌握datalines的使用方法,能够手动输入数据
 
SAS数据集基本知识
 
数据集类型
数据集分为临时数据集和持久数据集两种类型。
- 临时数据集
- 数据集名是一个single name,也就是简单的名字,如:data example;,data dec2016等。临时数据集的数据,会暂时储存在SAS程序里,但一旦关掉SAS,就会被销毁,想要重新使用数据的话,就需要再次提交输入数据的代码。
- 持久数据集
- 数据集名则是一个two-part name,也就是用一个.连接的复合名字,如:data research.2016,data MyData.0001等。这个复合名字的前半部分是SAS的 library(逻辑库)名,后半部分是数据集名。这样的数据集会以文件的形式被储存到硬盘上,具体的位置是library指定的路径。即使关掉了SAS,下次再打开,只需要分配逻辑库名,就能直接使用,无需再次提交数据输入的代码。
实际上,临时数据集在SAS中也是存在library里的。这个library的名字叫work。每次关闭SAS时,系统会自动销毁这个library里的数据。 
在数据量比较小,数据输入耗时可忍受(几秒钟)的情况下,两种数据集没有什么使用上的差别。但一旦数据规模扩大到输入耗时几十分钟甚至几十个小时的时候,持久数据集就要优于临时数据集了。 
一般来说,实验可以使用临时数据集,做实际工作则应该使用持久数据集。
 
- /*  Ex 2.1 临时数据集和持久数据集的区别 */
- /* 临时数据集实例 
-     每一次重新打开SAS,要运行代码中的proc步,就必须先提交data步。
- */
- data tempdata;/* 输入数据集 */
-     input t @@;
-     datalines;
-     1 2 3 4
-     ;
- proc print data=tempdata;/* 打印数据集 */
- run;
- /*  持久数据集实例 
-     只有第一次需要提交全部的代码,之后数据集就会被以文件形式储存在MyData库中。之后要使用,只需要执行第一句分配逻辑库名,就可以直接提交proc步,而无需再次提交data步输入数据。
- */
- libname MyData "D:\MyData";/* 分配逻辑库名 */
- data MyData.tempdata;/* 输入数据集 */
-     input t @@;
-     datalines;
-     1 2 3 4
-     ;
- proc print data=MyData.tempdata;/* 打印数据集 */
- run;
如果知道数据集文件的储存路径,还可以直接用文件路径名调用。比如,假设文件`D:\MyData目录下有一个名为tempdata的SAS数据集文件,我们可以直接使用:
- proc print data="D:\MyData\tempdata";
- run;
但是,不建议使用。
 
数据集的结构
数据集的结构就是一张表,每一列表示一个变量,每一行表示一个观测。以下是一个典型的SAS数据集 
在第一行中,第一列的Obs表示观测的序号,后面的a b c分别是变量名
| Obs | a | b | c | 
|---|
| 1 | 1 | 2 | 3 | 
| 2 | 4 | 5 | 6 | 
| 3 | 7 | 8 | 9 | 
 
变量命名规则
SAS允许为变量自由命名,但存在一些规则:
- 可以设定长度为1-32的任意字母、数字或下划线,不能包含空格。
- 必须以字母或下划线开头
- 不区分大小写
- 最好具有描述性(就是说能从变量名看出这个变量的含义,少用诸如a,b,c这样无语义的变量名),这项规则是可选的,但建议尽量遵守。
一些正确的变量名: 
GENDER AGE_IN_1999 AGEin1999 _OUTCOME_HEIGHT_IN_CM WT_IN_LBS 
一些错误的变量名: 
AGE IN 2000 2000MeaslesCount S S Number Question 5 WEIGHT IN KG AGE-In-2000
 
变量数据类型
- 学习过编程语言的同学都知道,在编程语言中,变量的数据类型是很重要的。在SAS中,虽然没有明确指出,但实际上也是存在不同的数据类型的,分别如下:
- Numberic
- 数字型变量,也是SAS的默认变量类型。决定一个变量是不是数字型,只需要看它在逻辑上是否可以进行运算,如身高、体重之类,就可以用于计算,ID号、电话号码之类,不可用于计算,所以前两者是数字型变量,后两者不是。这种变量类型会自动忽略掉高位的0,如果你把ID号设置为数字类型,那么00012就会变成12。
- Character
- 字符型变量,也包括Text(文本)或String(字符串)。这种类型的变量不能用于运算,并且会区分大小写。如果你对性别变量分组,那么M和m会被分成不同的组。SAS默认会把数据看成数字型变量,所以必须要手动把诸如ID号之类的数字形式的变量设置成字符型变量。
- Date
- 日期型变量。要输入SAS的数据集中的日期变量可能会有多种多样的格式,比如10/15/09、01/05/2010或JAN052010等等。在后面会看到如何处理这多种多样的日期格式数据,并把他们转化为SAS能够用于分析的数据。实际上,在SAS数据集中储存的日期型变量数据是用整数表示的,这能很方便地进行数据操作。
 
变量数据类型实例程序
 
- /*  Ex 2.2 变量数据类型实例程序 */
- data vartypes;
-     input id_num id_char $ weight_num @18 birth_date MMDDYY10.;/* 输入4个变量,分别是id_num(默认-数字型) id_char(字符型) weight_num(默认-数字型) birth_date(日期型,格式为:月/日/年) */
-     datalines;
-     0001 0001 60 03/07/2016
-     0002 0002 50 04/02/2016
-     0003 0003 30 12/31/2016
-     0004 0004 45 04/12/2016
-     0005 0005 49 04/07/2016
-     ;
- proc print data = vartypes;
- run;
打印的结果如下:
| Obs | id_num | id_char | weight_num | birth_date | 
|---|
| 1 | 1 | 0001 | 60 | 20520 | 
| 2 | 2 | 0002 | 50 | 20546 | 
| 3 | 3 | 0003 | 30 | 20819 | 
| 4 | 4 | 0004 | 45 | 20556 | 
| 5 | 5 | 0005 | 49 | 20551 | 
可以看到id_num的0被去掉了,而birth_date变成了整数形式
 
数据的输入
数据的输入分为两步:首先,从外部文件或流式数据(in-stream data,可以简单地理解为直接嵌在代码里的数据)中读取原始数据,然后是将原始数据转化为SAS使用的标准数据集,需要设定一定的转化规则。 
SAS提供的数据输入功能十分强大,但是实际用到的不多,只讲简单实用的部分即可。
 
读取原始数据
- 外部文件
- 使用infile语句进行读取。格式为 infile filepath;。可以后接选项词做进一步的输入控制。常用的有DLM,用于指定分隔符;FIRSTOBS,用于指定从哪一行开始读数据;OBS指定到哪一行结束读取。
 infile "D:\MyData\MyCSV.csv" DLM=‘,‘ FIRSTOBS=2 OBS=10表明从D:\MyData\MyCSV.csv中读取数据,分割符为逗号,从第2行开始读,第10行结束。
- 流式数据
- 以datalines;开头,换行之后就可以写数据了,到最后换行,以一个分号结束即可。
 如果要写入的数据中有分号,则可以以dalines4;开头,最后结尾换成三个分号。不要使用cards,这是很老旧的用法了,现在的datalines;完全可以替代cards;的作用
 
input语句用于设定如何将各种格式的数据转化成SAS使用的标准数据集。
 
设定转化规则
读入了原始数据之后,需要设定转化规则,用数学说原始数据集到SAS数据集的映射,把原始数据转化成标准的SAS数据集。SAS提供了多种多样的方法来确定转化规则,但一般来说,我们只需要使用input语句来设定规则就足够了。 
input语句的通用的语法为:input <specification(s)> <@ | @@>; 
specification(s)表示一个或多个特殊的表述,内容可以包括变量,以圆括号括起来的变量列表,$符号,指针控制,列控制,格式化标识等等,非常复杂,具体可以通过SAS的官方帮助手册里查input Statement进行了解。下面列举最常用的几种输入格式,能够解决绝大多数的输入问题。它们之间可以互相混合使用以完成最佳输入。
 
Freeform List Input(自由输入)是最简单也是最常用的。只需要设置变量列表,以及指定某些变量为字符类型即可,SAS会自动读取数据,数据之间以空格作为间隔符。
通用语法:input variable <$> ; 
variable为变量名,$是可选项,表明指定它前面的变量为字符类型。这最简单的语法,在大多数时候已经能满足学习中的数据需要了。这主要用于以作为空格间隔的原始数据。
 
- /*  Ex 2.3 Freeform List Input  */
- data test;
-     input x $ y z;       /* x后接一个$,表明x是字符型变量,不省略高位的0 */
-     datalines;
- 001 2 3
- 004 5 6
- 007 8 9
- ;
- proc print;
- run;
输出结果:
| Obs | x | y | z | 
|---|
| 1 | 001 | 2 | 3 | 
| 2 | 004 | 5 | 6 | 
| 3 | 007 | 8 | 9 | 
 
Compact Data Format(紧凑输入)也是非常常用的,比起自由输入,只是增加了末尾用于控制数据输入指针的符号。 
通用语法:input variable <@|@@>; 
<@ | @@>表示可以写@或@@或不写,这决定着读取数据的指针的行为。 
- 不写:指针立刻换行 
- @:指针暂不换行,直到下一个input或一轮循环结束。 
- @@:指针不换行。循环结束也不换行。 
紧凑输入指的是末尾添加@@符号的写法,这可以让SAS连续地读取所有的数据。
 
- /*  Ex 2.4 Compact Data Format-input中@数量的区别  */
- data test;
-     input x @;       /*单个@,暂时不换行,直到下一个input或一轮循环结束 */
-     input y;           /*没有@,下一个input语句会去读新的一行*/
-     input z @@;    /*两个@,下一个input不换行,直接从下一个数据开始读*/
-     datalines;
- 1 2 3
- 4 5 6
- 7
- ;
- proc print;
- run;
输出结果:
 
Column Input(列输入)是以列控制指针来控制输入的,可以以精确到具体列的形式进行数据的读取。 
基本语法:input variable <$> startcol<-endcol> ...; 
<$>正是前面说的字符类型控制符。startcol指明从哪一行开始读,<-endcol>是可选项,指明到哪一行读取结束,不写的话,就默认取starcol的值。
 
- /* Ex 2.5 Column Input 列输入 */
- data MyData;
-     input ID $ 1-3 SBP 4-6 DBP 7-9 GENDER $ 10 AGE 11-12 WT 13-15;
-     datalines;
- 001120 80M15115
- 002130 70F25180
- 003140100M89170
- 004120 80F30150
- 005125 80F20110
- ;
- run;
输出结果
| Obs | ID | SBP | DBP | GENDER | AGE | WT | 
|---|
| 1 | 001 | 120 | 80 | M | 15 | 1 | 
| 2 | 002 | 130 | 70 | F | 25 | 1 | 
| 3 | 003 | 140 | 100 | M | 89 | 1 | 
| 4 | 004 | 120 | 80 | F | 30 | 1 | 
| 5 | 005 | 125 | 80 | F | 20 | 1 | 
 
Formatted Input(格式化输入)是用于将特殊的数据格式转化为SAS可识别的数据类型的,比如日期或者带小数点的数字。 
通用语法:input formated-vars ; 
formated-vars指的是格式化变量,标准格式是:col-pointer variable informat 
其中,col-pointer指明从第几列开始读取数据,用@n来表示,n为指定开始读取的列,variable指出变量名,informat指出输入的格式,所有的informat都必须以点号.或点号.后接1个数字的形式作结尾,具体格式表如下:
informat输入格式表
| Informat | Meaning | 
|---|
| n. | n 列数据,数字类型 | 
| $n. | n列数据,字符类型,移除头部的空格 | 
| $CHARn. | n列数据,字符类型,保留头部的空格 | 
| COMMAn. | n列数据,数字类型,去除小数点或美元符号(比如$40,000会被读取为40000) | 
| COMMAn.m | n列数据,数字类型,其中带有2位小数,去除小数点或美元符号(比如$19,020.22会被读取为19020.22) | 
| MMDDYY8. | 输入日期,形如01/12/16(月-日-年)(注意Y2K问题) | 
| MMDDYY10. | 输入日期,形如04/07/2016(月-日-年) | 
| DATE7. | 输入日期,形如20JUL16(日月年) | 
| DATE9. | 输入日期,形如12JAN2016(日月年) (没有Y2K问题) | 
需要特别说明地是,日期在SAS中是以整数的形式储存的,这样便于进行统计分析。如果需要输出日期的数据,则需要在输出时,特别指出输出格式。
 
- /* Ex 2.6 Formatted Input */
- data MyData;
-     input @1 SBP 3. @4 DBP 3. @7
-     GENDER $1. @8 WT 3. @12 OWE
- 	COMMA9.  @22 InputDate MMDDYY8.;
- 	format InputDate MMDDYY8.; /* 指定InputDate的输出格式,没有这句则会输出整数 */
- /* 列标尺
- ----+----1----+----2----+
- */
- 	datalines;
- 120 80M115 $5,431.00 01/11/16
- 130 70F180 $12,122   01/12/16
- 140100M170 7550 	 01/12/16
- 120 80F150 4,523.2   01/12/16
- 125 80F110 $1000.99  01/12/16
- ;
- proc print data=MyData;
- run;
输出结果
| Obs | SBP | DBP | GENDER | WT | OWE | InputDate | 
|---|
| 1 | 120 | 80 | M | 115 | 5431.00 | 01/11/16 | 
| 2 | 130 | 70 | F | 180 | 12122.00 | 01/12/16 | 
| 3 | 140 | 100 | M | 170 | 7550.00 | 01/12/16 | 
| 4 | 120 | 80 | F | 150 | 4523.20 | 01/12/16 | 
| 5 | 125 | 80 | F | 110 | 1000.99 | 01/12/16 | 
 
判别分析
判别分析的应用场景:对于总体,各自有自己的观测集,现在给出一个样本,需要判断它属于哪一个总体。
根据不同的判别指标和条件,我们可以用不同的衡量方法,来进行不同的判别分析,它们有各自不同的优劣。
 
距离判别
距离无疑是最直观的衡量方法,样本距离哪个总体近,就判它属于哪个总体。 
具体地说,就是利用观测集来估计总体(或总体的某些关键统计量),然后以某种方式来衡量观测与总体的远近程度,然后选择最近的总体。
 
马氏距离
要判断距离,首先得明确计算距离的方法。现在我们希望了解的是给定样本到某个总体的距离。联系欧氏空间,很自然地就想到,这个距离可以定义成到总体的中心的距离,而总体的中心可以用它的均值向量来表示,为了方便计算,我们一般取距离的平方。此外,还要考虑总体的集中程度,越集中的,自然就越高,这个在一元下可以用方差表示,在多元下则是用协差阵来表示。由此想法,我们可以定义样品与总体的马氏距离为 
 
 
对于多个总体,我们只需要比较的大小即可
特别地,在两总体比较中,我们可以定义一个线性函数,从而得到判别准则: 
 
 
 
SAS程序
在SAS中,我们可以使用discrim过程来完成上述的各种判别分析。
通用语法是
 
- proc discrim <options>;
-     class variable;
-     <other statements>;
class variable;是必填的,它决定着要用什么变量来划分类别。然后我们可以根据不同的需求来添加options和statement完成统计分析。
 
马氏距离判别
 
 
 
 
 
 
 
 
 
统计软件SAS使用教程
|   百度空间 | 百度首页   | 登录 
统计软件SAS使用教程 2007-06-16 23:31 
| 第1章SAS系统简介§1.1 SAS发展概况
 SAS(Statistical Analysis System)是一个大型的数据管理与数据统计分析处理的软件包。1966年由美国North Carolina州立大学开始研制,1976年在美国成立了SAS研究所。
 SAS主要用于数据处理和统计分析领域,是一个功能齐全、使用方便灵活。只须要有少量的、简单的语句、写出SAS程序,进行运行,就可以满足拥护要求,一些特殊的计算或处理方式可以通过选项来指定。从而达到且让用户将SAS程序在SAS环境下提高运行,及时了解到程序运行情况及出现的错误,程序可以方便的编辑修改和运行,直到用户得出满意的计算结果。
 目前,SAS已经发展成为一个功能齐全、应用范围广泛、使用灵活方便的数据库管理和数据分析的标准软件系统。其统计分析部分,在数据处理和统计分析领域,被业界和国际上公认为标准软件和最权威的统计软件包。
 SAS应用广泛,其应用范围涉及到理、工、农、林、医、管理、商业、行政事物等各个领域。国际上成立了专门的SAS协会SUGI(SAS User Group International),每年有学术会议讨论研究有关SAS的问题。
 SAS在我国的应用。
 SAS的主要版本。
 §1.2 SAS的结构、功能、特点
 一、SAS结构与功能:
 SAS软件包由多个大的功能模块组成,用户可以根据需要,选择安装部分或全部SAS功能模块来组成一个运行系统。
 SAS系统的核心(基本)部分是SAS/BASE模块,其功能是承担数据管理,管理用户使用环境,进行用户语言的处理,调用其他模块。在SAS/BASE模块的基础上,还可以增加如下不同的模块、从而实现不同的功能。
 ⑴SAS/BASE
 ⑵SAS/STAT
 ⑶SAS/AF
 ⑷SAS/FSP
 ⑸SAS/GRAPH
 ⑹SAS/ETS
 ⑺SAS/IML
 ⑻SAS/OR
 ⑼SAS/QC
 二、SAS的特点:
 l 实用性强、功能完善、使用方便、编程简单、容易学习。
 l 信息存储简单,数据交换接口丰富,可以调用多种格式的数据文件。
 l 语言编程能力强大。
 l 对数据连续处理。
 l 统计分析方法丰富,使用简单。
 l 具有强大的报表输出和绘图功能。
 三、SAS的运行环境:
 l 硬件系统:586计算机
 l 操作系统:Windows95/98/2000
 §1.3 SAS for Windows 的操作入门
 SAS for windows系统的操作界面是标准的图形用户界面,是标准的多文档界面,如同Word、Excel等软件一样,操作使用简单、类似。软件操作可以通过菜单或命令方式完成。
 一、 SAS的安装与启动
 ⒈ SAS的安装:
 ⒉ SAS的启动:
 ⒊ 系统的设置:
 二、 SAS集成环境介绍:
 ⒈ SAS的集成环境:
 ⒉ 程序编辑窗口(Program Edit):
 ⒊ 日志窗口(Log):
 ⒋ 输出窗口(Output):
 ⒌ 其它窗口:
 三、 SAS操作入门:
 ⒈ 程序的编辑:
 ⒉ 程序的运行:
 ⒊ 结果查看:
 ⒋ 有关文件的操作。
 §1.4 SAS/ASSIST简介
 SAS/ASSIST是为初学者学习使用SAS系统提供的一个交互式辅助系统,目的是初学者更容易的掌握SAS的强大功能。
 一、 SAS/ASSIST的启动:
 二、 SAS/ASSIST的操作入门:
 三、 SAS/ASSIST的的学习资料:
 请访问:cie.nwsuaf.edu.cn/apptech/sjm/sas   onload="this.style.overflowX=‘auto‘;">第2章SAS语言的基本概念
 §2.1 SAS语言概述
 SAS提供了一种完善的编程语言。如同大多数计算机高级语言一样,SAS用户只须要熟悉其命令、语句及简单的语法规则就可进行数据管理和分析处理工作。因此,掌握SAS编程技术是学习SAS的关键环节。
 在SAS中,系统具有众多的计算过程,把大部分常用的复杂的数据计算的算法作为标准过程调用,用户仅需要指出过程名及必要的参数即可,这样使得SAS的变成变的十分简单。
 SAS程序是SAS语句的有序集合。以程序的功能将SAS程序划分成多个程序模块(程序段),这些模块分为两类:数据准备模块——数据步(DATA Step)和过程部(PROC Step)。在一个SAS程序中可以有一个或多个数据步与过程步。
 SAS程序的结构和数据流向示意图
 数据步的作用是把数据源中的数据作为输入,经过加工后输出到一个或多个“SAS数据集”。
 过程步是把由数据步建立和产生的数据集中的数据作为输入,调用一个或多个标准过程,经标准过程计算处理后,将结果以清晰的表格或图形方式输出到OUTPUT窗口中或写入磁盘文件。
 简单说:数据步是为过程步准备数据,并将数据放入数据集中;
 过程步是把指定的数据集中的数据计算处理后并输出结果。
 一个简单的SAS程序的如下:
 data student;
 input xh$ xm$ yy gs;
 p=yy gs;
 cards;
 001 aaa 89 91
 002 bbb 70 88
 003 ccc 90 92
 004 ddd 70 87
 005 eee 85 83
 proc print;
 proc means;
 run;
 运行结果如下:
 数据集:
 OBS     XH      XM      YY     GS      P
 1      001     aaa     89     91     180
 2      002     bbb     70     88     158
 3      003     ccc     90     92     182
 4      004     ddd     70     87     157
 5      005     eee     85     83     168
 平均数:
 Variable   N           Mean        Std Dev        Minimum        Maximum
 -------------------------------------------------------------------
 YY         5     80.8000000     10.0349390     70.0000000     90.0000000
 GS         5     88.2000000      3.5637059     83.0000000     92.0000000
 P          5    169.0000000     11.7898261    157.0000000    182.0000000
 §2.2 SAS 常量
 SAS中有多种常量:数值常量,字符常量,日期、时间、日期时间常量。
 ①数值常量:
 数值常量是一个十进制数值,在书写上与数学书写习惯一致。可分为:正负整数、小数和科学记数法。例如:
 数             SAS书写
 -3     -3
 3.12     3.12
 18000000   1.8E6    (大于1032-1必须用科学记数法表示)
 -0.0000125   -1.23E-5
 ②字符常量:
 字符常量是用一对单引号或双引号括起来的一串字符,其长度不超过200个字符。
 ③日期、时间、日期时间常量:
 这三类常量是将其对应的格式化值用单引号括起来,并且后跟类型符来表示的。
 l 日期值(DATE):表示为’ddmmmyy’D或’ddmmmyyyy’D。
 其中dd表示日,mmm表示月份,yy或yyyy表示年份。
 如:’24MAR03’D或24MAR2003’D
 l 时间值(TIME):表示为’hh:mm:ss’T或’hh:mm:ss. ss’T。
 其中hh表示小时,mm表示分钟,ss表示分钟。
 如:’14:30:25’T或’14:30:25. 87’T。
 l 日期时间值(DATATIME):表示为:’ddmmmyy:hh:mm:ss’DT。
 §2.3 SAS 变量
 一、变量及变量的命名
 变量:指具有相同性质的数据值的集合。变量是用变量名表示的。
 变量的命名:以字母或下画线开头,后跟字母或数字或下画线的字符串。长度不多于8个字符。空格和特殊的字符($、@、#)不能出现在变量名中。
 二、变量的属性
 SAS的变量分为两类:数值型与字符型。每个变量都有长度、输入格式、输出格式和标号四种属性。变量的属性可以由首次出现的上下文给出定义,也可以用专用的语句定义明确给出。
 1、变量的取值范围:
 数值型变量的值是数值,数值的范围是:±10-307到±10 308。
 字符型变量的值是字符串,其取值范围最多为200个字符。
 2、变量长度:
 变量长度是指SAS数据集中存储它的每一个值的字节数。
 数值型变量的长度为:3"8个字节,默认为8个字节。
 字符型变量的的长度为:1"200个字节,默认为8个字节。
 3、变量的格式标号
 由于变量名长度不能超过8个字符,有时变量名受此限制而不能完全表达变量的含义。变量的格式标号是用来给变量定义一个标签,这样可以提高输出变量值时的可读性。用LABEL语句可以定义变量的格式标号。
 4、数据缺值(Missing Values)
 在数据分析中,经常会遇到数据不全或数据缺少的问题。SAS在数据分析时允许数据缺值,一般用“.”表示。
 5、变量的简化表示
 SAS程序定义了完整的变量清单,可以在许多语句中使用缩写变量清单,达到简化书写的目的。(参见P9表2.1)
 §2.5 SAS 函数
 如同其他高级语言一样,SAS提供了丰富的标准函数,为计算带来极大方便。SAS函数的书写格式为:
 函数名(参数表)
 例如:SIN(X) ABS(X)
 一、数的参数
 函数的参数可以是常量、变量、表达式。函数的参数可以是一个或多个。如:
 sin(x)   一个参数
 max(x1,x2,x3,x4,x5)   多个参数
 参数书写形式有如下三种:
 ① 将所有参数列入括号内,参数间用“,”隔开。如:max(x1,x2,x3,x4,x5)
 ② 将所有参数列入括号内,参数间用“空格”隔开,前面冠以OF,如:
 max(of   x1   x2   x3   x4   x5)
 ③ 参数变量名的尾部是有序整数时,可写成:(OF 变量名1-变量名n),如:
 max(of   x1-x5)
 二、函数值
 除个别函数外,多数函数值的类型与其参数类型是一致的。
 三、关于函数的几点说明
 ① 函数不能直接用在PUT语句中。
 ② 函数参数都有特定的取值范围。
 ③ 除样本统计函数外,多数函数不允许有缺值。
 ④ 对某些概率函数,若参数选择不当,可能引起不收敛的问题。
 四、函数分类
 SAS函数的类型有:算术、数学、截尾、三角、样本统计、概率函数。(略)
 §2.6 SAS表达式
 SAS表达式是由操作符和圆括号将各种操作数连接起来表示运算关系的的式子。表达式的值可能是:数值、字符串或缺失值。
 一、操作符
 ① 算术运算符
 **(乘方)   *(乘)   /(除)    (加)   -(减)
 ② 比较(关系)运算符
 = 或EQ    等于   ^= 或 NE   不等于
 > 或GT    大于    < 或LT    小于
 >=或GE    大于等于   <=或LE   小于等于
 比较两个量大小关系,构成比较表达式,运算结果为逻辑值。如:
 5>3 1    X<2*Y    ”ab c”>=”XYZ”
 ③ 逻辑运算符
 &;amp; 或 AND   | 或 OR    ^ 或NOT
 对逻辑值再进行运算,构成逻辑表达式,运算结果为逻辑值。如:
 5>3 1 AND X<2*Y
 逻辑运算真值表:
 逻辑值A 逻辑值B A AND B A OR B NOT A
 真 真 真 真 假
 真 假 假 真 假
 假 真 假 真 真
 假 假 假 假 真
 ④ 其它运算符
 <>    取两个量中最大值   53<>34
 ><    取两个量中最小值   53><34
 || 或!联接两个字符串   ”abc” || ”de”
 二、操作符运算优先级
 在一个SAS表达式中,同时可能包含多个操作符,各种操作符的执行优先顺序规定如下:
 规则1:括号内优先
 规则2:具有较高优先级的操作先执行,优先级次序如下:
 组1:**,正负号,NOT,<>,><
 组2:*,/
 组3: ,-
 组4:||
 组5:<,<=,=,^=,> ,> 组6:AND
 组7:OR
 规则3:组号小者优先组号高者,优先级先同时,依次从左向右执行。
 §2.7 SAS语句与程序
 SAS语句是以SAS关键字(保留字)开头、后跟SAS名、特殊字符、操作符等组成,以分号结束。一个语句规定了一种操作或为系统提供默写信息。
 一、SAS关键字:
 关键字是SAS系统已经赋于特定含义的一个单词或单词缩写,是一个特定的字符串。在SAS语句中,多数语句是以关键字作为开头的。
 二、SAS 名:
 SAS名是以字母或下画线开头,后跟字母或数字或下画线的字符串。长度不多于8个字符。空格和特殊的字符($、@、#)不能出现在变量名中。
 另外,SAS保留了一些特殊的变量名并赋予特定的含义。这些变量都是以下画线开头和结尾,如:_N_表示当前数据步已经执行过的次数。
 在SAS语句中,可能出现的SAS名有:变量名、数据集名、过程名、输出格式名、选项名、数组名、语句标号名、文件逻辑名等。
 三、SAS程序
 SAS程序是由若干SAS语句组成的有序特定的集合,典型的SAS程序都包括两个部分:数据步和过程步,整个程序以RUN语句结束。
 同其它高级语言一样,SAS程序由多行语句组成,其书写格式如下:
 ① 语句可以在一行任意列开始书写
 ② 一个语句可以写一行或多行,但要以分号结束
 ③ 多条语句可以写在一行,语句见必须以分号隔开(英文分号“;”)
 ④ SAS语句对英文字符不区分大小写。
 ⑤ 建议将程序书写成锔齿形,便于程序阅读与调试。
 |  | 
 sas教程
标签:aaa   name   s函数   十分钟   大小写   属性   编程实践   指定   高级语言   
原文地址:http://www.cnblogs.com/stevendes1/p/6621736.html