存档

‘SAS’ 分类的存档

SAS第七课:方差分析与协方差分析

2008年1月7日 Galaxy 没有评论

http://www.bioon.com/biology/sas/55227.shtml

SAS第七课:方差分析与协方差分析

 

方差分析和协方差分析在SAS系统中由SAS/STAT模块来完成,其中我们常用的有ANOVA过程和GLM过程。前者运算速度较快,但功能较为有限;后者运算速度较慢,但功能强大,我们做协方差分析时就要用到GLM过程。本章将首先介绍方差分析所用数据集的建立技巧,然后重点介绍这两个程序步。

其实,这里的速度快慢只是相对而言,SAS的处理速度是首屈一指的。举个例子,这个暑假我做了一个有6600条记录的,7因素的,交叉设计的方差分析(是不是已经有人喊头痛了?),我先是用SPSS FOR WIN95 7.5来做,运行了大约10分钟才出结果。我又换用SAS FOR WIN95 6.12来做,结果用了――2.47秒!

§7.1 方差分析数据集的建立技巧

7.1.1 方差分析的数据集格式

统计分析所用的数据格式和我们在分析整理资料时所用的格式是不同的。一般来说,数据集中应至少有一个结果变量,用于记录不同处理因素水平下观察值的大小;至少有一个处理因素变量,用于记录处理因素的类型及其水平数。以单因素方差分析为例,就应有一个结果变量和一个处理因素变量;而两因素的方差分析应有一个结果变量和两个处理因素变量。

7.1 某职业病防治院对31名石棉矿工中的石棉肺患者、可疑患者及非患者进行了用力肺活量测定,请给出数据集的结构(卫统p44 5.1)。

解:数据集中应有两个变量,xgroupx记录肺活量的大小;group取值为123,分别代表石棉肺患者、可疑患者及非患者。

7.2 某厂医务室测定了10名氟作业工人工前、工中及工后4小时的尿氟浓度,请给出数据集的结构(卫统p46 5.2)。

解:数据集中应有三个变量,xgroupworkerx记录尿氟浓度;group取值为123,分别代表工前、工中及工后;worker取值为110,分别代表10名工人。

7.1.2 方差分析数据集的建立技巧

可见方差分析的数据集其变量取值有一定的规律,因此可以利用循环语句和判断语句来简化输入。

7.3 请建立例6.1的数据集。

解:我们可以一个一个的输入变量group的值,但这里给出一种更酷的建立方法。

libname a ‘c:\user’;

data a.wtli5_1;

 group=1;

 if _n_>11 then

处的_n_SAS系统变量,表明读入的数据为第几条记录,由于石棉肺患者只有11人,因此第12条记录只能是可疑患者的记录,同理,从第20条记录开始的只能是非患者的记录。这里利用判断语句来完成从_n_group的转换。

 if _n_>20 then group=3;

  else group=2;

 ;

 input value @@;

 cards;

 1.8 1.4 1.5 2.1 … … 3.3 3.5

;

proc print;

run;

7.4 请建立例7.2的数据集。

解:此例中数据较有规律,各组的例数均相等,这可正是循环语句大显身手的时候。

libname a ‘c:\user’;

data a.wtli5_2;

 do group=1 to 3;

这里的SAS语句非常类似于Foxbase语句,两个循环分别控制了groupworker的取值,这在输入数据时是常见的一种技巧。

  do worker=1 to 10;

   input value @@;

   output;

两个变量只是循环变量,因此要用output语句写入数据集中。

  end;

 end;

 cards;

 90.53 88.43 47.37 … 
 … 105.27 58.95

请注意x变量和处理因素变量的对应关系,不要改变数据块的次序,否则建立的数据集是错的。

 ;

proc print;

run;

§7.2

7.5 请回答在例7.1中三组石棉矿工的用力肺活量有无差别?

解:由于是三组做比较,因此要用方差分析法。在建立数据集后可用ANOVA过程或GLM过程进行分析,同时给出选项进行各组均数的两两比较(此处用SNK法),两过程的输出格式基本一致。对于单因素的方差分析,在比较之前一般要考虑方差齐性的问题。这里可以用GLM过程中的HOVTEST选项实现,实际上这也是在SAS中做方差齐性检验的唯一途径。

