SAS笔记

时间:2021-07-10 06:27:56

SAS基础知识

  SAS里面的PROC一览

  The ACECLUS Procedure : 聚类的协方差矩阵近似估计(approximate covariance estimation for clustering)

  The ANOVA Procedure :方差分析

  The BOXPLOT Procedure :箱形图

  The CALIS Procedure :结构方程模型

  The CANCORR Procedure :典型相关分析

  The CANDISC Procedure :主成分分析和典型相关分析

  The CATMOD Procedure :类别分析

  The CLUSTER Procedure :聚类分析

  包括11种(average linkage, the centroid method, complete linkage, density linkage (including Wong’s hybrid and th-nearest-neighbor methods), maximum likelihood for mixtures of spherical multivariate normal distributions with equal variances but possibly unequal mixing proportions, the flexible-beta method, McQuitty’s similarity analysis, the median method, single linkage, two-stage density linkage, and Ward’s minimum-variance method,机器翻译为:平均联动,重心法,完全连锁,密度连接(包括Wong混合模型,最近邻的方法),最大的可能性,McQuitty的相似性分析,中位数法,单联动,两阶段密度联动,Ward最小方差法)。

  The CORRESP Procedure :简单的对应分析和多元对应分析(MCA)

  The DISCRIM Procedure :生成分类器的判别标准

  The DISTANCE Procedure :距离,不相似或相似性分析

  The FACTOR Procedure :因子分析和因子旋转

  The FASTCLUS Procedure :快速聚类分析(给定计算出来的距离)

  The FREQ Procedure :频率统计

  The GAM Procedure :广义可加模型

  The GENMOD Procedure :广义线性模型,泊松回归、贝叶斯回归等

  The GLIMMIX Procedure :generalized linear mixed models (GLMM),广义线性混合模型

  The GLM Procedure :最小二乘法模型,包括回归、方差、协方差、多元方差分析、偏相关。

  The GLMMOD Procedure :广义线性模型设计

  The GLMPOWER Procedure :预测力和样本大小的线性模型分析

  The GLMSELECT Procedure :变量选择,包括Lasso和LAR等。

  The HPMIXED Procedure :线性混合模型,包括固定效应、随机效应等。

  The INBREED Procedure :协方差或近亲繁殖系数。

  The KDE Procedure :单变量和二元核密度估计

  The KRIGE2D Procedure :二维克里格法,包括各向异性和嵌套的半方差图模型

  The LATTICE Procedure :简单的栅格设计实验的方差分析和协方差分析

  The LIFEREG Procedure :生存分析中的参数模型,包括各种截尾数据

  The LIFETEST Procedure :生存分析的相关检验

  The LOESS Procedure :非参数模型、多维数据、支持多因变量、直接和插值的kd树、统计推断、自动平滑参数的选择、执行迭代时有异常值的数据。

  The LOGISTIC Procedure:logit回归

  The MCMC Procedure : Markov chain Monte Carlo (MCMC) simulation-马尔可夫链蒙特卡洛模拟

  The MDS Procedure : Multidimensional scaling (MDS)-多维标度模型

  The MI Procedure : 缺失值处理

  The MIANALYZE Procedure :缺失值分析

  The MIXED Procedure :混合线性模型,面板数据的常用模型

  The MODECLUS Procedure :各种参数、非参数的聚类模型

  The MULTTEST Procedure :多重检验的p值调整

  The NESTED Procedure :嵌套的随机效应模型(nested random effects model)

  The NLIN Procedure :非线性回归模型

  The NLMIXED Procedure :非线性混合模型(固定效应和随机效应都是非线性的)

  The NPAR1WAY Procedure :位置和规模差异的非参数检验

  The ORTHOREG Procedure:更精准的广义线性模型(Gentleman-Givens变换来求解QR分解)

  The PHREG Procedure :Cox proportional hazards model-Cox比例风险模型

  The PLAN Procedure :因子实验设计

  The PLS Procedure :partial least squares (PLS)-偏最小二乘法

  The POWER Procedure :模型能力和样本量分析

  The Power and Sample Size Application :桌面版的能力和样本量分析程序

  The PRINCOMP Procedure :主成份分析

  The PRINQUAL Procedure :定质,定量,或混合数据的主成分分析(PCA)

  The PROBIT Procedure :probit回归

  The QUANTREG Procedure :分位数回归

  The REG Procedure :最小二乘回归

  The ROBUSTREG Procedure :稳健回归(剔除离群点影响)

  The RSREG Procedure :二次响应回归模型

  The SCORE Procedure : 打分

  The SEQDESIGN Procedure :临床试验的中期设计

  The SEQTEST Procedure : 临床试验的中期分析

  The SIM2D Procedure :高斯随机场的空间模拟(anisotropic and nested semivariogram models)

  The SIMNORMAL Procedure :生成高斯分布的模拟数据

  The STDIZE Procedure :标准化数据

  The STEPDISC Procedure :逐步回归(变量选择)

  The SURVEYFREQ Procedure : 单向或者多向频率和交叉表的抽样调查数据分析

  The SURVEYLOGISTIC Procedure :抽样调查的logit回归

  The SURVEYMEANS Procedure :抽样调查数据的概要统计

  The SURVEYREG Procedure :抽样调查数据的回归分析

  The SURVEYSELECT Procedure :选择基于概率的随机样本

  The TCALIS Procedure :结构方程模型(目测是CALIS的加强版)

  The TPSPLINE Procedure :补偿最小二乘法来拟合非参数回归模型

  The TRANSREG Procedure :transformation regression(一系列基于最小二乘法的变换)

  The TREE Procedure :树状图

  The TTEST Procedure :各种情况下的t检验

  The VARCLUS Procedure :不相交或分层聚类

  The VARCOMP Procedure :含有随机效应的广义线性模型

  The VARIOGRAM Procedure :二维空间数据的连续性分析

  5.1 SAS表达式简介

  1.SAS常数表达式

  (1)数值常数 如: 1.23、 -5、 0.5E-10。

  (2)字符常数 如: name1='TOME'、 name2='MARY'、name3='JOHN'。

  (3)日期(d)、时间(t)、日时(dt)常数 如: d1='01JAN80'd、t1='9:25:19't、

  dt1='18JAN80:9:27:05'dt。

  (4)16进制常数(略)

  2.SAS运算符

  (1)前缀算符与后缀算符

  前缀算符, 即正号或负号; 如: +Y; -25; -COS(30); +(X*Y); 后缀算符,即两个运算对

  象之间的运算符号, 如: 1+9; 4-2; 6<8。

  (2)只含一个运算符的简单表达式(Ⅰ组)和含有多于一个运算符的复合表达式(Ⅱ组)

  Ⅰ组, 如: A+B; C-D; E*F; G/H; Ⅱ组, 如: 1-EXP(N/(N-1)); 100-LOG(N*(N+1));

  (3)操作运算的顺序

  求一个复合表达式的值时, 其操作运算的顺序和优先级遵从如下的规则(见表5.1):

  表5.1     SAS的运算符及其在运算顺序上的优先级

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  优先级组别   运算符号       等价表示     运算符号含义之说明

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  第 0 组      ( )                 括号

  第 1 组    **  +   -                乘方, 正数, 负数

                  ^   ><  <>   NOT MIN MAX  逻辑非, 最小, 最大

  第 2 组     *  /                 乘, 除

  第 3 组     +  -                 加, 减

  第 4 组     ‖或||                 字串连接

  第 5 组     <   <=      LT LE      小于, 小于等于

                     =   ^=       EQ NE       等于, 不等于

                     >=  >      GE GT      大于等于, 大于

                         IN                       等于一列元数中的某一个

  第 6 组       &        AND        逻辑与

  第 7 组     |或|        OR         逻辑或

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  计算顺序: 第0组由内向外; 其他各组均自左至右。

  第4组和第7组都给出了两种运算符号, 这是因为不同的系统可能只认识其中的某一种

  5.2 SAS函数简介

  SAS软件*有13类147个SAS函数, 现将其中最常用者的用法作一扼要介绍。

  1.算术函数

  (1)求一个数的绝对值的函数ABS和求一个正数的算术平根的函数SQRT

  如求-250的绝对值的语句为x=ABS(-250)、求625的算术平根的语句为y=SQRT(625)。

  (2)求若干个数的最大值的函数MAX和最小值的函数MIN

  DATA;

  a1=2; a2=-9; a3=15; a4=-23;

  x=MAX(of a1-a4);

  y=MIN(of a1-a4);

  FILE PRINT;

  PUT x y;

  RUN;  

  程序运行结果为∶x=15、y=-23。

  2.截取函数

  (1)取一个数的整数部分的函数INT、按规定舍入精度取一个数的近似值的函数ROUND;

  (2)取≥自变量的最小整数的函数CEIL、取≤自变量的最大整数的函数FLOOR

  DATA;                           运行结果

  a=INT(223.456); b=ROUND(223.456, 100);          a=223  b=200

  c=ROUND(223.456,10); d=ROUND(223.456,1);         c=220  d=223

  e=ROUND(223.456,0.1); f=ROUND(223.456,0.01);       e=223.5  f=223.46

  g=CEIL(2.4); h=CEIL(-2.4); i=FLOOR(2.4); j=FLOOR(-2.4);         g=3    h=-2

  FILE PRINT; PUT a b c d e f g h i j; RUN;              i=2    j=-3

  3.数学函数

  (1)以e为底的指数EXP、自然对数LOG(以e为底)、以2为底的对数LOG2和常用对数函数LOG10(以10为底)

  DATA; a=2; b=2.718281828; c=10; w=EXP(a); x=LOG(b);

  y=LOG2(a); z=LOG10(c); FILE PRINT; PUT w x y z; RUN;

  程序运行结果为∶w≈7.389056、x≈1、y=1、z=1。

  (2)正弦SIN、余弦COS、正切TAN以及它们的反函数ARSIN、ARCOS、ATAN

  u=SIN(a); v=COS(a); w=TAN(a);        这里a的单位是弧度, u,v w是实数;

  x=ARSIN(b); y=ARCOS(b); z=ATAN(b);     这里b是实数, x, y, z是弧度。

  4.概率函数

  (1)泊松函数POISSON和二项概率函数PROBBNML

  求概率P=∑nj=0 e-λ(λj/j!),函数的格式是: POISSON(λ,n),当λ=1、n=2时, 程序为:  DATA; P=POISSON(1, 2); FILE PRINT; PUT P; RUN;  结果是: P=0.9197。

  求概率P=∑mj=0 CjnPj(1-P)n-j,函数的格式是:PROBBNML(p,n,m),当p=0.5、n=10、m=4时, 程序为: DATA; P=PROBBNML(0.5,10,4); FILE PRINT; PUT P; RUN; 结果是: P=0.37695。

  (2)在标准正态、'学生't、卡、F下, 若给定横坐标上的分位点和*度的值, 可求出随机变量小于等于该分位点值的概率, 其语句的形式如下:

  Pu=PROBNORM(u); Pt=PROBT(t, df); Px=PROBCHI(x, df); Pf=PROBF(f,ndf,ddf)

  这里, u、t、x、f分别代表服从标准正态、中心t、中心卡、中心F的随机变量所取的分位点的值, df为*度, ndf、ddf分别为F统计量中分子、分母的*度(下同),Pu、Pt、Px、Pf为各随机变量取值小于给定分位数的概率。

  5.分位数函数

  在标准正态、'学生't、卡 、F下, 若给定左侧尾端的概率P和*度df的值, 可求出横坐标上的分位点的数值, 其语句的形式如下:

  ①   u=PROBIT(P); ②t=TINV(P, df); ③χ2=CINV(P,df); ④F=FINV(P,ndf,ddf)

  注意:实际使用时,常需计算出与右侧尾单的概率相对应的分位数,故可令P=1-alpha,  这里,alpha就是事先规定的右侧尾端概率。

  6.样本统计量函数

  给定一组定量数据Xi, i=1, 2, …, n, 欲求15种样本统计量之中某些统计量的值时,可  用相应的样本统计量函数计算;若同时想得到所有这些值,可直接用UNIVARIATE过程计算。样本统计量函数在语句中的形式如下(以求样本均数的函数MEAN为例,其他用法相同): A1=MEAN(of X1-Xn);或A2=MEAN(X1, X2, …, Xn); 第1种形式适合事先给变量X1~Xn赋了值的场合; 第2种形式适合直接将具体数代入括号内)。

  7. 日期函数

  由两富同日期计算出它们之间的天数,可用INTCK函数。如:

  A='01JUN93'D; B='01JUN94'; C=INTCK('DAY', A, B); 则C=365(天)。其他从略。

  5.3 SAS语句简介

  Ⅰ.用在DATA步的语句

  1.DATA语句 表示一个数据步的开始, 并给出正被创建的SAS数据集的名字。

  (1)格式: DATA [SASdataset[(dsoptions)]]…;

  (2)说明: SASdataset是这个DATA步正被创建的一个或几个SAS数据集的名字;dsoptions  告诉SAS系统关于正被创建的SAS数据集的更多的信息。

  (3)SAS数据集的名字的种类

  ①省略数据集名  DATA; 等价于写: DATA _DATA_;每运行一次,SAS系统自动给创建的数  据集依次命名为DATA1, DATA2, …。

  ②单水平名字DATA ABC; SAS系统自动命名为WORK.ABC,这里WORK是隐含的第一水平名字,即库名, 彻底退出SAS系统时,此数据集就消失了, 故称为临时数据集。ABC是第二水平名字,它可以由不超过8个字符组成。

  ③双水平名字DATA WWW.ABC; 这里WWW是库标记, 它靠LIBNAME语句建立起与某个目录之间的联系,如: LIBNAME WWW 'C:\HULP'; DATA WWW.ABC;枕明想在C盘的目录名为HULP下建立一个名为ABC.SSD的永久数据集,“.SSD”是SAS系统自动加的, 此文件只供SAS系统调用,用户无法直接阅读。调用方式为:LIBNAME WWW 'C:\HULP';PROC 过程名 DATA=WWW.ABC;再写其他SAS语句。

  ④特殊的数据集名 DATA _NULL_; 和 DATA _LAST_;前一个语句表明只想用PUT语句来输出一些结果, 但不想创建SAS数据集,可减少使用计算机的资源; 后一个语句表明SAS系统使用一个称为_LAST_的特殊自动变量来保留在一个SAS程序里最新创建的SAS数据集。注意: 在进入SAS DMS后要建立的第一个数据集名不能用_LAST_。

  ⑤同时使用多个数据集名  如果你想对一组含有年龄和另外10个变量的资料按青年、中年、老年创建三个数据集, 可用如下的方法实现:

  DATA ONE TWO THREE; INPUT AGE X1-X10; IF AGE<=35 THEN OUTPUT ONE;

  ELSE IF AGE>35 AND AGE<=55 THEN OUTPUT TWO;

  ELSE IF AGE>55 THEN OUTPUT THREE; CARDS;

  (4)dsoptions(即SAS数据集的选择项)

  注意∶下面的②、⑥两个选择项仅当读已存在的SAS数据集时有效。

  ①DROP=变量名列表 等号后面的所有变量将不出现在此数据集中;

  ②FIRSTOBS=n 从数据集中第n个观测值开始处理;

  ③IN=变量名 在SET, MERGE或UPDATA语句里规定一个新变量的名字,其取值指示观测从哪个数据集得到。如: MERGE ONE(IN=A) TWO; 即当前观测取自ONE时, 则A=1,这一信息可用于DATA步中间的程序语句(如: IF A=1 THEN …), 但此变量不进入正被创建的SAS数据集中;

  ④KEEP=变量名列表 等号后面的所有变量将保留在数据集中;

  ⑤LABEL='单引号内写标签内容, 字符数应≤40';

  ⑥OBS=n n指被处理的已存在的数据集的最后一个观测的序号;

  ⑦TYPE=DATA(或TYPE=CORR) 指定SAS数据集的类型, DATA指一般的数据集、CORR指结构为相关矩阵的数据集, 常由SAS过程自动产生;

  2.INFILE语句(输入文件语句)

  用来定义一个外部文件, 它需用INPUT语句读取。外部文件可以是已存在磁盘上的, 也可以是从键盘上输入的数据行。

  (1)格式: INFILE filespecification options;

  (2)说明: filespecification用来定义文件, options给出选择项;

  (3)filespecification有以下三种形式:

  ①fileref(文件标志) ②'filename'(文件名) ③CARDS指明输入的数据紧跟着CARDS语句,

  如: INFILE 'C:\HULP\ABC.PRG' options; 这里C:\HULP是文件标志、ABC.PRG是文件名;

  又如: INFILE CARDS options; 这里CARDS相当于文件标志。

  (4)下列选择项(options)可以出现在INFILE语句中:

  ①COLUMN=variable或COL=variable定义一个变量, 其值是指针所在的当前列位置。

  ②END=variable定义一个变量, 作为文件结束的标志。

  ③EOF=label是一个语句标号, 当INFILE语句读到文件末尾时, 作为隐含的GOTO语句的目标。

  ④FIRSTOBS=linenumber要求从指定的行开始读取数据, 而不是从文件的第一个记录开始。

  ⑤LENGHT=variable定义一个变量, 其值是当前输入数据行的长度。

  ⑥OBS=n指定从一个顺序输入文件中读取数据的最后一个观测(即第1~第n个观测)。

  3.INPUT语句(输入语句)

  描述一个输入记录中数值的安排情竣给相应的SAS变量赋输入值,该语句只能用于读入

  存放于外部文件中的数据或跟随在CARDS语句之后的数值。

  (1)一般形式: INPUT [specification]…;

  (2)说明: 在INPUT语句中有四种方式描述一个记录值, 即

  ①列格式输入(column) INPUT variable [$] startcolumn[-endcolumn] [.decimals]; variable变量名, $指明其前面的那个变量是字符型的, 数值型的变量则不写$, 若这个变量在前面已被定义为字符袖量, $也不需写; startcolumn是包含该变量值的输入记录的第1列的列号, -endcolumn是包含该变量值的输入记录的最后一列的列号。如果变量值只占一列, 则省去-endcolumn。 .decimals如果输入值不包含一个隔开整数部分与小数部分的小数点,decimals用来指明小数部分的位数。如: INPUT number 10-15.2; 读取number的数值时,小数部分是两位。若输入值分别是2314, 2, 400, -140, SAS以.2形式读取的值依次是23.14, 0.02,4.00,-1.40。又如: INPUT NAME $ 1-8 AGE 11-12; 这里1-8和11-12指列号。

  ②*格式(free-format)或表格式输入(list) INPUT variable [$] [&]…; variable变量名,&指明字符袖量值中可能在一处或多处含有单一的空格, 此时不同变量值之间需用两个或两个以上的空格隔开。如: INPUT NAME $ & AGE X1-X4; NAME的值可以形如: J. JONES或J. M. MARY。*输入格式适用场合:输入的值彼此之间至少有一个空格隔开、用小数点(.)而不是空格表示缺失数据、字符型数值的最大长度为8个字节,除非在LENGTH、ATTRIB或INFORMAT语句中规定了字符袖量的长度。

  ③指定格式输入(formatted) INPUT variable [formatmodifier] informat; variable变量名,formatmodifier修改输入格式读取数据的方式,有两个格式修饰符:“:”和“&”,informat给出读取数据时的输入格式,它总是包括一个(·)或以(·)结尾,如: INPUT NAME $CHAR10. AGE 2.; 这里$CHAR10.和2.分别指定了字符袖量NAME和数值袖量AGE的输入格式; 当输入的值都是以同一方式排列时,就可以用组格式表来表示格式。该格式表是被循环使用的, 直到所有变量都被赋值;带有序号的变量值可用简单的形式列出来, 如: INPUT X1-X5 (4.1); 这表明5个变量的值都按整数部分占两位,小数部分占一位的格式输入, 加上小数点共4位。两个格式修饰符的含意: “:”把输入格式与*格式输入的扫描特征结合起来,表明变量的值是从以下非空格列中读取的, 直到第1次遇到以下三种情况: 下一个空格列、先前定义的变量长度已读满、数据行结束;“&”表明一个字符型输入值可能含有一个或多个嵌在当中的单个空格,此时,不同的数据之间应该用两个以上的空格隔开。

  ④命名格式输入(named) INPUT {pointercontrol}variable={$}{informat};“=”指明使用的是命名格式输入方式。如: INPUT NAME = $ AGE =;

  (3)高级INPUT语句 用指针来跟踪读取数据的位置。

  ①列指针控制: 绝对和相对列指针控制符分别为“@”和“+”,其作用是把指针移到指定的列,“@5”与“+5”的区别是: “@5”是把指针直接移到每行的第5列、而“+5”是把指针从当前的位置向后移动5列。有9种列指针控制: @n 把指针移到第n列。如:INPUT @15 AGE 2.;把指针移到第15列, 从数据行的第15-16列读数据值赋给变量AGE。

  @pointvariable 把指针移到指针变量所指的列。如: A=15; INPUT @A AGE 2.;

  @(expression) 把指针移到表达式值所指的列。如: A=5; INPUT @(A*3) AGE 2.;

  @'characterstring' 把指针移到数据行中字符串charaterstring之后第一个非空格列。

  @charactervariable 首先确定字符变量所取值(即字符串)在输入行的位置, 然后把指针  移到这个字符串之后的第一个非空格列。

  @(characterexpression) 先确定字符表达式值的位置,然后移指针到其后第一个非空格列。

  @+n 把指针向右移动n列。如: INPUT @20 AGE 2. +4 WEIGHT;

  @+pointvariable 把指针移到指针变量值所指的列。如: A=-2; INPUT X 1-15 +A Y 2.;

  此语句表明从数据行的1-15列取值赋给变量X, 然后指针左移2列从第13列开始取值赋给变量Y。

  @+(expression) 把指针移到表达式所指的列。如: INPUT X 1-15 +(-2) Y 2.;

  ②行指针控制: 其控制符有“#”和“/”, 其作用是把指针移到指定的行。有4种行指针控制:

  #n 把指针移到第n行。 

  #pointvariable 把指针移到指针变量值所指的行。

  #(expression) 把指针移到表达式值所指的行。

  / 把指针移到下一行的第一列。如: INPUT NAME $ SEX $ / AGE WEIGHT;

  ③行固定标识符: @和@@两种, 写在INPUT语句的结尾, 其区别在于:

  一个数据行用多个INPUT语句读取数据, 用一个@结尾;一个输入行数据含有多个观测值,用两个@@结尾。

  

  4.FILE语句(文件语句)

  定义当前的输出文件, 并且是一个外部文件,一般要与PUT语句配合使用。其选择项可用来控制文件输出的形式, 还可定义变量来跟踪指针所在的当前行和列的位置、定义在每一个新的输出页中开始打印的抬头。在同一个DATA步中可用多个FILE语句,它是可执行语句,故可用于条件(IF-THEN)语句中, 也可用到其他一些语句。

  (1)格式: FILE filespecification [options];

  (2)说明: filespecification用来定义外部文件, options给出选择项;

  (3)filespecification可有如下形式:

  ①fileref给出文件标志, 也是PUT语句输出的对象, FILENAME语句把一个外部文件同  fileref联系起来;

  ②'filename'定义外部文件的全名字, 文件名要写在单引号内;

  ③LOG如果在PUT语句之前不使用FILE语句或使用该语句, 但形式为FILE LOG options;  其输出内容都将送到LOG窗口内;

  ④PRINT把PUT语句产生的数据行输出到标准SAS打印文件中去(若用“FILE PRINT  options;”形式, 则将内容直接送到OUTPUT窗口中去)。

  (4)用来控制当前输出文件形式的选择项很多,从略。

  5.PUT语句

  把内容输出到SAS系统的LOG窗口、 SAS过程中的输出文件或任何在FILE语句中定义过的文件中去。由最近的FILE语句指明的文件叫当前输出文件。若在当前的DATA步执行中,PUT语句前没有FILE语句,则PUT语句把内容输出到LOG窗口。PUT语句可以输出变量值或字符串。输出变量值有以下三种方式:列输出格式、*格式和指定格式。

  (1)格式: PUT [specification]…;

  (2)说明: specification指的是变量的值或字符串内容是以何种形式输出的。

  (3)specification的具体内容有:

  ①variable列出要输出的变量名;

  ②'characterstring'指明在PUT语句中要输出的字符串,字符串一定要写在单引号内;

  ③pointcontrol把指针移到规定的行和列上;

  ④_INFILE_输出当前输入文件或CARDS后面的数据行中的最后一行;

  ⑤_ALL_输出所有变量的值,包括_ERROR_ , _N_ , 以及在DATA步中用命名式输出定义的变量。PUT语句可以没有specification,如: PUT;它把当前输出行的内容输出到当前文件中去,即使当前行是空的, 也是如此。

  (4)列格式输出 PUT [variable][=] [$] startcolumn[-endcolumn] [.decimalplaces]; “=”在输出变量值的同时写上变量的名字及其符号, 其他项的含义见INPUT语句中相应部分。

  (5)*格式输出 PUT variable[=] [$]; variable输出变量名,=指定变量值用命名的方式输出,$字符袖量的标志。

  (6)指定格式输出 PUT variable[=] format.; =指定变量值用命名的方式输出,其它项的含意见INPUT语句中指定格式输入的相应部分。

  (7)指针控制与格式修饰符 关于指针控制参看INPUT语句中相应部分, 这里对不同之处作些介绍。

  ①_PAGE_把指针移到新的一页的第一行 PUT _PAGE_;

  ②OVERPRINT把当前输出内容输出到前一个输出行中 例如要在标题“TITLE OF PAGE”  下面加一横线, 其语句是: PUT 'TITLE OF PAGE' overprint '_____________';

  ③格式修饰符“n*”指明其后的格式将被重复使用n次。如: PUT X1-X5 (5*7.2);

  ④格式修饰符“:”,它后面跟一个格式, 指明用此格式输出变量值, 但要去掉前面或后  面的空格, 不同数值之间只留一个空格;

  ⑤输出数组元素: PUT array{*}; 数组不能是临时数组,*处不能是数组指示变量, 但可  以是在PUT语句执行时可估值的任何SAS表达式,也可直接用*号。

  6.SET语句

  从一个或几个SAS数据集中读取观测值。此语句的适用场合:

  ①完全复制现存的数据集;

  ②把一个数据集分成几个子数据集;③把几个现存的数据集合并成一个新数据集。

  (1)格式: SET [[SASdataset(dsoptions IN=name)…][setoptions]];

  (2)说明: SASdataset指定一个或几个现存的SAS数据集。在一个SET语句中最多可以指定50个数据集;dsoptions是数据集的选择项; name是产生一个新变量,在DATA步中,如果这个数据集对当前的观测有贡献,其值为1,反之为0;setoptions定义SET语句的选择项。

  (3)数据集的选择项(dsoptions) 参见DATA语句中相应部分。

  (4)SET语句的选择项(setoptions) 

  ①NOBS=name产生一个变量,其值是输入数据集的观测总数。如果多于一个数据集列在SET语句之后,NOBS的值就是所有这些数据集中观测总数。该变量不含在新产生的数据集中。

  ②END=name产生一个变量,作为文件结束的标志。该变量的初值为0,当SET语句读完输入数据集的最后一个观测或合并后的数据集的最后一个观测时,其值为1。

  (5)复制新的数据集 把数据集A复制成数据集B的方法: DATA B; SET A;

  (6)由数据集A生成含有部分变量的子集B,可用下面3种方法之一来实现:

  ①在SET语句中使用DROP=或KEEP=的数据集选择项,如: DATA B; SET A(KEEP=X Y);

  ②在DATA步中使用DROP与KEEP语句,如: DATA B; SET A; KEEP X Y;

  ③在DATA语句中使用DROP=或KEEP=选择项,如: DATA B(KEEP X Y) C(KEEP Y); SET A;

  (7)由数据集A生成含有部分观测的子集B, 一般要借助子集IF语句来实现,如: DATA B; SET A; IF SEX='M'; 最后一句还可写成: IF SEX='M' THEN OUTPUT; 或IF SEX^='M' THEN DELETE; 其目的都是选择SEX的值为M的观测作为新生成数据集的观测。

  (8)由数据集A生成含有新产生的变量的数据集B,如:DATA B; SET A; TOTAL=SUM(OF X1-X5);

  (9)数据集的连接 把若干个数据集按先后次序一个一个的连接起来,形成一个大数据集。

  ①相同变量的数据集的连接,如:DATA C; SET A B;

  ②不同变量的数据集的连接,如果SET语句后列出的数据集中含有的变量不全相同, 则从一个数据集中来的观测对于那些只有在其它数据集中定义的变量,其值为缺失值。

  (10)按已排好的顺序合并数据集 要先用SORT过程排序,再借助BY和SET语句来实现,如: PROC SORT DATA=A; BY X; PROC SORT DATA=B; BY X; DATA C; SET A B; BY X;

  7.MERGE语句(合并语句)

  把两个及以上数据集中的观测合并成一个观测作为新生成的数据集的观测(即一一对应地左右连接),合并观测时的方式依赖于是否有BY语句伴随着MERGE语句。

  (1)格式: MERGE SASdataset[(dsoptions IN=name)]

  SASddataset[(dsoptions IN=name)]…[END=name];

  (2)说明: END=name产生一个变量标志着文件的结束,其初值为0,当MERGE语句执行到最后一个观测时,其值为1,该变量不包括在正被创建的数据集中。其他项的含义参见SET语句。

  (3)一对一合并(没有BY语句) 当没有BY语句伴随MERGE语句时, MERGE语句使全部数据集中的第i个(i=1,2,…)观测依次合并成一行, 成为一个新的观测。新生成的数据集中观测总数为全部数据集中观测个数的最大值。如果某数据集的观测较少,合并后,短缺的那些观测将以缺失值的形式出现; 如果某一个变量同时出现在几个数据集中,合并后,只有一个变量,其值是列在MERGE语句中含该变量的最后那个数据集所对应的数。

