《sas第八讲—iml编程》由会员分享,可在线阅读,更多相关《sas第八讲—iml编程(16页珍藏版)》请在金锄头文库上搜索。
1、 SAS 8.2 IML 语言要素语言要素 I、矩阵、矩阵 1、矩阵的定义:矩阵是一个二维数阵,分为行和列。构成矩阵的数据称为元素,可以 是数值也可以是字符。N1矩阵称为行向量,1M矩阵称为列向量,11 矩阵称为标量 (scalar) 。矩阵的名字与 SAS 文件的命名规则相同(以字母或下划线开头,以字母数字和 下划线组成,长度不超过 32 个字符) 。 2、矩阵的创建:矩阵可以通过元素列示定义,也可以赋值来创建。 (1)元素列示法: proc iml; a=100; b=1 2,3 4,5 6; 注:元素重复的方法:创建矩阵时,如果需要连续重复输入一个数值作为矩阵的元素,则可采 用元素重复因
2、子(repeating Factor)实现。重复因子是重复次数加方括号,放在需要重复 的元素之前。例如 proc iml; a=100; b=21 2,3 24,25 6; print b; 结果为 1 1 2 3 4 4 5 5 6 (2)赋值法:赋值法通过赋值语句对已有的矩阵进行与运算(包括函数运算)创建矩阵。 一般形式:矩阵名=表达式; proc iml; b=21 2,3 24,25 6; c=2#b; print c; 结果为 2 2 4 6 8 8 10 10 12 3、矩阵表达式:表达式是由矩阵、函数以及运算符连接的式子,运算结果为矩阵。 (1)矩阵运算符: SAS t=3 2
3、-1,6 -4 3,2 2 2; i=loc(t:Using This Window 目录ProductsIMLLanguage Reference Statements, Functions , and Subroutines 进行查阅,每个条目下都有详细的语法解释和应用 例子。 III、语句、语句 IML中的语句可以分为三类:控制语句、函数、Call语句和命令语句。 控制语句列表: Statements Action DO, END 定义 DO 组; 循环 DO, END 定义循环 SAS use sashelp.class; setin sashelp.class pint 0; sum
4、=0; do data; read next varage; sum=sum+age; end; print sum; quit; 函数:函数语句是指通过函数赋值的赋值语句,一般格式为 变量名=函数名(自变量列表); 例如: 语句 B=inv(A); 将自变量(矩阵A)的逆矩阵赋值给矩阵B。函数类型见上面介绍。 Call语句与子程序:当需要用调用某个子程序时,需要用Call语句。 例如: Call eigen(val, vec, A); 调用子程序eigen,计算A的特征根和特征向量,用特征根形成向量val,用特征性向量形成 矩阵vec。 Call delete(sg); 调用子程序delet
5、e,删除数据集sg。 SAS a=1 2 3, 4 5 6, 7 8 9; b=2 2 2; show names;/*显示所有矩阵的信息*/*显示所有矩阵的信息*/ store a b;/*将矩阵存储在库中*/ *将矩阵存储在库中*/ free a b; /*释放矩阵内容,增加可用空间 */*释放矩阵内容,增加可用空间 */ show storage;/*显示存储库中的矩阵*/*显示存储库中的矩阵*/ load a b;/*加载矩阵*/*加载矩阵*/ quit; 另一类命令是数据管理命令,在SAS数据集操作中介绍。 例子:回归模型的OLS估计: proc iml; x=1 1 1, 1 2
6、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; print b yhat r sse dfe mse; run; 8.3 创建和运行模块创建和运行模块 尽管 IML 本身有很多函数和子程序,但并不能满足所有需要。用户可以自己定义具有 一定功能的子程序或者函数。这通过创建模块和运行模块来实现。此外,模块还可以产生局 部变量,形成一个局部变量列表。 模块以 Start 开始,以 Finish
7、i 结束。一般形式为 SAS 模块语句模块语句; FINISH ; 如果省略模块名,则模块取默认名 main 模块定义好之后,可以用 run 或者 Call 语句运行,一般格式为 RUN ; 功能: 打开SAS数据集,为读出数据到IML中做准备。打开数据集后,可以采用命 令FIND, INDEX, LIST, and READ对数据集实施读出操作。 (2)EDIT语句:打开SAS数据集。 格式: EDIT SAS数据集名 ; 功能: 打开SAS数据集,为读出数据到IML中和将IML中数据写入做准备。打开数据 集后可以用LIST, READ, INDEX, and FIND对数据集实施读出操作,
8、 也可以用 REPLACE, APPEND, DELETE, and PURGE实施读入操作。 (3)CREAT语句:创建新的SAS数据集。 SAS CREAT SAS数据集名 From 源数据名 ; 功能: 创建新的SAS数据集并打开,供读入和写出。用APPEND语句将矩阵中的数 据读入新建的SAS数据,否则数据集中没有观测。 II、设置当前SAS数据集 II、设置当前SAS数据集 只有当前数据集(current data set)才可以进行读写操作。当有多个已经打开的数据集时, 需要将目标数据集设为当前数据集。 USE 数据集名;SETIN 数据集名;将数据集设为当前数据数据集。 SETO
9、UT 数据集名;将数据集设为当前输出数据集。 CREAT 数据集名;EDIT 数据集名; 数据集设为当前输出和输入数据集。 命令SHOW DATASETS;可以查看已打开输入、输出数据集和当前数据集,SHOW CONTENTS;可以显示当前输入数据集的内容,包括变量名、类型、长度和观测个数。 III、设置当前观测、设置当前观测 当前观测为最近一次读入、读出操作设定的。例如打开一个数据集后当前观测为第0条 观测,而如果用list命令或者用read命令进行操作时,当前观测改变为第1条观测。 proc iml; use sashelp.class; list current; run; 命令SETI
10、N和SETOUT加point选项可以要改变当前观测。例如 proc iml; use sashelp.class; list current; setin sashelp.class point 10; list current; run; III、设定默认库、设定默认库 SAS数据集存放在指定的库中,识别数据集时需要两级名字,默认库除外。SAS默认库 为临时库Work。命令RESTET DEFLIB=name;可以改变IML中的默认库。 proc iml; reset deflib=sashelp; use class; list current; setin class point 10;
11、 list current; run; IV、列示观测值、列示观测值 List ; (1)范围关键词: ALL:所有观测 SAS reset deflib=sashelp; use class; list current; setin class point 10; list current; p=2 4,6 10; list point p varname sex; q=name sex, height weight; list point 3 5 8 var q; run; 在不同命令中Var语句的功能 命令 功能 APPEND 将IML变量中的数据添加到SAS数据集 CREAT 规定要创
12、建的SAS数据集变量 EDIT 规定要访问的变量 LIST 规定要列出的变量 READ 规定要(从数据集)读入(IML)的变量 REPLACE 规定数据集的哪些变量值由相应的IML变量值代替 (3)观测选择:Where(表达式) SAS variable 数据集中的变量; comparison-op为比较算符; operand为值、矩阵或者表达式 比较算符中除了常见的之外,还有几个用于字符比较的算符: 比较算符 功能 ? 包含给定的字符串:?字符串 ? 不包含给定的字符串:? 字符串 =: 以给定字符串开始 =* 以与给定字符串发音相似或者拼写相似开始 Where比较的变量可以是矩阵,对于算符
13、 = ? = ,只有当比较的矩阵中所有元素都满足where语句中的条件才成立。而对于算符 = ? =: =* ,只要比较的矩阵中有元素满足where语句中的条件就成立。此外,where语句中的比较表达 式可以用 reset deflib=sashelp; use class; list all varname where(sex=M); n=name sex age; list all var n where(name? A); list all var n where (name? A) run; quit; V、由、由SAS数据集创建矩阵数据集创建矩阵 将打开的SAS数据集中的数据读入IM
14、L并形成矩阵是用Read语句实现的。读入的SAS数 据集必须是当前数据集。Read语句的一般格式为: READ ; 其中 范围:给出要读入的观测的范围,all 表示读入所有观测,缺省则为当前观测。 Var 从句 :选择要读入的变量。每个变量读入后形成一个列向量,列向量名为原先的变量 名。 Where(表达式):对读入的观测进行筛选,符合条件(使表达式成立)的观测被读入矩阵。 矩阵名:为读入数据形成的矩阵命名。如果将读入的变量形成一个矩阵,则需要用 into 从 句给矩阵命名。 SAS use sashelp.class; read all var name age height weight;
15、 show names; read all varname age height weight into temp; print temp; read all var _num_ into temp1; print temp1; quit; proc iml; use sashelp.class; list all; read all var _num_ into female where(sex=“F“); print female; read all varname into j where(name=:“J“); print j; read all varname into a wher
16、e(name?“A“); print a; read all varname into al where(name?“Al“)|(name?“al“); print al; quit; VI、由矩阵创建、由矩阵创建SAS数据集数据集 用CREATE语句和APPEND语句可以从矩阵创建SAS数据集,矩阵的列形成数据集的变 量,行形成数据集的观测。一个nm矩阵形成具有m个变量和n个观测的数据集。CREATE 语句打开一个新数据集作为输入输出数据集,APPEND语句把数据写入到数据集之内。 1)带有From选型的CREATE语句 格式: CREATE SAS数据集名 FROM 矩阵名; APPEMD FROM 矩阵名; 选项Colname=列变量名 给出SAS数据集的变量名,其中的列变量名以矩阵形式给出,如 Colname=age、Colnmae