设定数据库环境:

LIBNAME A C:\USER;

数据步,建立数据集(略):

ANOVAGLM过程,进行方差分析并同时做两两比较(SNK法):

PROC ANOVA DATA=A.WTLI5_1;

PROC GLM DATA=A.WTLI5_1;

 CLASS GROUP;

 CLASS GROUP;

 MODEL VALUE=GROUP;

 MODEL VALUE=GROUP /SS1;

 MEAN GROUP /SNK;

 MEAN GROUP /SNK HOVTEST;

RUN;

RUN;

这里的GLM过程中有两个选项,SS1要求只输出方差分析SS1模型的结果(默认输出SS1和SS3两种模型的结果),HOVTEST则要求进行方差齐性检验(该选项只能在SAS 6.12以上的版本中实现)。

§7.3 ANOVA过程

ANOVA过程是SAS系统中用于方差分析的几个程序步之一,它适用于平衡的数据。这意味着如果按所分析的变量将观测值分类,则每个格子内的观测值数目应相同。如果数据不满足这一要求,则ANOVA过程的分析结果并不可靠,分析者应改用GLM过程来处理数据。

7.3.1 语法格式

PROC ANOVA [DATA= <数据集名>

 

 MANOVA

按多元分析的要求略去有任一缺失值的记录

 OUTSTAT= <数据集名>] ;

指定统计结果输出的数据集名

 CLASS <处理因素名列>;

必需,指定要分析的处理因素

 MODEL <应变量名=处理因素名列> / [选项];

必需,给出分析用的方差分析模型

 MEANS <变量名列> / [选项] ;

指定要两两比较的因素及比较方法

 BY <变量名列>;

 

 FREQ <变量名>;

 

 MANOVA H= 效应 E= 效应 M= 公式…;

指定多元方差分析的选项

7.3.2 语法说明

Means语句的选项主要用来指定两两比较的方法和检验水准,主要有:

  • 两两比较方法 BONBonferroni检验)、DUNCAN(新复极差法)、DUNNETTGABRIELLSD(最小显著差法)、SCHEFFESIDAK SNKq检验)、TUKEY WALLER
  • 其它 ALPHA= p 更改水准

7.3.3 结果解释

这里以例7.2的数据为例,ANOVA过程的输出结果分两大部分,第一部分是分析变量的列表描述,第二部分是统计结果,先是所用方差分析模型的检验,然后是各个处理因素和交互作用的检验结果,最后则是两两比较的结果。

                         Analysis of Variance Procedure  方差分析过程                              Class Level Information  处理因素取值情况
Class            Levels     Values 处理因素变量名     取值数     具体值 GROUP              3        1 2 3 WORKER            10        1 2 3 4 5 6 7 8 9 10
                         Number of observations in data set = 30       样本大小为30
--------------以下为方差分析的统计结果部分,首先是对方差分析所用模型的检验-------------
                            Analysis of Variance Procedure
Dependent Variable: VALUE      应变量名为VALUE
Source          DF      Sum of Squares      Mean Square   F Value     Pr > F 变异来源       自由度          SS                 MS          F          p值
Model           11      47895.87728667     4354.17066242    4.51      0.0024 Error           18      17365.56086000      964.75338111 Corrected Total 29      65261.43814667
           R-Square                C.V.             Root MSE      应变量名 Mean        所用模型的决定系数          变异系数           剩余标准差      应变量均数            0.733908              28.27501           31.06047941     109.85133333
