1、第第11章章 全局通用语句全局通用语句清华大学经管学院清华大学经管学院 朱世武朱世武ZResdat样本数据:样本数据:SAS论坛:论坛:第1页,共60页。v 全局通用语句是可以用在任何地方的SAS语句。这些语句既可以用在数据步(DATA步),也可以用在过程步(PROC步),甚至还可以单独使用。第2页,共60页。注释语句注释语句 v 注释语句可以放在SAS程序的任何地方作为程序的说明,或者介绍整个程序的步骤或算法等。第3页,共60页。语句格式格式一:*message;信息的长度可任意,但不能包含分号(;),最后的分号表示信息结束。格式二:/*message*/中间的信息可以包含分号,但这种形式的
2、注释不能嵌套。第4页,共60页。应用举例应用举例 例11.1 注释语句应用。proc print data=ResDat.stk000002(obs=10)noobs;/*输出前10个观测,不输出观测序号*/var oppr hipr lopr clpr;title股票行情;run;proc means data=ResDat.stk000002;*对数据集ResDat.stk000002使用means过程;var oppr hipr lopr clpr;/*输出变量oppr hipr lopr clpr的均值*/run;第5页,共60页。例11.2 标准SAS程序开头,记录SAS程序信息的注
3、释形式。/*-*/*-Begin Estimation for Grunfelds Investment Models-*/*-See SAS/ETS Users Guide,Version 5 Edition,-*/*-pages -*/*-*/第6页,共60页。X语句语句 运行SAS系统时,发布主机操作系统命令。语句格式:X;其中:command规定主机操作系统的命令。例11.8 应用举例。x mkdir d:ResDat1;libname ResDat1 d:ResDat1;data ResDat1.class;set ResDat.class;run;例中,在SAS会话期间用主机操作系
4、统命令创建一个目录D:ResDat_3.注意:键入EXIT命令退出操作系统返回到SAS会话。第7页,共60页。TITLE语句语句 TITLE语句规定SAS输出文件和其它SAS输出标题。每一个TITLE语规定一级标题,最多可规定10级标题。语句格式:TITLE;其中:n紧跟在词TIILE后面(不能有空格)的数字,用来规定标题的级别;text规定标题的内容。规定标题的内容一直有效,但可以重新规定或取消。第8页,共60页。例11.9 只规定第1和第5级标题的内容时,中间标题为空白。title this is the 1th title line;title5 this is the 5th titl
5、e line;例11.10 取消所有标题内容。title;例11.11 取消第3级及以后的所有标题内容。title3;第9页,共60页。FOOTNOTE语句语句 FOOTNOTE语句在每一页的底部输出一些脚注行。最多可产生10个脚注行。语句格式:FOOTNOTE;其中:n紧跟在词FOOTNOTE后面(不能有空格)的数字,用来规定脚注的行号;text规定脚注行的内容。规定的脚注行内容将输出在所有过程的输出页上,但可以重新规定或取消。第10页,共60页。例11.12 规定脚注。footnote 清华大学金融系;例11.13 取消所有已规定的脚注行。footnote;例11.14 取消第3个及以后的
6、所有脚注行。footnote3;第11页,共60页。RUN语句语句 RUN语句使SAS程序被执行。语句格式:RUN;其中:CANCEL让SAS系统结束当前步的执行。SAS将输出一个信息说明这一步没有执行。但CANECL选项不能阻止包含CARDS或CARDS4语句的DATA步执行。第12页,共60页。例11.15 不能省略RUN语句的情况。title using proc means;proc means data=ResDat.class min max;var age height weight;run;/*此RUN语不能省略省略RUN语句*/title using proc plot;pr
7、oc plot data=ResDat.class;plot age*height;run;例中,第一个RUN语句在读第二个TITLE语之前执行PROC MEANS步。如果省略第一个RUN语,SAS系统在它读PROC PLOT语句之后执行PROC MEANS步。这时第二个TITLE语覆盖第一个TITLE语,也就是两个过程的输出都包含了标题USING PROC PLOT。所以,这种情况下,第一个RUN语不能省略。第13页,共60页。using proc plot 17 MEANS 过程 变量 最小值 最大值 -Age 11.0000000 16.0000000 Height 51.3000000
8、 72.0000000 Weight 50.5000000 150.0000000 -using proc means 16 MEANS 过程 变量 最小值 最大值 -Age 11.0000000 16.0000000 Height 51.3000000 72.0000000 Weight 50.5000000 150.0000000 -不省略run省略run第14页,共60页。例11.16 使用选项CANCEL。proc means data=ResDat.idx000001;var clpr X;/*注意数据集中没有变量X*/run cancel;例中,当发现SAS程序有错误不能运行这一段
9、序时,使用选项CANCEL结束当前步的执行。第15页,共60页。LIBNAME语句语句 v LIBNAME语句定义SAS逻辑库。v LIBNAME语句把一个libref(库标记名)和一个目录名联系起来,使用户可在SAS语句中使用库标记来指示这个目录。第16页,共60页。语句格式 LIBNAME libref ;LIBNAME libref Clear;LIBNAME libref|_ All_ List;三种格式反映了LIBNAME语句的三种用法。选项说明 Libref规定逻辑库Engine规定引擎Sas-Data-Library规定主机系统下一个有效的物理地址Access=Readonly|
10、Temp规定逻辑库为只读或可修改属性Clear清除与库标记的联系_All_列出所有逻辑库的属性List在Log窗口列出逻辑库的属性。第17页,共60页。应用举例应用举例 例11.18 LIBNAME规定不同引擎的逻辑库。libname SASDB1 tape SAS-data-library;/*规定一个TAPE引擎*/libname SASDB2 V6 SAS-data-library;/*规定版本为V6引擎*/libname SASDB3 ODBC SAS-data-library;/*规定版本为ODBC引擎*/例11.19 不同引擎的逻辑库数据集的转换。libname ResDatv6
11、v6 D:ResDat;data ResDatv6.class;set ResDat.class;run;例11.20 对已经存在的逻辑库使用LIBNAME语句联系一个SAS引擎。libname SASDB3 ODBC;第18页,共60页。例11.21 一个物理地址联系两个库标记。libname ResDat1 D:ResDat;libname ResDat2 D:ResDat;run;例11.23 脱离与库标记的联系。LIBNAME libref CLEAR;例11.24 列出逻辑库的属性。libname ResDat list;/*列出逻辑库ResDat的属性*/libname _all_
12、 list;/*列出所有逻辑库的属性*/run;第19页,共60页。例11.25 多个物理地址指定一个逻辑库。libname new(d:resdat d:resstk);例11.26 多个不同的逻辑库组成一个逻辑库。libname new(resdat resstk);第20页,共60页。FILENAME语句语句 v FILENAME语句把SAS的文件标记与外部文件的全名或输出设备联系起来。v 用INFILE,FILE,或%INCLUDE语句中调用SAS文件前,要先使用FILENAME语句来定义文件。v 用户可以把一个文件标记同单个外部文件建立联系,也可以很多外部文件建立联系。v 文件标记和
13、文件名字之间的联系只保持在SAS会话期间,或下一个FILENAME语句再定义前。第21页,共60页。语句格式语句格式 建立文件标记与外部文件的联系:FILENAME fileref external-file;清除文件标记与外部文件的联系:FILENAME fileref|_ALL_CLEAR;建立文件标记与某个输出设备的联系:FILENAME fileref device-type;列出外部文件的属性:FILENAME fileref|_ALL_LIST;其它格式:FILENAME fileref CATALOG catalog;FILENAME fileref FTPexternal-fi
14、le;FILENAME fileref SOCKET external-file;FILENAME fileref SOCKET:portno SERVER;第22页,共60页。选项说明选项说明 部分选项说明:设备类型(DEVICE-TYPE)Fileref规定任意有效的SAS名External-File规定外部文件的物理地址和名字Device-Type规定要联系输出设备的类型Host-Option规定主机系统的属性Disk磁盘引擎器Tape磁带引擎器Dummy空设备Terminal 终端Printer打印机Plotter绘图仪第23页,共60页。应用举例应用举例 例例11.2911.29 读
15、入外部文件创建SAS数据集。filename delinfo d:resdatdelinfo.txt;data delinfo(label=退市信息|delist information);format stkcd$6.lstknm$12.lstdt yymmdd10.delistdt yymmdd10.exchflg$1.stktype$1.;informat stkcd$6.lstknm$12.lstdt yymmdd10.delistdt yymmdd10.第24页,共60页。exchflg$1.stktype$1.;labelstkcd=股票代码|stock codelstknm=最新
16、股票名称|latest stock namelstdt=股票上市日|list datedelistdt=退市日期|delist dateexchflg=交易所标识|exchange flagstktype=股票类型|stock type;infile delinfo delimiter=09x missover dsd firstobs=2;input stkcd$6.lstknm$12.lstdt yymmdd10.delistdt yymmdd10.exchflg stktype 1.;run;例中,用文件标记delinfo识别外部文件(d:resdatdelinfo.txt),读取其中的
17、数据行,创建一个临时数据集delinfo.第25页,共60页。例11.34 将逻辑库的所有文件传送到一个压缩文件。filename ResDat d:ResDatResDat;proc cport library=ResDat file=ResDat memtype=data;run;例中,将SAS逻辑库ResDat下的所有数据集传送到压缩文件ResDat中。例11.35 恢复将传送压缩为一个逻辑库。libname ResDat_0 d:ResDat_0;proc cimport library=ResDat_0 infile=ResDat;run;例中,恢复由CPORT过程生成的传送压缩文件
18、ResDat为原来的形式。第26页,共60页。MISSING语句语句 MISSING语句规定数值数据缺失值的代表字符。它通常出现在DATA步,但其使用范围是全局性的。语句格式语句格式MISSING character-1,其中:character缺失值代表字符。第27页,共60页。应用举例应用举例 例11.42 读入有缺失值数据时必须用MISSING语句。data fitness;missing n r;input name$age weight;cards;Wang 23 78Hu R 60Tian R N;例中,N表示被调查人不知道,R表示被调查人拒绝回答问题。MISSING语句指示在输入
19、数据行里N和R的值是缺失值而不是无效的数据值。nameageweightWang2378Hu R60Tian R N第28页,共60页。OPTIONS语句语句 v OPTIONS语句临时改变SAS系统的选项设置。v 改变后的选项设置在以后的SAS会话或作业中保持有效,直到再次改变它们。v 改变SAS系统选项可以用OPTIONS语句,或用显示管理命令OPTIONS菜单。语句格式:OPTIONS option-1;其中:option规定要改变的SAS系统选项。例11.43 运行调试好程序时常用的系统选项。OPTIONS NODATE NONOTES NOSOURCE;例中,运行调试好的大型程序时,
20、为了抑制LOG和OUTPUT窗口的输出,用上面的系统选项就可以解决问题。第29页,共60页。第第18章章 IML编程技术编程技术清华大学经管学院清华大学经管学院 朱世武朱世武ZResdat样本数据:样本数据:SAS论坛:论坛:第30页,共60页。本章内容包括:本章内容包括:概述;理解IML语言;线型回归IML模块。矩阵操作;IML编程语句;SAS 数据集操作;访问外部文件。第31页,共60页。概述概述 SAS/IML(Interactive Matrix Language)是在一种在动态和交互式环境下实现的强大而灵活的过程语言(交互式矩阵语言)。IML最基本的数据对象是矩阵。在SAS/IML模
21、式下,可以立刻看到语句运行的结果,也可以把语句贮存在一个模块中为以后使用。第32页,共60页。SAS/IML软件特点软件特点 利用SAS/IML软件可以轻易地进行高效编程和使用一系列子程序。因为SAS/IML软件是SAS系统的一个模块,所以,可以使用SAS数据集和外部文件,也可以对一个已有的SAS数据集进行编辑或者创建一个新的SAS数据集。SAS/IML软件是一种编程语言;SAS/IML软件对矩阵作运算;SAS/IML软件有强大的算符功能,有许多函数和CALL子程序;SAS/IML软件将算符应用到整个矩阵;SAS/IML软件是交互式的;SAS/IML软件是动态的;SAS/IML软件可以处理数据
22、;SAS/IML软件可以作图。第33页,共60页。一个简单一个简单IML交互程序交互程序 例18.1 求平方根IML程序。proc iml;/*激活IML*/reset deflib=ResDat;/*指定ResDat为缺省的SAS逻辑库*/start approx(x);/*定义模块开始*/y=1;/*初始化y*/do until(w1e-3);/*循环开始,le-3=0.001*/z=y;y=.5#(z+x/z);/*估计开方根,牛顿迭代*/w=abs(y-z);/*计算估计值之间的差异*/end;/*循环结束*/return(y);/*返回近似值*/finish approx;/*模块结
23、束*/t=approx(3,5,7,9);/*调用函数APPROX*/print t;/*打印矩阵*/quit;run;T 1.7320508 2.236068 2.6457513 3OUTPUT窗口结果第34页,共60页。牛顿迭代法求f(z)=0一个实根的方法牛顿迭代法公式:1()()nnnnf zzzfz上例中函数为:xzzf2)(第35页,共60页。理解理解IML语言语言 定义矩阵定义矩阵SAS/IM软件对矩阵作运算,这里矩阵的定义同矩阵代数中矩阵的定义一样,是一个两维的(行列)数组。SAS/IM软件可以定义数值矩阵也可以定义字符矩阵。特殊矩阵定义:1N矩阵称作行向量;M1矩阵称作列向量
24、;11矩阵称作标量.第36页,共60页。矩阵名字与标识矩阵名字与标识 矩阵名字是一个合法的SAS名字,不能超过8字节。矩阵标识是由它的值表示的矩阵。例18.2 矩阵名举例。A,XX,MATRIX1.例18.3矩阵标识举例。100,.,HI,1 2 2 8 8,3,3,6,6.第37页,共60页。由矩阵标识创建矩阵由矩阵标识创建矩阵 创建标量矩阵例18.4创建标量矩阵。proc iml;reset deflib=ResDat;a=100;b=.;c=IML;第38页,共60页。创建数值矩阵含有多个元素的矩阵标识要用括号把元素括起来。用逗号将矩阵的行分开。例18.5 由矩阵标识创建的数值阵。X=1
25、 2 3 4 5 6;/*定义一个行向量X*/Y=1,2,3,4,5;/*定义一个列向量Y*/Z=1 2,3 4,5 6;/*定义一个32矩阵Z*/W=3#Z;/*创建一个新矩阵W,它的每个元素是矩阵Z相应元素的3倍*/第39页,共60页。创建字符矩阵例18.6创建字符矩阵时,字符长度取最长字符的长度。a=IML Modual;/*字符长度以较长的字符为准,这里为6*/B=abc DEFG;第40页,共60页。重复因子重复因子用括弧括起来放在要重复的元素前面。例18.7 用与不用重复因子的等价语句。ANS=2 Yes,2 No;ANS=Yes Yes,No No;第41页,共60页。赋值语句结
26、果表达式:w=3#z;函数作为表达式:a=sqrt(b);y=inv(x);r=rank(x);第42页,共60页。表达式中的三种运算符表达式中的算符 算符在表达式中的位置前缀运算符放在运算对象前面(-A)中缀运算符放在运算对象之间(A*B)后缀运算符放在运算对象后面(A)第43页,共60页。语句类型语句类型 SAS/IML软件语句大致分为三类:控制语句;函数和CALL语句;命令语句。第44页,共60页。函数的一般形式:Result=Function(arguments);其中:Argument可以是矩阵名,矩阵本身或表达式。SAS/IML软件中的函数类型:矩阵查询函数;标量函数;概括函数;矩
27、阵变形函数;矩阵算术函数;线性代数和统计函数。函数函数第45页,共60页。例18.8 IML随机数函数应用举例。Rv=Uniform(Repeat(0,10,1);Rv=Ranuni(Repeat(0,10,1);Rv=Normal(Repeat(0,10,1);Rv=Rannor(Repeat(0,10,1);Rv=Ranbin(Repeat(0,10,1),20,0.5);Rv=Rancau(Repeat(0,10,1);Rv=Ranexp(Repeat(0,10,1);Rv=Rangam(Repeat(0,10,1),1);Rv=Ranpoi(Repeat(0,10,1),2);Rv=R
28、antri(Repeat(0,10,1),3);例中,形式REPEAT(X,Y,Z)中,X是随机数种子,Y是产生的随机数个数,Z是产生的随机数列数。第46页,共60页。例18.9 DATA步下随机数产生SAS程序例子。data RV;retain _seed_ 0;/*retain 赋初值0给_seed_*/mu=0;sigma=1;do _i_=1 to 1000;Normal1=mu+sigma*rannor(_seed_);/*均值为mu,标准差为sigma*/output;end;drop _seed_ _i_ mu sigma;run;第47页,共60页。SAS/IML不支持OF语句
29、:A=mean(of x1-x10);在SAS/IML中x1-x10被当成x1减x10,而不是x1到x10.第48页,共60页。CALL语句与子程序语句与子程序CALL SUBROUTINE arguments;例18.10 使用CALL子程序。call eigen(val,vec,t);call delete(DAT);第一个例句,用CALL语句创建矩阵,得到矩阵t的特征值和特征向量。第二句,删除数据集DAT。第49页,共60页。例18.11 自建子程序。start mymod(a,b,c);a=sqrt(c);b=log(c);finish;run mymod(a,b,10);/*运行模型
30、MYMOD*/run mymod(x,y,10);例中,建立一个模块MYMOD,分别得到输入矩阵的平方根和自然对数值。CALL的其它一用法:call gstart;/*激活graphics模块 */call gopen;/*打开一个新的graphics片段*/call gpoint(x,y);/*作散点图*/call gshow;/*显示散点图*/第50页,共60页。命令命令 利用SAS/IML命令用于实现一些具体的系统功能,例如,存贮和加载矩阵、或进行特定的数据处理等。第51页,共60页。例18.12 SAS/IML命令用法举例。proc iml;A=1 2 3,4 5 6,7 8 9;B=
31、2 2 2;show names;store a b;show storage;remove a b;/*移走矩阵a,b*/show storage;load a b;quit;proc iml;A=1 2 3,4 5 6,7 8 9;B=2 2 2;print a b;free a b;/*清空矩阵a,b*/print a b;quit;第52页,共60页。缺失值缺失值 v SAS/IML软件也有缺失值的问题。注意,矩阵中的缺失值不能视为0,矩阵标识中,数值缺失值用点”.”表示。v SAS/IML软件支持缺失值的方式是有限的。许多矩阵运算不允许有缺失值,比如,矩阵乘法、矩阵求逆等。另外,支持
32、缺失值的矩阵运算也会产生不一致的结果。第53页,共60页。线性回归线性回归IML模块模块 解方程组 例18.13 线性解方程组。用符号表示为:Ax=c解方程组程序:proc iml;a=3 -1 2,2 -2 3,4 1-4;c=8,2,9;x=inv(a)*c;print a c x;quit;run;1231231233282232449xxxxxxxxx A C X 3 -1 2 8 3 2 -2 3 2 5 4 1 -4 9 2结果:第54页,共60页。线性回归线性回归IML模块程序模块程序 例18.14线性回归IML模块程序。proc iml;x=1 1 1,1 2 4,1 3 9,
33、1 4 16,1 5 25;y=1,5,9,23,36;b=inv(t(x)*x)*t(x)*y;yhat=x*b;r=y-yhat;sse=ssq(r);dfe=nrow(x)-ncol(x);mse=sse/dfe;第55页,共60页。start regress;/*定义模块开始*/xpxi=inv(t(x)*x);/*矩阵XX的逆*/beta=xpxi*(t(x)*y);/*参数估计*/yhat=x*beta;/*预测值*/resid=y-yhat;/*残差*/sse=ssq(resid);/*SSE */n=nrow(x);/*观测值数 */dfe=nrow(x)-ncol(x);/*
34、误差自由度DF*/mse=sse/dfe;/*MSE */cssy=ssq(y-sum(y)/n);/*校正平方和 */rsquare=(cssy-sse)/cssy;/*RSQUARE */print,Regression Results,sse dfe mse rsquare;stdb=sqrt(vecdiag(xpxi)*mse);/*参数估计的标准差*/t=beta/stdb;/*参数的t检验*/prob=1-probf(t#t,1,dfe);/*p-值*/print,Parameter Estimates,beta stdb t prob;print,y yhat resid;fin
35、ish regress;/*模块结束*/第56页,共60页。reset noprint;run regress;/*执行REGRESS 模块*/reset print;/*打开自动打印*/covb=xpxi*mse;/*参数估计协方差阵*/s=1/sqrt(vecdiag(covb);corrb=diag(s)*covb*diag(s);/*参数估计的相关系数*/x1=1,2,3,4,5;/*矩阵X的第二列*/x=orpol(x1,2);/*产生正交多项式*/reset noprint;/*关闭自动打印*/run regress;/*运行REGRESS*/reset print;covb=xp
36、xi*mse;s=1/sqrt(vecdiag(covb);corrb=diag(s)*covb*diag(s);reset fuzz;corrb=diag(s)*covb*diag(s);第57页,共60页。矩阵操作矩阵操作 v 输入数据创建矩阵标识 v 使用赋值语句创建矩阵 v 使用矩阵表达式 v 利用行列标展现矩阵 v 缺失值运算举例 第58页,共60页。输入数据创建矩阵标识输入数据创建矩阵标识 SAS/IML中可以使用多种方式输入数据创建矩阵标识。创建标量矩阵标识例18.16 创建标量矩阵例。proc iml;x=12;y=12.34;z=.;a=Hello;b=Hi there;print x y z a b;X Y Z A B 12 12.34 .Hello Hi there第59页,共60页。创建多元素矩阵创建多元素矩阵时,用括号把元素括起来,用逗号(,)把行分开。例18.17 创建多元素矩阵例。reset print;coffee=4 2 2 3 2,3 3 1 2 1,2 1 0 2 1,5 4 4 3 4;names=Jenny,Linda,Jim,Samuel;print coffee rowname=names;第60页,共60页。