(4)匹配合并(带有BY语句) 如果想把两个或两个以上数据集按照一些变量值合并,则需借助BY语句来实现,一个MERGE语句只能有一个BY语句相伴随, 并且,各数据集中至少有一个变量(称为BY变量)是相同的,每个数据集必须先按这些变量排序。

  8.UPDATE语句(更新语句)

  该语句有一个特殊功能, 即用数据集乙(称为修改数据集) 去修改数据集甲(称为主数据  集)。该语句一定要用BY语句伴随,BY语句给出合并观测时的共同变量的名字; 主数据集中不能含有多于一个的共同变量值相同的观测。产生的新数据集包含主数据集中的所有观测, 如果修改数据集含有主数据集中没有的观测,则这些观测出现在新的数据集中。

  (1)格式: UPDATE masterdataset dsoptions [(IN=variable1)

  transactiondataset [(dsoptions IN=variable2)] [END=variable];

  (2)说明: master...和transaction...分别为主数据集名和用以修改的数据集名,其他  项参见SET和MERGE语句。

  9.BY语句

  在DATA步中用以控制MERGE、SET或UPDATE语句的运行并建立特殊的组合变量。

  (1)格式: BY [DESCENDING] [GROUPFORMAT] variable … [NOTSORTED];

  (2)说明: DESCENDING指明数据集是按下降的次序对其后的变量值进行排序、GROUPFOR-

  MAT是当SAS给自动变量FIRST.和LAST.赋值时, 指明该语句中的变量是按其格式化值使用的, 若缺省, 则用非格式化值、variable定义数据集用以排序的每个变量名、 NOTSORTED指明具有同BY值的观测组合在一起, 但BY值不必按字母或数字顺序排列, 此选择项可出现在BY语句中任何地方。

  10.CARDS与CARDS4语句

  该语句标志着后面紧跟着数据行。通常用前者, 格式为: CARDS;并用一个分号(独占一  行)作为数据行结束的标志; 当数据行中含有分号作为输入数据时, 用后者, 格式为: CARDS4;  并用4个连续的分号“;;;;”(独占一行)作为数据行结束的标志。

  Ⅱ.用在DATA步的运行语句

  1.赋值语句

  如∶X=3; 或Y=a+b; 注意∶此处a、b是事先已赋过值的变量或是具体的数值。

  2.累加语句

  如∶N+1; 开始N被置为0,以后DATA步每执行一次,N的值就增加1。

  3.DELETE语句

  如∶DATA abc; INPUT x @@; IF x>100 THEN DELETE; CARDS; (数据行); RUN;

  所建立的SAS数据集abc中就不会包含大于100的数值。

  4.LOSTCARD语句

  当每个观测写成几个数据行时,若当前观测丢失其中的一行或几行,LOSTCARD语句可以防止SAS系统从下一个观测的数据行读数据作为当前观测的一部分。如∶

  DATA abc;                      103 C

  INPUT id1 x$ #2 id2 y #3 id3 z$;                  103 C

  IF id1 NE id2 OR id2 NE id3 THEN LOSTCARD;     104 D

  CARDS;                      105 E

  101 A                      105 E

  102 B                      105 E

  102 B                      ;

  103 C                      RUN;

  [说明] 此例中,DATA步每三个数据行作为一个观测。第1、4两个观测都丢失了两个记录;第2个观测丢失了一个记录;第3、5两个观测是完整的。 新建立的数据集abc中只有两个完整的观测,不完整的观测不会进入新建的数据集。

  5.STOP语句与ABORT语句

  按规定条件停止处理当前执行的DATA步,并继续执行其后的DATA语句或PROC语句。两者的区别在于∶STOP语句属于正常停止执行当前DATA步,不输出出错信息; 而ABORT语句属于异常中止执行当前DATA步,输出出错信息。使用的方法是∶IF (条件) THEN STOP;   IF (条件) THEN ABORT;

  6.WHERE语句

  该语句允许用户在SAS系统把观测读入DATA步之前从已存在的SAS数据集中选择符合特殊条件的观测,常放在SET(设置)、MERGE(合并)、UPDATE(更新)语句之后使用。如∶  DATA one; SET aaa; WHERE x<100; RUN; 在把已存在的SAS数据集aaa复制到新数据集one之前,阻止aaa中与x≥100对应的所有观测进入one中去。 WHERE语句不是可执行语句,它不能作为IF THEN语句的一部分。它与子集IF语句的主要区别在于∶在可用WHERE和子集IF语句时,WHERE语句的效率高得多;而子集IF语句可用在DATA步的任何地方。

  7.OUTPUT语句(输出语句)

  该语句告诉SAS系统输出当前这个观测到正被创建的数据集中。当用户需要在以下三种情况下控制观测值的正常输出时,OUTPUT语句很有用∶

  ①从每行输入数据创建二个或更多观测; ②从一个输入文件创建几个SAS数据集;③把几个输入观测组合成一个观测。如∶

  DATA a; DO i=1 TO 10; INPUT x @@; OUTPUT; END; RUN; (上述用途①)。

  DATA b; IF x<50 THEN OUTPUT b1; ELSE OUTPUT b2; RUN; (上述用途②)。

  8.LIST语句(列表语句)

  在LOG窗口列出正被创建的这个观测的输入数据行,格式为∶LIST;

  9.DISPLAY语句(显示语句)

  显示用户用WINDOW语句创建的窗口,将与WINDOW语句一起介绍。

  10.CALL语句(调用语句)

  在DATA步,该语句引入或调用一个程序。格式为∶CALL 程序名 (参数,……);程序名包括以下四类∶

  ①随机数函数 如∶RANBIN,RANCAU,等等,各函数的详细用法请看SAS说明书。

  ②SOUND 产生声音。格式为:CALL SOUND(频率─每秒周期数,持续时间─常用1/180秒);

  ③SYMPUT 允许用户创建一个宏变量或指定新的值给已存在的那个宏变量。格式为∶

  CALL SYMPUT(macrovar,value); 其中macrovar和value可以是DATA步的变量名,显示字符串(放在引号内),或表达式。

  ④SYSTEM 发布操作系统命令。格式为∶CALL SYSTEM (command);

  如∶DATA _null_; CALL SYSTEM('DIR *.SSD'); RUN; 此程序将显示全部永久数据集名。

  11.MISSING语句(缺失语句)

  用该语句声明输入的数据中表示特殊缺失值的一些确定值。格式为∶MISSING values;  其中values可以是字母表中26个大写(不能小写)字母中的任一个或下横线(_)。如∶  MISSING A R; 则表明数据中用A、R表示的数皆为缺失数据。

  Ⅲ.用在DATA步的控制语句

  1.DO语句(循环语句)

  DO与END之间的语句称为一个DO组,任意多个DO组可以嵌套。

  (1)简单DO语句 

  格式为∶DO; 常用在IF-THEN/ELSE语句里指定一个语句组是否被执行。如∶

  IF x>5 THEN DO; y=x*10; PUT x= y=; END; z=x+3;

  这些语句表明DO与END之间的两句仅当x>5时被执行,否则,跳到赋值语句z=x+3去执行。

  (2)循环DO语句 

  格式为∶DO 下标变量=初值 [TO 终值 [BY 增量] [WHILE|UNTIL(表达式)]]…;如∶

  ①DO i=1 TO 10;②DO i=1 TO 10 WHILE(x<y);③DO i=2TO20 BY2 UNTIL((x/3)>y);

  ④DO i=0.1 TO 0.9 BY 0.1, 1 TO 10 BY 1, 20TO 100 BY 10;

  (3)DO OVER语句 

  格式为∶DO OVER 数组名; 该语句对隐含下标数组元素执行DO组里的语句。如∶

  DATA test;        DO OVER s;      CARDS;

  INPUT sc1-sc5;      s=s*100;         0.95 0.88 0.57 0.90 0.65

  ARRAY s sc1-sc5;      END;         ;

  (程序的第1部分)    (程序的第2部分)       (程序的第3部分)

  这里的“DO OVER s;”等价于“DO _i_=1 TO 5;”。

  (4)DO WHILE语句

  格式为∶DO WHILE(表达式); 如∶n=0; DO WHILE(n LT 5); PUT n=; END;

  只要n<5,DO组中的语句被执行。

  (5)DO UNTIL语句

  格式为∶DO UNTIL(表达式); 如∶n=0; DO UNTIL(n>=5); PUT n=; n+1; END;

  这些语句重复被执行直到n≥5时停止。

  2.END语句

  END语句是组成DO组或SELECT组的SAS语句中的最后一个语句。格式为∶END;

  3.SELECT语句(选择语句)

  格式为∶SELECT [表达式]; WHEN (表达式) 语句; …… [OTHERWISE 语句;] END;

  该语句开始一个SELECT组,在组内,当一个特殊条件成立时, 从WHEN语句选择一个SAS语句来执行,至少必须出现一个WHEN语句。 如果WHEN条蓟成立,选择OTHERWISE语句执行一个规定的语句。END语句结束SELECT组。如∶

  DATA new;         SELECT(a);          OTHERWISE x=1;

  SET old;          WHEN(1) x=x*10;        END;

  x=UNIFORM(0);       WHEN(2);           RUN;

  WHEN(3) x=x*100;

  (程序的第1部分)    (程序的第2部分)       (程序的第3部分)

  这是假定原有数据集old中的变量a的取值为1,2,3或缺失。 当a依次取这些值时,变量x按要求分别作了如下变换∶x*10、不变、x*100、x=1。

  4.IF语句

  (1)条件IF语句

  ①IF─THEN语句

  格式为∶IF 表达式 THEN 语句; 如∶IF x=3 THEN y=x;

  ②IF─THEN/ELSE语句

  格式为∶IF 表达式 THEN 语句; ELSE 语句; 如∶

  IF year=1984 THEN COLOR='BLUE'; ELSE COLOR='RED';

  (2)子集IF语句

  格式为∶IF 表达式; 如∶IF sex='F'; 产生的子数据集仅包含sex值为'F'的那些观测。

  5.GO TO语句(无条件转移语句)

  格式为∶GO TO 语句标号; 该语句常出现在IF─THEN语句中作为THEN的分句。如∶

  DATA a;            x=3;         CARDS;

  INPUT x y;          count+1;       (数据行)

  IF 1<=x<=5 THEN GO TO ok;  ok: sumx+x;      ;

  (程序的第1部分)       (程序的第2部分)   (程序的第3部分)

  如当前输入的数据行中x值属于[1,5]时,转移到用标号ok指示的目标语句,并从该语句往下执行。

  6.LINK语句(连接语句)

  格式为∶LINK 语句标号; 该语句通知SAS系统立即转到由LINK语句指示的语句标号并从那里开始继续执行语句直到一个RETURN被执行。用法与GOTO语句类似,区别见RETURN语句。

  7.RETURN语句(返回语句)

  格式为∶RETURN; 在DATA步当前这个位置上停止执行语句并在继续执行之前返回到一个预定的位置上。返回的位置取决于RETURN语句出现的地方。

  ①当LINK语句已被执行,RETURN语句让SAS系统返回到LINK后面的语句并继续执行。

  ②在HEADER=的语句组里,RETURN语句让SAS系统返回到开始新页之前执行的最后一个语句的后面语句并继续执行。

  ③在DATA步的其他地方(如GOTO语句之后),RETURN语句让SAS系统返回到DATA步的开头。SAS首先输出当前观测到的一些新数据集,同时让自动变量_N_的值增加1,并发布输入行遵守尾随@的准则。每个DATA步都有一个隐含的RETURN作为最后可执行的语句。

  Ⅳ.用在DATA步的信息语句

  1.ARRAY语句(数组语句)

  (1)显示下标数组语句

  格式为∶ARRAY 数组名 [{n}] [$] [数组元素的长度] [数组元素] [(初始值)]; 

  注意∶数组名不能与同一DATA步中的SAS变量同名。{n}表示数组元素的个数,是正整数或*号,括号可用{}、[]或()。$表示数组的元素是字符。如∶

  ARRAY rain{5} x1-x5; ARRAY ab(*) x y z; ARRAY c[3];  ARRAY d(10) _TEMPORARY_;

  _TEMPORARY_表示创建临时数组元素列表,其特点为∶

  ①它们没有名字,引用时必须用数组名和下标,如∶d(5); ②不能出现在输出的数据集上。 ③不能用特殊下标(*)来引用所有元素。④计算速度快,占用内存少。

  (2)隐含下标数组语句

  格式为∶ARRAY 数组名 [(下标变量)] [$] [数组元素的长度] [数组元素]; 如∶

  DATA one;               DATA two;

  INPUT id x1-x10 y1-y10;           INPUT id x1-x10 y1-y10;

  ARRAY big(i) x1-x10 y1-y10;          ARRAY big(i) x1-x10 y1-y10;

  i=11;                 DO OVER big;

  PUT big;                 IF big=. THEN big=0;

  CARDS;                 END; CARDS;

  (数据行)                (数据行)

  ;                   ;

  左边程序中PUT语句输出big第11个元素值;右边程序把big中的所有缺失值改为0。

  2.INFORMAT语句(输入格式语句)

  格式为∶INFORMAT 变量名 [输入格式] [DEFAULT=规定临时缺省的输入格式]……;

  在DATA步,可用此语句来规定在INPUT语句中列出的变量的省略输入格式。如∶

  DATA _null_;             CARDS;

  INFORMAT DEFAULT=3.1;        11 22 33 44 55

  INPUT x1-x5;            ;

  PUT x1-x5;             RUN;

  这个DATA步提交后在LOG窗口输出的结果为∶1.1 2.2 3.3 4.4 5.5。

  3.FORMAT语句(格式语句)

  格式为∶FORMAT 变量名 [格式] [DEFAULT=规定临时缺省的输入格式]……;

  在DATA步使用FORMAT语句可永久地把格式同变量联系起来,在PROC步用FORMAT语句仅仅在PROC步起作用。SAS系统将使用联系的格式来输出这些变量的值。如∶

  DATA _null_;         PROC FORMAT;        CARDS;

  FORMAT y 10.3 DEFAULT=8.2;  VALUE sexfmt 1='MALE'     Jane 2 Bill 1

  x=12.1; y=10.3;        2='FEMALE';                ……

  PUT x=;           DATA all;           ;

  PUT y=;           INPUT name $ sex @@;     RUN;

  RUN;            FORMAT sex sexfmt.;    

  (程序1)           (程序2第1部分)      (程序2第2部分)

  程序1的输出结果为∶x=12.10 y=10.300;程序2中性别sex输入时用1(男)、2(女),  输出时自动变成MALE(男)、FEMALE(女)。

  4.LENGHT语句(长度语句)

  格式为∶LENGHT [变量名][$]长度]……[DEFAULT=n];

  在DATA步用该语句规定在开始创建的每个数据集中SAS系统用来存贮变量值的字节数目。如∶LENGHT name $20; 设置字符变量name的长度为20。字符变量的长度在1到200之间;数值变量的长度在3-8之间。

  5.LABEL语句(标记语句)

  格式为∶LABEL 变量名='标记内容,包括空格最多40个字符'; 如∶

  LABEL compound='TYPE OF PRUG'; LABEL n='SAMPLE SIZE';

  6.ATTRIB语句(属性语句)

  格式为∶ATTRIB 变量名 [FORMAT=格式] [INFORMAT=输入格式] [LABEL='标记内容']   [LENGHT=[$]长度]……; 如∶

  ATTIB x LENGHT=$4 LABEL='TEST VARIABLE';

  ATTIB saleday INFORMAT=mmddyy. FORMAT=worddate.;

  7.语句标号(参见GOTO语句和LINK语句)

  8.DROP语句(删除语句)

  格式为∶DROP 变量名; 

  在DATA步中使用DROP语句来规定不包含在这个SAS数据集或正被创建的数据集中的变量。当有多个数据集正被创建时,为了有选择地删掉变量, 在每个数据集的名字后面使用DROP= 的数据集选择项(参见DATA语句)。

  9.KEEP语句(保存语句)

  格式为∶KEEP 变量名; 与DROP语句用法相同,作用相反。

  10.RETAIN语句(保留语句)

  格式为∶RETAIN [元素……[初始值|(初始值][,]……)]……];

  元素可以是变量、变量列表或数组名,它们的值是用户想保留的。如果没有列出元素,  SAS保留DATA步中所有变量值。用INPUT语句或赋值语句,再使用RETAIN语句时,仅仅在DATA步第1次重复执行之前,SAS置这些变量为缺失(或RETAIN语句中给出的初值); 以后,变量保持它们的值直到新的值成为有效(如通过赋值语句或INPUT语句的下一次执行)。 在RETAIN语句中命名累加的唯一目的是给郴等于0的其他初值(不用此语句变量的初值为0)。

  11.RENAME语句(换名语句)

  格式为∶RENAME 旧变量名=新变量名……;

  在DATA步中用此语句对正创建的数据集中的变量给出新名字。

  12.WINDOW语句(窗口语句)

  格式为∶WINDOW 窗口名 [选择项] [域……] [GROUP=组[域……]]……;

  此语句可用来在显示管理、交互行方式或非交互方式中创建用户使用的窗口。这些窗口  可用来显示文字说明或接受输入的数据。它们同样有命令行和信息行,而且窗口名字也出现  在窗口的左上角,在这些窗口内同样可以使用窗口命令和功能键。窗口选择项包括∶

  ①COLOR=颜色 用来指明窗口的背景颜色。有下列关键词表明所选的颜色∶

  WHITE(白) BLACK(黑) GREEN(绿) MAGENTA(洋红) RED(红) YELLOW(黄) CYSAN(青兰)   GRAY(灰) BLUE(蓝) BROWN(棕) PINK(粉红) ORANGE(桔黄)。

  ②ROWS=规定窗口的行数;③COLUMNS=规定窗口的列数;④IROW=指明所显示窗口的初始行号;⑤ICOLUMN=指明所显示窗口的初始列号;⑥KEYS=指明包含该窗口功能键定义的文件名。

  下面举一个例子展示WINDOW语句和DISPLAY语句的结合使用方法。

  DATA abc;                      DISPLAY star;

  WINDOW star COLOR=YELLOW         OUTPUT;

  #5 @10 'Enter the number of the Programs'      x=.;

  #7 @10 'd2p7.PRG ------ 7'            STOP;

  #8 @10 'd2p8.PRG ------ 8'            DATA a; SET abc;

  #9 @10 'Number' @20 x PROTECT=NO      IF x=7 THEN %INCLUDE 'a:d2p7.prg';

  #10 @10 'Press Enter to continue';            RUN;

  (程序的第1部分)                (程序的第2部分)

  此程序提交执行后,创建一个名为star的窗口,显示第3~7行上单引号内的信息,光  标停在number之后等待用户输入一个需要运行的程序编号。 若输入数字7后回车,将A盘上的程序d2p7.prg调入SAS系统并运行此程序。若用户希望将d2p7.prg调到PGM窗口等修改后再提交给SAS系统执行,需对倒数第2行进行如下修改∶

  IF x=7 THEN DM "INCLUDE 'a:d2p7.prg' ";

  Ⅴ.用在PROC步的语句

  1.PROC语句(过程语句) 格式为∶PROC 过程名 [选择项]; 

  如∶PROC MEANS DATA=aa MAXDEC=3 MEAN;

  2.VAR语句(变量语句) 格式为∶VAR 变量名; 

  如∶VAR a b c; VAR x1-x10 y;

  3.MODEL语句(模型语句) 格式为∶MODEL 因变量=自变量/[选择项];

  如∶MODEL y=a b x1 x2;

  4.WEIGHT语句(权数语句) 格式为∶WEIGHT 变量名;

  常用在这样的一些分析中∶同每个观测有联系的方差不等,且权数变量的值与方差之倒  数成比例。

  5.FREQ语句(频数语句) 格式为∶FREQ 变量名; 

  变量为数值型的,它的值表示这个观测出现的频数。注意∶WEIGHT变量给出的是观测的相应权数。

  6.ID语句 格式为∶ID 变量名; 

  其作用是识别观测,相当于用1,2,3,……来给观测编号。

  7.WHERE语句 格式为∶WHERE 表达式;

  在SAS系统引入观测到PROC步之前从一个SAS数据集中选择符合特殊条件的观测。如∶PROC PRINT DATA=nc; WHERE county IN ( 'Wake', 'Franklin', 'Dare' ); RUN; 此过程步输出关于Wake、Franklin和Dare县的观测。

  8.CLASS语句(分类语句)

  格式为∶CLASS 变量名; 如∶CLASS a b c;

  该语句被一些SAS过程用来识别分类变量,以便进行统计分析。

  9.BY语句

  格式为∶BY 变量名; 如∶BY a b c;

  当用户希望分组处理数据集时,应该将SORT过程和BY语句结合起来定义数据集被分类的次序。如∶PROC SORT; BY a b c; RUN; PROC MEANS; BY a b c; RUN; 若a、b、c分别有2、3、4个水平,且各水平组合下都有两次以上重复试验数据,则上面两个过程步提交执行后,将把整个数据集拆成24个子集分别求各变量的均数、标准差等统计量的值。

  10.OUTPUT语句(输出语句)

  格式为∶OUTPUT [OUT=SAS数据集名] [关键词=与关键词联系的输出变量名]……; 如∶  PROC MEANS; VAR x; OUTPUT OUT=aaa MEAN=meanx STD=sx; RUN; 这里,aaa为将要输出的SAS数据集名,MEAN、STD为MEANS过程中允许写的选择项中的关键词,meanx、sx是希望在输出结果中用这两个变量分别表示变量x的均数宏准差。

  11.QUIT语句(退出语句)

  格式为∶QUIT; 

  该语句结束交互式运行SAS的过程(注∶在使用时,它与RUN语句的区别并不明显)。

  12.FORMAT语句(格式语句)

  格式为∶FORMAT 变量名 [格式]……;

  用该语句把格式与PROC步的变量联系起来,这些格式可以是SAS格式或用FORMAT过程定义的格式。如∶

  PROC FORMAT;            PROC PRINT DATA=all;

  VALUE sexfmt 1='MALE'         FORMAT sex sexfmt.;

  2='FEMALE';                    RUN;

  (程序的第1部分)           (程序的第2部分)

  13. LABEL语句(标记语句)