-----------统计结果的第二部分,对各个具体处理因素及其交互作用的检验----------
Dependent Variable: VALUE
Source        DF         Anova SS         Mean Square   F Value    Pr > F 变异来源     自由度          SS                 MS          F         p值
GROUP         2        8182.89340667     4091.44670333    4.24     0.0310 WORKER        9       39712.98388000     4412.55376444    4.57     0.0030
---------统计结果的第三部分,对GROUP变量做两两比较,只有MEAN语句中指定了才会出现------
                           Analysis of Variance Procedure
                   Student-Newman-Keuls test for variable: VALUE                注意这里我们用SNK法做例子,其余比较方法的输出结果与之类似         NOTE: This test controls the type I experimentwise error rate under the              complete null hypothesis but not under partial null hypotheses.
                            Alpha= 0.05  df= 18  MSE= 964.7534                             α水准为0.05,自由度为18,MS误差为964.7534
                            Number of Means         2         3                             Critical Range     29.183219 35.451257                 SNK法两两比较时的界值,两均数之差大于该界值时则两组有统计学差异
                Means with the same letter are not significantly different.
                        SNK Grouping        Mean    N      group(处理因素变量名)
                                     A       126.59  10         2                                      A                              B       A       115.59  10         3                              B                              B                87.38  10         1                       检验的分组结果        各组均数   例数      组别

注:为了便于理解,SAS将两两比较的结果直接用英文字母的形式标示出来。两两比较结果的最右侧是处理因素变量的取值,最左侧标以字母ABC等等,用以表示该处理组和其它组有无差异。如果两组有相同的字母(如23两组),则两者之间无差异;而如果两组间只有不同的字母,则表示两组间的差异有统计学意义。可以看出此次比较的结果为:1组和2组有区别,其余均两两无区别。

7.3.4 应用实例

7.6 现测定了某湖湖水不同季节氯化物的含量,问不同季节氯化物含量有无区别(卫统p226 2.6题)?

解:

data a.wt2_6;

 do season=1 to 4;

  input x @@;

  output;

 end;

 cards;

 22.6 19.1 … 19.6 14.8

注意输入次序

;

proc anova data=a.wt2_6;

 class season;

 model x=season;

 mean season/snk;

run;

在本例中我为了节省地方,将大部分数据块用省略号略去了,可在带习时我惊讶的发现:有的同学在上机时敲入的这个程序居然也带有省略号?!显然是我误导了大家,辜负了同志们的信任,在此仅致以深深的歉意。

你们到底要我怎么写才好 ...

§7.4 GLM过程

GLM过程即广义线形模型(General Liner Model)过程,它使用最小二乘法对数据拟合广义线形模型。GLM过程中可以进行回归分析、方差分析、协方差分析、剂量――反应模型分析、多元方差分析和偏相关分析等等,其功能之强大可见一斑。

以上所提到的各种分析均可归入广义线形模型的范畴,因此均可用GLM过程来分析。

7.4.1 语法格式

非常走运,在我们所用到的范围里,GLM过程的语法结构和ANOVA过程完全相同,这可大大的方便了我们的学习。这里我们只解释协方差分析的做法:由于协变量并非我们研究的处理因素,因此在CLASS语句中可不能有它的位置;但是,另一方面协变量要影响结果变量的取值,因此必须在模型中引入,怎么办?只要在MODEL语句中将其写入即可(写在分析变量的首位)。瞧,就这么简单!

7.4.2 结果解释

这次我们仍然很走运,GLM过程的结果和ANOVA过程是雷同的――注意是雷同而不是相同。在处理因素、协变量及交互作用的检验结果部分,GLM过程会给出两种结果(Ⅰ类和Ⅲ类结果)。在我们用到的范围里,两种结果是完全相同的,所以用哪一种都可以。

7.4.3 应用实例

7.7 今用AB两药治疗12贫血病人,测得治疗一个月时的红细胞增加数(百万/mm3),问两药的治疗效果如何,两药同时使用的效果如何(医统第二版P92 5.5)?

解:该实验的设计为析因设计,在分析时要将交互作用考虑在内。程序如下:

data a.ytli5_5;

 do b=1 to 0 by -1;

  do a=1 to 0 by -1;

   do tmpvar=1 to 3;

tmpvar为临时变量,使一个格子里有3个观测值

    input x@@;

    output;

   end;

  end;

 end;

 drop tmpvar;

删除临时变量tmpvar

 cards;

 2.1 2.2 2.0 0.9 1.1 1.0

 1.3 1.2 1.1 0.8 0.9 0.7

