SAS/IML模块返回本章教学目的:了解SAS/IML模块的功能和特点掌握SAS/IML语言建立矩阵变量及矩阵的运算掌握IML常用函数的调用掌握自定义函数与过程的定义与调用掌握打开与使用SAS数据集本章内容:1.SAS/IML模块2.矩阵变量的建立3.矩阵运算4.矩阵函数5.IML语句6.IML自定义函数和过程7.打开与使用SAS数据集返回1.SAS/IML模块1.1SAS/IML模块简介1.2IML变量1.3启动和退出SAS/IML模块1.4设置和关闭IML交互模型返回1.1SAS/IML模块简介IML是InteractiveMatrixLanguage的缩写,即交互式矩阵语言,也是一种程序设计语言,它提供了条件转移、循环等流程控制语句,还提供了用户自定义函数和子程序的功能,它是用户研究新算法或解决系统中没有现成方法可用的问题的工具。1.2IML变量IML的基本数据元素是一个矩阵,最小为1×1阶矩阵。矩阵元素可为数据型,也可为字符型,缺失值用“.”表示。多维矩阵每一行的元素个数必须相同。数值型矩阵中元素可以是整数、小数,也可用科学计数法表示。字符型矩阵中,若元素中含有空格或某些特殊字符,如“?”、“=”、“*”、“:”等,则须将字符串用单引号或双引号括起来。在同一个字符型矩阵中,每一个元素的字符串长度不必相等,但存储的长度最大不超过32676.IML变量的取名规则:可由下划线,字母和数字组成,但不能以数字开头。不可超过32个字符不区分大小写1.3启动和退出SAS/IML模块启动语句为:ProcIML;退出语句为:Quit1.4设置和关闭IML交互模型设置交互模式SAS/IML模块提供了一个交互式环境,在此环境下系统将交互地输出每一执行语句的计算结果而不需额外使用输出语句,这在调试程序时非常有用。使用这一功能前需将交互模型状态打开,设置交互模型的语句为:Resetprint;关闭交互模式如果不需要一些中间计算结果,则应将IML交互模型关闭,使得程序输出比较简洁。关闭交互模型的语句为ResetNoPrint;2.矩阵变量的建立2.1一般方式建立矩阵2.2行向量的特殊产生方式为2.1一般方式建立矩阵格式:矩阵变量名=矩阵初值;(1)定义1×1阶矩阵(标量)如a1=12;a2=.;a3='Hello';printa1a2a3;/*输出矩阵*/(2)定义行向量如b1={12345};b2={abCDDEF};b3={'adCD'DEF};/*比较b2与b3的结果*/2.1一般方式建立矩阵(3)定义列向量如c1={1,2,3};(4)定义2×3阶矩阵如c2={123,456};2.2通过赋值建立矩阵变量格式:矩阵变量名=IML表达式;如:x={1,2,3};Y={3,2,1};Z=x+Y;2.2行向量的特殊产生方式格式1:矩阵变量名=起始值:结束值;说明:矩阵的第一个元素值为起始值,起始值小于结束值时,矩阵元素依次增加1,直到最后一个元素的值小于等于结束值,反之依次减少1,直到最后一个元素的值大于等于结束值格式2:矩阵变量名=do(起始值,结束值,步长);3.矩阵运算3.1矩阵的算术运算3.2矩阵的比较运算3.3矩阵的合并与拆分3.4其它常用矩阵运算3.1矩阵的算术运算表(A、B为矩阵,C为向量,k为实数)运算表达式含义加法A+BA+k矩阵A中元素与矩阵B中元素对应相加矩阵A中元素都加上数k减法A-BA-k矩阵A中元素与矩阵B中元素对应相减矩阵A中元素都减去数k乘法A*BA*k矩阵A乘矩阵B矩阵A中元素都乘以实数k除法A/BA/k矩阵A中元素与矩阵B中元素对应相除矩阵A中元素都除以数k乘方A**kA**(-1)矩阵A的k次幂,即为k个矩阵A相乘(幂次k为大于等于-1的整数,若非整数将自动取整求A的逆矩阵对应元素元素相乘A#BA#CA#k矩阵A中元素与矩阵B中元素对应相乘矩阵A中每一行或每一列中的元素与向量C中元素对应相乘(注:向量C可为行向量也可为列向量)矩阵A中元素都乘以数k对应元素元素乘方A##BA##k矩阵A中元素为底,矩阵B中元素为指数作乘方运算矩阵A中元素为底,数k为指数作乘方运算元素取相反数-A将矩阵A中元素均取相反数3.2矩阵的比较运算矩阵的比较运算是指比较矩阵相应元素大小关系,结果产生一个与相比较矩阵同阶的矩阵。若比较关系成立,则结果矩阵中的相应元素为1,否则为0。运算表达式含义AB大于AB小于A=B大于等于A=B小于等于A=B等于A^=B不等于注:上述矩阵A和B中某一个可用一实数代替,此时将另一矩阵的每一个元素与此数值进行比较。详见程序prgIML1.4.sas。3.3矩阵的合并与拆分将两个满足一定条件的矩阵按照一定规则合成一个矩阵的过程为矩阵的合并,矩阵合并有水平合并与垂直合并之分。从一个矩阵中分出一个阶数较小的矩阵的过程称为矩阵的拆分。运算表达式含义A||B将矩阵A中的每行元素分别接在矩阵B中相应行的右边,结果矩阵的行数与A,B相同A//B将矩阵A中的每列元素分别接在矩阵B中相应列的下边,结果矩阵的列数与A,B相同A[i,j]矩阵A的第i行第j列的元素A[i,]矩阵A的第i行所有元素A[,j]矩阵A的第j列所有元素A[c1:c2,d1:d2]矩阵A的第c1行到第c2行和第d1列到第d2列的所有元素A[+,]矩阵A的各列的元素之和所形成的行向量A[,+]矩阵A的各行的元素之和所形成的列向量3.4其它常用矩阵运算运算表达式含义I(n)产生一个n阶单位阵J(m,n,k)产生一个元素全为k的m×n阶矩阵Diag(C)以向量C的各元素为主对角线元素(顺序不变)的对角矩阵Trace(A)矩阵A的迹(主对角线元素之和)Inv(A)或A**(-1)矩阵A的逆矩阵,即A-1T(A)或A`矩阵A的转置(`为右斜撇,一般为键盘的左上方)Det(A)矩阵A的行列式值Eigval(A)矩阵A的全部特征值Eigvec(A)矩阵A的每个特征向量为列所形成的矩阵(单位化)4.矩阵函数4.1常用数学函数4.2常用概率统计函数4.1常用数学函数函数名功能含义Abs(A)将矩阵A中的每个元素取绝对值Exp(A)以自然数e为底,将矩阵A中的每个元素作为指数,构造同阶矩阵Int(A)将矩阵A中的每个元素取整数Log(A)将矩阵A中的每个元素取对数Max(A)将矩阵A中的每个元素取最大值Min(A)将矩阵A中的每个元素取小值Sqrt(A)将矩阵A中的每个元素开平方Sum(A1,A2,….)将矩阵A1,A2,..中所有矩阵的所有元素求和,自变量矩阵最多为15个,如果有缺失将忽略它们。4.2常用概率统计函数222函数名功能含义SSQ(A1,A2,….)求矩阵A1,A2,..中所有矩阵的所有元素的平方和,自变量矩阵最多为15个。CuSum(A)产生一个与自变量矩阵A同阶的矩阵,其元素为A中元素的累积和(按行为从左到右,再从上到下)ProbNorm(x)计算标准正态分布的分布函数在x处的值,x为数值型变量Probit(p)计算标准正态分布的p分位数,0p1ProbChi(x,df,nc)计算自由度为df的分布的分布函数在x处的值。当非中心参数nc=0或缺省时,即为中心分布的分布。Cinv(p,df,nc)计算自由度为df的分布的p分位数,0≤p1,非中心参数nc≥0.ProbT(x,df,nc)计算自由度为df的T分布的分布函数在x处的值。当非中心参数nc=0或缺省时,即为中心分布的T分布。Tinv(p,df,nc)计算自由度为df的T分布的p分位数,0p1,非中心参数nc≥0.ProbF(x,df1,ddf2,nc)计算分子、分母自由度为分别为df1和df2的F分布的分布函数在x处的值。当非中心参数nc=0或缺省时,即为中心分布的T分布。Finv(p,df1,ddf2,nc)计算分子、分母自由度为分别为df1和df2的F分布的p分位数,0≤p1,非中心参数nc≥0.4.2常用概率统计函数函数名功能含义RanNor(seed)产生标准正态分布随机数。种子seed可是一个整数或一个矩阵,元素值小于231-1,seed≤0时将用系统时间作为初始化的种子。若seed为矩阵,则函数值为与seed同阶的矩阵。Uniform(seed)产生(0,1)上均匀分布随机数。种子seed可是一个整数或一个矩阵,元素值小于231-1,seed≤0时将用系统时间作为初始化的种子。若seed为矩阵,则函数值为与seed同阶的矩阵。注:其功能等价于数据步中的ranuni()函数。5.IML语句5.1循环语句5.2条件判断语句5.3退出语句5.4返回语句5.5过程(子程序)调用语句5.1循环语句1)计数型循环格式:Do循环变量=初值to终值[By步长];循环体;End;2).直到型循环格式:DoUntil(表达式);循环体;End;3).当型循环格式:DoWhile(表达式);循环体;End;5.2条件判断语句格式:If表达式then语句1;Else语句2;5.3退出语句格式:Quit;执行此语句退出IML模块。5.4返回语句格式:Return(表达式);执行此语句后,将计算表达式的值并返回此值。此语句常用于自定义过程或函数中。5.5过程(子程序)调用语句格式:Run过程名(变量列表);6.IML自定义函数和过程6.1自定义一般格式START过程名或函数名[(形式变量列表)][Global(全局变量列表)];函数或过程中语句;Finish[过程名];6.2自定义过程示例6.3自定义函数示例startLSE(x,y);b=inv(x`*x)*x`*y;return(b);finish;上述例子定义了一个名为LSE的函数,其功能是计算y关于x的线性回归方程系数的最小二乘估计,结果以函数值的形式返回。6.4综合例子某长途运输公司对同类卡车统计了行行驶里程y与行驶天数x的数据如表:希望通过此数据建立行驶里程y关于行驶天数x的线性回归方程。SAS/IML程序如下:x3.51.04.02.01.03.04.51.53.05.0y825215107055048090013503256701215ˆ1186.923123.8866yx7.打开与使用SAS数据集7.1打开一个SAS数据集7.2由SAS数据集创建矩阵7.3由矩阵创建SAS数据集7.1打开一个SAS数据集在访问一个SAS数据集前,你必须发布一个命令来打开它。如果只是从已存在的数据集中简单地读取数据,可使用USE语句来打开数据集,一般格式为:USE数据集名VAR变量名WHERE(表达式);例:prociml;usesashelp.class;listall;/*显示数据集的观测值*/quit;7.2由SAS数据集创建矩阵可以使用READ语句,从SAS数据集传递数据到矩阵里,注意该数据集必须先打开,READ语句的一般格式为READ范围VAR变量名WHERE(表达式)INTO矩阵名;注:第二段程序执行后会在Log窗口中显示警告信息:WARNING:VariableAGEexcludedbecauseoftypemismatchwithA.,提示age变量没有导入矩阵temp中,因为它的数据类型与其它两个变量不一致。思考:如果只要求将女性的观测读取出来,则需加入where选项。readallvar{namesexage}where(sex='F');7.3由矩阵创建SAS数据集SAS/IML提供了从矩阵创建一个新SAS数据集的能力,主要使用create和append语句来实现,有两种方式分别来创建只有一个变量和多个变量数据集。格式为:方式一:CREATE数据集名FROM矩阵名[COLNAME=列名ROWNAME=行名];AppendFrom矩阵名;方式二:CREATE数据集名