格式为∶LABEL 变量名='标记内容,包括空格最多40个字符'; 如∶

PROC PLOT; PLOT x*y; LABEL x='response time' y='hour of day'; RUN;

输出的散布图中水平轴和垂直轴使用变量的标记,而不使用变量名。

  14.ATTRIB语句(属性语句)

格式和用法参见“Ⅳ.用在DATA步的信息语句”中关于该语句的介绍。

  Ⅵ.全程语句(用在任何地方的SAS语句)

  1.COMMENT语句(注释语句)

  ①格式为∶ * 信息的具体内容;

  信息的长度可任意,但信息中不能包含分号,最后的分号表示语句结束。 在一个SAS程序中可用任意多个注释语句。

  ②格式为∶ /* 信息的具体内容 */

  这种注释语句可出现在SAS语句里面空格能够出现的任何地方,中间的信息可包含分号。

  2.DM语句

  该语句允许用户以SAS语句的方式提交在SAS显示管理系统中可使用的任何有效命令。

  ①命令本身不含单引号 格式为∶ DM '显示管理命令;……'[窗口名]; 如∶

  DM 'CLEAR'; 其作用是清除窗口内的内容。DM 'LOG; COLOR SOURCE RED';其作用是取LOG为活动窗口,并改变所有源程序语句为红色。该语句执行结束后,PGM窗口变成活动窗  口。DM 'MENU' MENU; 其作用是进入SAS过程菜单系统,可通过填写过程面板来提交给SAS系统执行。

  ②命令本身含单引号 格式为∶ DM " INCLUDE 'a:TTEST.PRG' "; 此语句执行后所产  生的作用等价于在PGM窗口的命令行上使用INCLUDE 'a:TTEST.PRG'命令。

  3.X语句

  格式①为∶ X 'PC-DOS操作系统命令';

  用X语句在SAS会话中发布PC-DOS操作系统命令。例如,在SAS会话期间决定要建立一个名为week的新目录,在这个目录中存贮永久的数据集moday,用以下语句实现。

  X 'mkdir week'; LIBNAME SAVE 'week'; DATA SAVE.MODAY; (多个SAS语句)

  格式②为∶ X;

  使用没有规定操作系统命令的X语句来建立操作系统子会话,此语句执行后进入PC-DOS操作系统,可执行操作系统命令,输入EXIT退出PC-DOS操作系统。

  4.TITLE语句(标题语句)

  格式为∶ TITLE[n] ['标题的具体内容,最多132个字符'];

  n应该是一具体的数字,它必须紧跟在词TITLE后面,用来规定标题所在的行数。一页上最多可产生10个标题行。例如∶

  TITLE 'The first line'; TITLE3 'The third line'; 欲取消所有的标题行,语句为∶TITLE; 欲取消第3行及以后的所有标题行,语句为∶TITLE3;

  5.FOOTNOTE语句(脚注语句)

  格式为∶ FOOTNOTE[n] ['脚注的具体内容']; 一页上最多可产生10个脚注行。 其用法  和取消的方法与TITLE语句类似,从略。

  6.RUN语句(运行语句)

  格式为∶ RUN [CANCEL];

  不加后面的选择项时,通知SAS系统执行RUN语句之前的SAS步;当发现SAS程序有错误,不希望运行时,使用选择项CANCEL。

  7.ENDSAS语句(结束语句)

  格式为∶ ENDSAS;

  该语句让SAS作业或会话在当前DATA或PROC步的结尾终止。

  8.LIBNAME语句(库名字语句)

  格式为∶ LIBNAME 库标记 '路径和目录名';

  该语句用来定义程序存取的一些目录,用于读入或产生SAS文件(包括SAS数据集)。如∶

  LIBNAME store 'c:\inventry';          CARDS;

  DATA store.mar;               (数据行)

  INPUT day mmddyy8. mean groc dairy;      ;

  (程序的第1部分)              (程序的第2部分)

  此例产生一个永久的SAS数据集store.mar,其第1水平名字store是存贮这个永久文件  的库标记,LIBNAME语句规定了库标记store与C盘上目录inventry之间的联系。当这些语句执行后,产生的永久数据集mar.ssd被自动存贮在C盘的目录inventry上。

  9.FILENAME语句(文件名语句)

  格式为∶ FILENAME 文件标记 [设备类型] ['规定外部文件路径、目录和文件名'];

  其中设备类型有两种,即PRINTER(打印机)和TERMINAL(终端屏幕)。

  该语句把SAS的文件标记(一个文嘉考名字)与一个外部文件的全名字(目录加上文件名)  联系起来。于是,这个文件标记在存取外部文件的SAS程序语句里(INFILE,FILE和%INCLUDE)  被用来作为缩写的标记。如∶

  FILENAME food 'shopping.dat';     FILENAME food 'shopping.dat';

  DATA marker;            LIBNAME save 'allveg';

  INFILE food;             DATA save.marker; INFILE food;

  INPUT day mmddyy8. meat groc dairy;  INPUT day mmddyy8. meat groc dairy;

  RUN;                RUN;

  (程序1)               (程序2)

  程序1从当前目录下用文件标记food识别的文件中读数据行, 并创建一个临时数据集  marker;程序2增加了LIBNAME语句,创建一个永久的SAS数据集,它存贮在用save作为库标记的目录下。

  FILENAME语句与LIBNAME语句的区别在于∶前者对一个外部文件定义文件标记,以便在FILE,INFILE或%INCLUDE语句中使用;而后者在用户的程序中用来读入或产生永久SAS文件(如SAS数据集)时定义一个库标记。

  10.%INCLUDE语句

  格式为∶ %INCLUDE 文件标记|'文件名'[/SOURCE2];

  其中选择项SOURCE2让SAS记录(即LOG窗口)来显示所引入的程序的源程序语句。  该语句的作用相当于在PGM窗口的命令行上使用INCLUDE命令从外部文件中调指定文件进入PGM窗口,并按F10键提交给SAS系统立即执行。

  11.OPTIONS语句(设置SAS系统选择项语句)

  格式为∶ OPTIONS 选择项的具体内容;

  该语句临时改变SAS软件在安装时已设置的SAS系统选择项中的一项或几项。SAS系统的全部选择项可通过PGM窗口的命令行上使用HELP OPTIONS命令调出OPTIONS窗口来了解或修改。 常用于OPTIONS语句中的选择项有∶LS=n(规定输出行的宽度,n在64~132之间)、PS=n(规定输出内容在每页上被打印的行数,n在20~500之间),如∶OPTIONS LS=70 PS=30;

  5.4 SAS过程名及功能简介

  Ⅰ.SAS/BASE模块中的过程

  1.APPEND将一个SAS数据集中的观测子到另一个SAS数据集之后。

  2.CALENDAR显示按日历格式形成的SAS数据集中的数据。

  3.CATALOG管理SAS目录中的项目,如显示一个目录的内容等。

  4.CHART产生垂直和水平条图、块图、圆图和星图。

  5.CIMPORT把在另一个主机操作系统上由PROC CPORT创建的一个传输顺序文件按SAS目录的要求转换成它的原始形式。

  6.COMPARE比较两个SAS数据集中的变量的值, 并报告发现的差别。

  7.CONTENTS从一个SAS库中打印一个或多个文件的内容的描述信息。

  8.COPY拷贝一个完整的SAS库或选择库中的成员。

  9.CORR计算变量之间的相关系数, 包括皮尔逊的积矩和加权积矩相关。

  10.CPORT将一个SAS库,特别是SAS数据集或SAS目录转换成一个顺序文件格式,此格式能被传送到第6版系统上去。

  11.DATASETS对一个SAS库进行列表、拷贝、更名、子和删除SAS文件(数据集和目录)。

  12. DBF使SAS数据集与dBASEⅡ、dBASEⅢ文件互相转换。

  13. DIF使SAS数据集与数据交换格式(DIF)文件互相转换。

  14. DOWNLOAD实现微机与主机间的连接,并使信息从主机向微机传递。

  15. FORMAT为字符型或数值袖量定义你自己的格式。

  16. FORMS为信封、邮件等打印标签。

  17. FREQ产生1~n维的频数表和交叉表。对于2维表,进行χ2检验等。

  18. MEANS为数值袖量产生简单的描述性统计量。

  19. PLOT绘制两个连续变量之间的散布图、线图等。

  20. PRINT打印SAS数据集中的观测。

  21. PRINTTO为SAS过程的输出定义一个目标, 也可改变SAS LOG的目标。

  22. RANK为一个SAS数据集中的一个或多个数值袖量计算秩。

  23. SORT按照一个或多个变量整理SAS数据集中的观测。

  24. STANDARD按给定的均数宏准差对SAS数据集中的一些或全部变量进行标准化,并产  生一个包含标准化值的新SAS数据集。

  25. SUMMARY对SAS数据集中的数值变量计算描述性统计量,并把结果输出到一个新SAS数据集中去。

  26. TABULATE从分类变量、分析变量和统计量关键词的组合构造描述性统计量的表。

  27. TIMEPLOT绘制一个或多个变量随时间变化的图。

  28. TRANSPOSE使SAS数据集中的观测与变量互相转换。

  29. UNIVARIATE对数值变量产生简单的描述性统计量(包括分位数)。

  30. UPLOAD实现微机与主机间的连接,并使信息从微机向主机传递。

  Ⅱ.SAS/STAT模块中的过程

  1. ACECLUS对欲进行样品聚类分析的资料进行预处理,使之更好地满足聚类分析的条件。

  2. ANOVA对来自各种试验设计的平衡资料进行方差分析。

  3. CALIS用协方差结构分析估计线性结构模型的参数,并进行检验。

  4. CANCORR实现典型相关分析、偏典型相关分析和典型冗余分析。

  5. CANDISC实现典型判别分析。

  6. CATMOD利用模型对分类资料进行分析。

  7. CLUSTER用11种方法对SAS数据集中的观测进行系统聚类分析。

  8. CORRESP实现简单的和多重的对应分析。

  9. DISCRIM对定量指标进行判别分析,并给出判别函数。

  10. FACTOR对资料进行几种类型的公因子分析和主成分分析。

  11. FASTCLUS对很大的数据集进行聚类分析,并能较好地把全部观测分为两类或三类。

  12. FREQ参见“SAS/BASE模块中的过程”第17个过程。

  13. GLM用最小平方法拟合一般线性模型,可实现回归分析、方差分析、协方差分析、多  元协方差分析和偏相关分析。

  14. LIFEREG拟合失效时间资料的参数模型。

  15. LIFETEST对生存资料进行非参数统计分析。

  16. LOGISTIC用最大似然法对二项或有序反应资料拟合线性logistic回归模型。

  17. NESTED对来自系统分组设计的资料进行随机效应的方差分析和协方差分析。

  18. NLIN对非线性模型的参数进行积最小平或加权最小平估计。

  19. NPAR1WAY对来自单因素设计的定量资料进行非参数统计分析和对秩进行方差分析。

  20. ORTHOREG对病态资料进行回归分析。

  21. PHREG依据COX比例风险模型对生存资料进行回归分析。

  22. PLAN对嵌套和交叉试验构造设计方案,并使方案随机化。

  23. PRINCOMP对资料进行主成分分析。

  24. PRINQUAL用替换最小平方法使转换的变量的协方差或相关矩阵的特性最优, 从而获得变量的线性或非线性转换。

  25. PROBIT对生物检定量反应资料或其他离散事件资料,计算回归参数和自然反应率的  最大似然估计量。

  26. REG利用最小平方法拟合线性回归模型,可通过各种模型选择确定自变量的最优子集。

  27. RSREG拟合一个完全的二次反应曲面的参数,并分析所拟合的曲面以便确定最优反应  的因子水平。

  28. SCORE使两个SAS数据集中的数据相乘获得某线性组合变量(如主成分、公因子)的得分值。

  29. STEPDISC对定量资料进行逐步判别分析,以便实现变量筛选。

  30. TRANSREG用替换最小平方法拟合资料获得线性回归,从而得到变量的线性和非线性  转换。

  31. TREE将聚类分析的结果用树状图的形式打印出来。

  32. TTEST对成组设计资料进行方差齐性检验、一般t检验和t'检验。

  33. VARCLUS对定量资料进行变量聚类分析。

  34. VARCOMP计算一般线性模型中方差分量的估计量。

  5.5 SAS命令简介

  SAS命令很多,这里仅给出使用SAS必须掌握的几组重要的命令,命令后中括号里的内容为可选项,使用时中括号不应写出。

  1. 显示管理全程命令(可在任一窗口的命令行上使用,回车后生效)

  (1)窗口管理命令(可用HELP 31 2命令显示)

  BYE(或ENDSAS) 彻底退出SAS DMS,回到SAS子目录状态;

  END      保留特定窗口内修改过的内容并退出该窗口;

  CANCEL     取消特定窗口内修改过的内容并退出该窗口;

  X      保留窗口内信息,临时退出SAS DMS,回到DOS状态,可执行各种DOS命令;

  EXIT      在使用X命令后的DOS状态下,快速返回SAS DMS。

  (2)翻卷命令(可用HELP 31 4命令显示)

  TOP(到顶)  BOTTOM(或BOT)(到底)  RIGHT MAX(右移最大量)

  N (使从上到下的第N行内容成为命令行下的第1行)

  (3)标记、截取和连接命令(可用HELP 31 6命令显示)

  ①标记命令

  MARK(标记若干行);        MARK CHAR(标记字符串);

  MARK BLOCK(标记一矩形区域);   UNMARK(取消标记)。

  前3个标记命令的操作方法:先在命令行上键入命令,再把光标移至欲标记内容之首,按回车键;再在欲标记内容之尾,重复操作1次。若利用相应的功能键,则可分别将光标移至欲标记内容之首、尾各按1次功能键即可。UNMARK命令只需执行一次即可。

  ②截取命令

  STORE [BUFFER=文件名] ;     CUT [BUFFER=文件名]。

  把标记后的内容直接存入缓冲区或用给定的文件名存入缓冲区。如果省略中括号里的内容,则后一次存入的内容就替代了前一次存入的内容。 STORE与CUT的区别是:用STORE时,标记后的内容仍保留在原处;用CUT时,标记后的内容从原处被切除,CUT不能在OUTPUT窗口上使用。

  ③连接命令

  PASTE [BUFFER=文件名]

  把用STORE或CUT命令存入缓冲区的内容调到光标所在的窗口里来。操作方法:先在命令行上输入命令,光标下移到有行号的编辑区域内,再按回车键。

  2. 文本编辑命令之一(可用HELP 31 6命令显示)

  本组命令在命令行上使用,回车后生效,其中最常用的命令有:

  AUTOWRAP ON    使一行中超过136个字符部分自动移到下行;否则,将被删除;

  CLEAR        清屏;

  FILE 'PRN:'      把窗口内的文件送到打印机上去;

  FILE '盘名:文件名'   文件存入指定的盘;

  INCLUDE '盘名:文件名' 把指定的盘上某文件调入窗口。

  3. 文本编辑命令之二(可用HELP 31 6 34和HELP 31 6 35命令显示)

  本组命令只在PGM窗口内行号上使用,其中一部分可单独使用, 另一部分需与操作定位命令配合起来使用。如果一个完整的命令需通过2行或3行上发送命令才能完成, 则中间过程都要靠移动光标键来实现,最后按一次回车键使之生效。

  (1)单行命令

  ①只在一行上使用的一般命令(回车后生效)

  CL   把当前行上的字符由大写改成小写;

  CU   把当前行上的字符由小写改成大写;

  D[N]  删除自当前行起的N行,D或D1都表示只删除当前行,其他命令中N的用法相似;

  I[N]  在当前行之后插入N个空行;

  IB[N] 在当前行之前插入N个空行;

  JC[N] 以第N列为中点, 使当前行内容置中;

  JL[N] 自左至右的第N列为当前行的第1个字符的位置;

  JR[N] 自左至右的第N列为当前行的最后1个字符的位置;

  R[N]  使当前行的内容在该行之后复制N行;

  >[N]  使当前行内容右移N个字符;

  <[N]  使当前行内容左移N个字符;

  TF[N] 自当前行起, 使相邻的所有行中的每一行上保留N个字符( 含字符间的空格);

  TS[N] 将当前行分裂成两行,并使这两行之间留出N个空行。操作方法是: 先键入命令,  光标右移至欲分裂处,再按回车键。

  ②只在一行上使用的特殊命令(回车后生效)

  COLS  在当前行上显示1个水平标尺;

  MASK  标记当前行的内容,在所需之处可用I、IB命令反复获得该行的内容;

  TA[N] 在当前行上设置跳格标尺,其标志是每隔N个字符处有一个T字符;

  D   在键入上述3个特殊命令的行号上,键入D命令,则可取消特殊命令。

  (2)两行上使用的块命令(操作方法:第2次键入命令后再按回车键)

  功能:使键入命令的两行及其中间的所有行(简称为“文件块”)上的内容作同样的操作。

  CCL  使文件块的字符由大写改成小写;

  CCU  使文件块的字符由小写改成大写;

  DD   删除文件块的全部内容;

  JJC[N] 以第N列为中点, 使文件块的内容置中;

  JJL[N] 自左至右的第N列为文件块的第1个字符的位置;

  JJR[N] 自左至右的第N列为文件块的最后1个字符的位置;

  RR[N] 使文件块的内容在该行之后复制N次;

  >>[N] 使文件块的内容右移N个字符;

  <<[N] 使文件块的内容左移N个字符。

  (3)操作定位命令

  A   即AFTER之意,操作的结果将出现在键入A的那一行之后;

  B   即BEFORE之意,操作的结果将出现在键入B的那一行之前;

  O   即OVERLAP之意,操作的结果将重叠于键入O的那一行之上。

  (4)与操作定位命令配合使用的命令(最后一步按回车键)

  ①只在一行上使用的单行命令

  C[N]  把自当前行起的N行内容拷贝到由A、B命令指定的位置上去;

  M[N]  把自当前行起的N行内容移到由操作定位命令指定的位置上去。

  ②在两行上使用的块命令

  CC[N] 把文件块的内容拷贝到由A、B命令指定的位置上去;

  MM[N] 把文件块的内容移到由操作定位命令指定的位置上去。

  5.6 SAS中宏知识简介

  1. 宏变量

  宏变量(也称符号变量)属于SAS宏语言的范畴,和数据步中的变量的概念是不一样的。除  了数据行外,你可以在SAS程序的任何地方定义和使用宏变量。数据步变量是和数据集相联系的,而宏变量是独立于数据集的。数据集变量的值取决于正在处理的观测,而一个宏变量的值总是保郴变,直到被明确改变。

  定义一个宏变量的最简单的办法是使用宏语句%LET, 如: %let dsn=Newdata; DSN就是宏变量的名字,Newdata是它的值。宏变量命名遵从一般的SAS命名规则,宏变量的值是一个字符串。

  要引用宏变量的值,在宏变量的前面放“&”,如title "Display of Data Set &dsn";

  宏处理器用DSN的值去代替&dsn,结果得到TITLE "Display of Data Set Newdata";

  值得注意的∶是这里的标题必须用双引号括起来,而不能用单引号,因为宏处理器只对双  引号中引用的宏变量进行这种处理,而把单引号中的所有字符都看作是标题的内容。