;

proc glm data=a.ytli3_4;

 class a b;

 model x=a b a*b;

a*b表示ab的交互作用

run;

7.8 请给出《医学统计学》第一版108页例6.1的分析程序。

解:协方差分析的关键步骤是分析资料是否满足协方差分析的应用条件,程序如下:

data a.ytli6_1;

 group=1;

 if _n_>13 then group=2;

 input y x@@;

 cards;

 3.7 15.73 2.35 11.7 …

 … 21.43 9.62 1.3 6.89

;

proc gplot;

做散点图,比较两组的相关趋势

 plot y*x=group ;

group变量分组绘图

 symbol1 i=rl v=star;

在散点图上加回归线

 symbol2 i=rl v=plus;

 

proc reg;

xy的回归分析

 model y=x;

 by group;

proc glm data=a.ytli6_1;

 class group;

 model y= x group;

x为协变量

run;

(原著:张文彤)

分类: SAS 标签: , ,

SAS第三课:SAS程序基本语法入门

2008年1月7日 Galaxy 没有评论

http://www.bioon.com/biology/sas/55223.shtml

SAS第三课:SAS程序基本语法入门

  从本质上讲,SAS是一种完善的第四代计算机语言。因此要真正掌握它,我们仍然要抛开其华丽的外表,从学习它的核心――SAS程序开始。现在,让我们将SAS看成一个计算能力极强的统计学白痴(之所以这样说,是因为它计算能力虽然极强,却只能帮你计算而不能提出自己的实验设计方案或研究方向来),而你有一个非常小的关于数据分析的问题要请它帮忙。自然你要开口提出请求,无论措辞是委婉动听还是直截了当,你的大实话无非是“喂,老兄,我有这样一些数据,我想做这样一种统计分析,您能帮我吗?”。他迅速检查您的要求,在认为合情、合理并且合法后,就开始进行计算,并且在很短的时间内给出计算结果。好的,计算机语言就是我们和计算机对话时所用的语言。和以上人类对话的例子相对照,“我有这样一些数据”对应SAS程序中的数据步;而“我想做这样一些统计处理”对应SAS程序中的程序步;最后的那一句哀求“您能帮我吗”则对应了Submit命令。在默认情况下,运行结果或者出错信息将自动给出(当然你也可以强制不让它输出)。此外,还有一些系统环境控制语句,如Libnametitle等。SAS程序就是由一个或多个数据步和/或程序步加上一些乱七八糟的环境控制语句组成。在本章中,我们将首先学习SAS对数据的管理方式,然后会了解到什么是数据步和程序步,最后则介绍一下SAS语言中结构化语句的语法。

§3.1 SAS系统对数据的管理

SAS系统中只有SAS数据集才能被SAS过程直接调用,SAS数据集的结构和DBF数据库完全相同,因此无须多讲。而SAS数据集存储在被称为SAS数据库的文件集中,在PC系统中,SAS数据库与某一个文件夹相对应,我们要为每一个数据库指定一个库标记(库名)来识别该库,使用Libname命令可以指定库标记。它的一般格式如下:

Libname 库标记 文件夹位置

选项;

例如要指定目录“C:\USER”为库标记A,可以在视窗中提交如下语句:

libname a c:\user

;

数据库可分为永久库和临时库两种。临时库只有1个,名为WORK,它在每次启动SAS系统后自动生成,关闭SAS时库中的数据集被自动删除;永久库可有多个,用户可以使用Libname语句指定永久库的库标记,永久库中的所有文件都将被保留。但库标记仍是临时的,每次启动SAS系统后都要重新指定。不过为了方便用户,SAS在每次启动时都会自动指定两个库标记:

  • SASUSER:指明为永久库,即库中的数据集被保存起来,以便下次启动系统时使用。
  • WORK:指明为临时库,对于开发和检查新程序非常有用,但每次SAS运行结束后WORK库中的所有文件将被删除。在程序中引用该库中的数据集可以省略库标记,即它被认为是缺省的数据库。

