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