在一个SAS程序中,你可以根据需要引用宏变量任意次, 在你改变它之前它的值一直保持不变。下面的程序就引用了DSN两次。

  DATA temp; SET &dsn; IF age>=20;

  PROC PRINT; TITLE "Subset of Data Set &dsn"; RUN;

  每次&dsn一出现,宏处理器就用Newdata代替它,SAS实际执行的语句是∶

  DATA TEMP; SET NEWDATA; IF AGE>=20;

  PROC PRINT;  TITLE "Subset of Data Set Newdata";  RUN;

  你也可以创建一个包含SAS语句的宏变量,如:

  %LET plot=%str(     这种情况下,宏变量的值都作为函数%STR的实参, 于是分

  PROC PLOT;       号成为宏变量值的一部分,而不会被当做%LET语句的结束。

  PLOT income*age;    要改变宏变量的值,只需用%LET语句重定义, 宏变量也可

  RUN;          以赋空值,如:

  )           %LET dsn=Nextdata; %LET plot=;

  第1个语句对DSN重新赋值Nextdata,第2个语句对PLOT赋空值。宏变量也可以嵌套引用:

  %LET dsn=Olddata;        DATA temp;

  %LET yvar=Income;        SET &dsn;

  %LET xvar=Age;          IF age>=20;

  %LET plot=%str(         &plot

  PROC PLOT;           PROC PRINT;

  PLOT &yvar*&xvar;        TITLE "Subset of Data Set &dsn";

  RUN;              RUN;

  )

  (程序的第1部分)         (程序的第2部分)

  SAS实际执行的是如下的语句:

  DATA TEMP; SET OLDDATA; IF AGE>=20;

  PROC PLOT; PLOT YVAR*XVAR; RUN;

  PORC PRINT; TITLE "Subset of Data Set Olddata"; RUN;

  2.

  宏就是存贮的一个文本,最简单的宏工作起来很像一个宏变量,但是复杂的宏可以做许多  宏变量无法完成的事。下面是一个最简单的宏定义。

  %MACRO dsn;  Newdata %MEND dsn;

  宏定义总是由%MACRO语句开始, 而且必须包含一个宏名。宏名遵从一般的SAS命名规则, 这里的宏名叫DSN。Newdata是宏的内容, %MEND作为宏定义的结束语句;这里的 %MEND语句为了清晰还重复了宏名。要调用一个宏,只需放一个百分号(%)在宏名的前面,如: TITLE "Display of Data Set %dsn"; 宏处理器执行宏展开,用宏内容去代替%dsn,TITLE语句成为: TITLE "Display of Data Set Newdata"; 同样,标题必须用双引号括起来。

  一个SAS程序可以包含多个宏,一个宏也可以被多次调用,要改变一个象DSN这样简单的宏的内容,只需重新定义宏,对简单的文本代换,用宏变量比定义一个宏效率要高,但是当任务比较复杂的时侯,宏救宏变量要优越得多了。下面的程序创建一个包含整段SAS程序的宏。

  %MACRO plot; PROC PLOT; PLOT income*age; RUN; %MEND plot;

  以后调用宏如下:          SAS实际执行的语句是:

  DATA temp;               DATA TEMP;

  SET olddata;              SET OLDDATA;

  IF age>=20;              IF AGE>=20;

  %plot                PROC PLOT;

  PROC PRINT;               PLOT INCOME*AGE;

  RUN;                  RUN;

  PROC PRINT;  RUN;

  假设在PROC PLOT中的绘图变量可以改变,你就可以用宏变量引用去替换PLOT语句中的变量名,然后在调用宏之前用%LET语句给宏变量赋值。

  %MACRO plot;             SAS 实际执行的是如下的语句:

  PROC PLOT;                DATA TEMP;

  PLOT &yvar*&xvar;           SET OLDDATA;

  RUN;                 IF AGE>=20;

  %MEND plot;              PROC PLOT;

  DATA temp;               PLOT INCOME*AGE;

  SET olddata;                 RUN;

  IF age>=20;                  PROC PLOT;

  %LET yvar=income;           PLOT INCOME*YRS_EDUC;

  %LET xvar=age;              RUN;

  %plot                 PROC PRINT;

  %LET xvar=yrs_educ;            RUN;

  %plot

  PROC RRINT;

  RUN;

  宏变量和宏结合起来使用,为灵活设计提供了极大的方便。当程序较长的时侯,就象上面  的程序一样,总是使用%LET语句就显得不那么方便了,这时可以使用宏参数, 即定义宏变量作为%MACRO语句的一部分。

  %MACRO plot(yvar,xvar); PROC PLOT; PLOT &yvar*&xvar; RUN; %MEND plot;

  %MACRO语句的括号中定义的宏变量就是宏参数,当调用宏的时侯,需将值传递给宏参数,   如: %plot(income,age) 宏处理器把第1个值和第1个宏变量匹配,第2个值和第2个宏变量匹配……因此,这些参数叫做位置参数,于是产生下面语句:

  PROC PLOT; PLOT INCOME*AGE; RUN;

  假设你经常创建数据集TEMP和绘制PLOT图,你可以将数据步做成一个宏,而过程步做成另一个宏,然后在第3个宏里调用它们。注意最好加上注释说明你要做什么。

  %MACRO create;            %MACRO analyze(yvar,xvar);

  Data temp;               %*Create the Data Set; 

  SET olddata; IF age>=20;           %create

  %MEND create;             %*Plot the Variable Selected;

  %MACRO plot;              %plot

  PROC plot;                 %MEND analyze; 

  PLOT &yvar*&xvar; RUN;      

  %MEND plot;             

  (程序的第1部分)           (程序的第2部分)

  在宏ANALYZE中,由“%*”开始的语句是宏注释语句, 它们用于对宏内做的事情作注解。当宏较长的时侯,是很必要的。当你定义完这些宏后,就可以通过调用宏来运行程序。

  %analyze(income,age)

  如果你想改变CREATE,重新定义它,则:

  %MACRO create;

  DATA temp2; SET olddata(obs=100); IF age>=20;

  %MEND create;

  然后调用ANALYZE,方法是: %analyze(income,age)

  当然,你也可以把整个程序段都放入ANALYZE,而不去调用其他宏,但是,定义CREATE和PLOT的优点是你可以在调用ANALYZE之前分别重新定义和调试它们,在规模较大的宏中, 模块结构是很重要的。

  当你使用宏ANALYZE时,假设有时你需要执行宏CREATE中的DATA步,而有时又可直接从PROC PLOT开始,重新定义ANALYZE,使用%IF-%THEN语句。

  %MACRO analyze(getdata,yvar,xvar);

  %IF &getdata=yes %THEN %create;  %ELSE %plot;

  %MEND analyze;

  如下调用ANALYZE,方法为:

  %analyze(yes,income,age) %analyze(no,income,yrs_educ)  产生:

  DATA TEMP;  SET OLDDATA; IF AGE>=20; PROC PLOT; PLOT INCOME*AGE; RUN;

  PROC PLOT;  PLOT INCOME*YRS_EDUC; RUN;

  如果在%THEN从句中有多个语句, 使用%DO-%END组,如:

  %MACRO analyze(getdata,yvar,xvar);

  TITLE; %IF &getdata=yes %THEN %DO;  

  %create  TITLE3 "Data Set Created for This Plot"; %END;

  %plot

  %MEND analyze;

  如果我们调用ANALYZE, 方法如下: %analyze(YES,income,age) 。

  那么产生的语句是: “PROC PLOT; PLOT INCOME*AGE; RUN; ”。

  宏处理器并没有调用宏CREATE去创建一个数据集, 因为宏处理器在把宏展开时并不把小写字母转换为大写。于是%IF语句作的比较是YES=yes,当然为假,事与愿违。为了在调用时不管大小写都正确,应该修改ANALYZE如下:

  %MACRO analyze(getdata,yvar,xvar);

  %IF %UPCASE(&getdata)=YES %THEN %create; %ELSE %plot;

  %MEND analyze;

  其中宏函数%UPCASE把小写转换为大写。

  假设你想创建一系列名字用于SAS语句, 如DATA或VAR语句,可以借助宏来实现。

  %MACRO names(name,number)

  %DO n=1 %TO &number; &name&n  %END;

  %MEND names;

  宏NAMES把参数NAME的值和宏变量的值连接起来形成一系列名字,参数NUMBER的值是宏变量N的终止值。于是在DATA步中调用NAMES,方法如下:

DATA %names(dsn,5); 产生语句: DATA DSN1 DSN2 DSN3 DSN4 DSN5;

  3. 数据步中的宏变量

  假设你想把一个数据集的观测数放进一个FOOTNOTE语句中,首先定义一个宏,如:

  %MACRO create;

  DATA temp;

  SET olddata END=final; IF age>=20 THEN DO; n+1; OUTPUT; END;

  IF final THEN CALL SYMPUT('number',n); RUN;

  %MEND create;

  以后一旦调用CREATE,则CALL SYMPUT语句将计数变量N的值传递给宏变量NUMBER,NUMBER 可以是以前创建的宏变量,也可以是在当前的DATA步创建的。这个宏变量以后可以直接引用, 也可以在DATA步用SYMGET函数引用。从而实匣同的数据步中的值传递,如:

  x=SYMGET('number'); 数据步变量X的值就是数据集TEMP中的观测个数。

  也可以在DATA步用SYMGET函数引用。从而实匣同的数据步中的值传递,如:

  x=SYMGET('number'); 数据步变量X的值就是数据集TEMP中的观测个数。