SAS数据库对应文件夹,如SASUSER对应c:\sas\sasuser,WORK对应c:\sas\saswork, SAS数据集则对应文件,每个数据集实际上是在硬盘的相应文件夹内产生一个文件名为数据集名,而扩展名为.sd2的文件,因此如果你成功的建立了一个数据集,理论上你就可以反复使用它直到硬盘报废。

每一个数据集都有一个两级名,第一级是库标记,第二级是数据集名,中间用“.”隔开,在程序中通过指定两级名来识别文件。文件两级名的一般形式如下:

库标记.数据集名

如在a库中的数据集abc可以这样来引用:a.abc

§3.2 SAS程序的数据步

3.2.1 预备知识

SAS程序的语句从上一个语句结束处开始,以一个分号结束,可占多行。

3.2.2 数据步

DATA语句开始,用于创建和处理数据集。其中最常用的语句有:

  • DATA语句 它的主要功能是:

    •  
      • 标志数据步的开始。
      • 命名将要创建的SAS数据集。

  •   DATA语句的一般形式如下:

DATA 数据集名;

  • INFILE语句 用于从外部文件读入数据,必须出现在INPUT语句之前。它的主要功能是:
    •  
      • 确定一个包含原始数据的外部文本文件。

INFILE语句的格式如下:

INFILE 外部文件的所在位置及名称

选项;

  • CARDS语句 用于直接输入数据,标志着数据块的开始。格式如下:

CARDS;

 数据块

  • INPUT语句 用于向系统表明如何读入每一条记录。它的主要功能有:
    •  
      • 读入由语句指定的数据列。
      • 为相应的数据域定义变量名。
      • 确定变量的读入模式。

INPUT语句的格式如下:

INPUT 变量名 [变量类型 起止列数]…;

方括号表示其中的内容为可选,如果不输入,系统会以默认值代替。

3.2.3 数据的两种输入方式

上面我们学到了INFILE语句和CARDS语句,它们分别对应了两种数据输入的方式:【直接输入方式】

实际上我们在第一章已经用到了直接输入方式,仍以那个程序为例,其中的数据步如下:

data temp;

命名将要建立的数据集为work.temp

input x y@@;

要输入的变量为xy,并且连续输入

cards;

直接输入数据,数据块开始

34 56 78 90 35 67 89 10 23 65 77 45

数据块

;

数据块结束

变量y后面的@@表示数据可以在一行里连续读入,SAS默认按列来分隔变量,可是这里只有两个变量,输成两列数据太长,因此加上两个@@SAS见到这个符号,在按变量名依次读取完数据后,不是跳到下一行,而是继续在该行读数据,直至本行结束或到达分号为止。

如果你对这段叙述无法理解,请去掉两个@@,重新运行一遍程序,看看LOG视窗中的提示都有些什么变化。

【外部文件读入方式】

如果刚才的数据已经事先输好,在硬盘上的“C:\USER”文件夹内存为temp.dat文件,该文件内容如下(纯文本):

34 56 78 90 35 67 89 10 23 65 77 45

则我们可以输入程序如下:

data temp; 命名将要建立的数据集为work.temp
Infile c:\user\temp.dat; 指定外部数据文本文件名
input x y@@;

要输入的变量为xy,并且连续输入

Run; 数据步结束,以上语句可以执行了

数据步以DATA语句开始,那么在哪里结束?在遇到run语句或另一个数据步/程序步时就结束了。

为什么程序的最后都要加一句run?这个问题还不太好解释,每一个程序应至少在最后有一个run语句,表明前面的所有语句可以提交运行了,如果没有这一句,SAS会以为你后面还有语句要输入,从而将一些非立即执行的语句保留在编译缓冲区中,等待后续命令发出后一起执行,这有时会把事情弄得很糟。出于减少麻烦的需要,建议大家养成在每一个数据步或程序步后都写上一句run的习惯。

Submit命令和run语句有什么区别?这是初学者最爱问的一个问题,也同样是一个难以回答的问题。简单地讲,run是程序语句,可在程序中多次出现,它表示前面的程序段已经全部写完,可以作为一个或几个整体提交运行了,而Submit则是SAS命令,只在最后程序运行的时候发出,表示将程序正式提交运行。如果你还不明白,那么我还是来给你打个比方,run语句是你对SAS说“我想让您做的就是这些了”,而Submit命令就是对SAS说“现在开始为我做这些事,好吗”,明白了吗?

读入其他格式的数据文件

除了以上的两种通过数据步创建数据集的方法,SAS还提供了一些其他的方式可以用来读入其他格式的数据文件。6.11版本以上的SAS可以利用FILE菜单上的import命令将其他格式的数据文件导入SAS系统,创建SAS自己的数据集。可以导入的数据文件格式有:dBase数据库,EXCEL工作表,LOTUS的数据库,纯文本的数据文件等。

导入的操作完全是对话式的,界面友好,简便实用。以下简单叙述导入的步骤,假如例1.1的数据输成一个dBASEIII数据库文件temp.dbf, 已经存放在”c:\user”下,要导入成数据集work.li1_1。选择FILE菜单上的import,弹出一个对话框,按照向导的提示进行下去。 

1. 选择导入的数据格式,从下拉式菜单上选择DBF格式,单击NEXT按钮。 

2. 给出数据文件的位置和文件名,在对话框中键入C:\USER\temp.DBF,或点BROWSE直接从上面选择文件,选好后单击NEXT按钮。 

3. 选择导入的目的地,即指定要创建的数据集的名字和存放的数据库名,先在左面的对话框选择数据库名WORK(临时库),在右面的对话框键入数据集的名字li1_1,此名可任意起,少于8个字符,选择完后,单击FINISH按钮,就完成了此次操作。

 这时已经建好了一个数据集,名为WORK.li1_1,与我们前面建立的数据集完全一致。

§3.3 SAS程序的程序步

通俗的讲,SAS的程序步(有的书中也称过程或过程步)就是已经编好了的用于数据整理和统计的计算机程序,你只需要调用它们就是了。程序步总是用一个PROC语句开始,后面紧跟着程序步名,用以区分不同的程序步。以下是一些常用的程序步的名称及功能。

程序步名

SORT 将指定的数据集按指定变量排序
PRINT 将数据集中的数据列表输出
MEANS 对指定的数值变量进行简单的统计描述
FREQ 对指定的分类变量进行简单的统计描述
TTEST 对指定的变量做t检验
ANOVA 对指定的变量做方差分析
NPAR1WAY 对指定的变量做非参数检验
REG 对指定的变量做回归分析
CORR 对指定的变量做相关分析
CHART 绘出低分辨率的统计图

PROC就是程序(procedure)的缩写,而程序步的名字大都是其功能相对应的单词或词组的缩写。

可见SAS的许多功能就是通过程序步来体现的,可如此多的种类也使我们难以总结出一个程序步的通式来。不过仍可大致给出如下结构:

PROC 过程名 [DATA=数据集名] [选项];
    该过程的专用语句描述;
    [VAR 变量序列;]
    [WHERE 条件表达式...;]
    [BY 变量序列;]
Run;

方括号里的语句均可以省略,在这时该过程按最通常的情况来处理,即:

  •  
    • 处理最新建立的SAS数据集。
    • 处理所有的变量(或对一个计算过程来说处理全部数值变量)。
    • 一次处理整个数据集而不是某个子集。

  • 我们在第一章中用到的

PRINT程序步就是采用的这种默认方式。

但有时我们的要求超出了默认方式所提供的范围,这时就要动用方括号里的秘密武器了。

  •  

    • DATA参数 指明所需处理的数据集名,请注意在这里它是一个参数而不是语句。
    • VAR语句 如果只想分析某一个或几个特定的变量,则可用VAR语句指定它们。例如只想显示变量x的列表,则PRINT过程如下:
Proc print ;
    Var x;
Run;

如果想显示xy两个变量,则将VAR语句改为如下形式即可:

var x y;

当然,也可以将VAR语句删除,结果相同。

  •  

    • Where语句 如果你想处理的不是整个数据集而只是其中符合某种条件的子集,那么WHERE语句将会非常有用,如上例中我们只想显示大于50x变量的值,则在PRINT过程中加入where语句如下:

Where x>50;

如果条件变为xy两个变量的值都要大于50,则where语句改为:

where x>50 and y>50;

SAS语言中常用的逻辑表达符号有and(和)、or(或)、xor(异或)、ne(不等)等。

  •  
    • By语句 如果你需要分组处理数据,例如要按性别分组输出统计结果,你有两种选择,一是用不同的where语句将同一个程序步反复写几遍;另一种显然更酷的方法就是采用by语句。如上例我们想按不同的y值输出x值,则加入by语句如下:

By y;

使用BY语句要求数据集已经按BY语句中指定的变量排序。如果没有排序,则程序无法正确运行。可以用SORT过程来排序,语法结构如下:

PROC SORT DATA=数据集名;
    BY 变量名列;
RUN;

§3.4 结构化语句简介

每一种结构化语言编写的程序都由顺序、分支、循环三种结构构成, SAS语言也不例外。在这里简要介绍一下分支和循环语句的语法。这些语句均可直接在数据步和程序步中使用,适当地使用它们可以大大简化我们的工作。

3.4.1 分支(条件)语句

【语法格式】

语法格式如下:

IF 条件 THEN
    程序块;

ELSE

    程序块;

可见其语法和FOXBASE语言十分相似,只是前面多了THEN,结尾没有ENDIF,可以将两者相比较来理解。其中程序块如果只有一句,则可直接写出,否则应以DO开头,以END结束。【应用实例】

3.1 在产生数据集temp的同时为其增加变量class,当x>50class=1,否则class=2解:程序如下:

data temp;

数据步开始,定义要建立的数据集为WORK库的TEMP

    input x y@@;

要输入的变量为XY,并且采用数据连续读入方式

    if x>50 then class=1;

建立新变量CLASS,如果X>50,则CLASS=1

    else class=2;

否则,CLASS=2

cards;

数据块开始

34 56 78 90 35 67 89 10 23 65 77 45

数据块

;

数据块结束
proc print; 列表输出数据集中的数据,检查有无错误
run; 程序结束,开始运行以上程序

以上程序在书写时采用了缩进格式,使程序的结构更清楚。当然大家可以左对齐写完所有的语句,但这样书写的程序在较长时难以阅读。

为什么可以这样写?在这里有必要解释一下数据步的执行过程,input语句按变量顺序将数据读入内存缓冲区,直至每一个变量都有值相对应。然后数据步继续向下执行,从而其它语句可以修改内存缓冲区,如修改值、增加变量等,在执行到数据步结束后,程序又回到input语句处继续执行,直到数据读完为止。现在再看看这个程序,大家可以理解它了吧!

3.4.2 循环语句

【语法格式】

语法格式如下:

DO 起始条件 TO 终止条件;
     程序块;
END;

该语句主要用于建立数据集。

【应用实例】

3.2 在产生数据集temp的同时为其增加变量class,取值依次为12解:程序如下:

Data temp; 数据步开始,定义要建立的数据集为WORK库的TEMP
    do class = 1 to 2; 循环开始,循环控制变量为CLASS,取值从12
        input x y@@; 要输入的变量为XY,并且采用数据连续读入方式
        output; OUTPUT语句将循环控制变量写入数据集中
    end; 循环结束
cards; 数据块开始

34 56 78 90 35 67 89 10 23 65 77 45

数据块
; 数据块结束
run; 程序结束,开始运行以上程序

注意在数据步中,我们不需要用语句改变循环变量的大小,系统会自动改变。

现在,SAS语言的基本知识算是介绍完了。在理论上,你现在可以坐在计算机前,独立编写程序以做出你的统计作业或者是向SAS公司发射核导弹。但为了使你能尽可能地少走弯路(我指的是做统计作业而不是后者),在以后的各章中我们将重点介绍一些常用的程序步,并且在必要的时候介绍一些较为深入的内容。Are you ready? Let’s go! 

(原著:张文彤 田晓燕)

分类: SAS 标签: , ,
Locations of visitors to this page