SAS中的另类语言:交互式矩阵

浏览: 3223
SAS


在SAS世界里,我们最熟悉的莫过于data步了,它做数据处理、描述汇总、模型求解,简直就是上天入地,无所不能了。而除了data步之外,在SAS语言世界还有这么一个模块,它也是上天入地,无所不能滴,IML模块,全称“interactive matrix language”,中文称交互式矩阵语言。很多人对IML不了解,尤其是在刚刚一接触这个就产生很强的抵触心理,这个其实很好理解,它的语法确实与平常的SAS语法不同,自成一体,但是你一旦深入了解这个语言之后,你会发现它有多么的强大。Data步能做的它都能做,data步做不了的它还是能做。

因其本身强大的内嵌函数和一系列的子程序,使其比data步运行的更快捷、更轻松、更有效率。在IML中,矩阵是最基本的一个元素,包括我们在读取数据、计算、建立模型的过程中,都是通过矩阵的形式来进行,而矩阵的批量处理、在数据转化上的灵活性都是有目共睹的。

接下来我将手把手的来教你认识IML语言,扒一扒IML过程的每一个细节。

欢迎各位一起来学习。

本次系列将分为以下几个部分:

1.       关于矩阵的定义以及基本运算;

2.       矩阵内嵌函数以及自定义模块;

3.       矩阵是如何读取、写入数据文件的;

4.       矩阵的call子程序;

5.       矩阵是如何建模的;…………

发现系列有点多啊。。 不管了,先写起来再说吧。 


关于矩阵的定义 


IML过程以“PROC IML”开头,以“quit”结束会话。一个n×p矩阵表示它有n行p列数据,即n*p个元素,当n=1时,我们称之为行向量,当p=1时,我们称之为列向量,当n=1且p=1时,我们称之为标量。 


矩阵命名 


矩阵的命名与SAS的变量名保持一致,字符长度在1-32位之间,以字母或者下划线开头,只能包含字母、数字和下划线。 


矩阵初始化赋值 


矩阵初始赋值有这么几个方面的性质:

  1. 矩阵里的元素都是通过大括号括起来,例如A={1 3,2 4}代表矩阵2×2的矩阵A里有4个元素,且为数值型,但是当矩阵为标量时,则不需要用大括号,例如A=’hello’;


  2. 关于字符型矩阵,当矩阵元素不包含引号时,矩阵元素中的字母会自动转化为大写, 例如:

     


3. 矩阵中的重复因子。对矩阵赋值时,如果在元素前面加上一个带中括号的数值[2],表示将这个元素重复两次,适用于字符型和数值型,例如:

 

4.矩阵的命名和其赋值完全是独立,即可以在任何时候对同一个矩阵赋任何类型的值,包括数值型和字符型,也就是说在对矩阵命名时不需要对其进行类型的定义,例如:

而在data步中,如果在初始化var=2之后,再令var=’hell’,则程序会提示错误。

 

5. 矩阵的元素允许缺失值的存在,与data步一样,当元素缺失表现为数值型时,则为点号,当元素缺失表现为字符型时,则为空格,而在很多矩阵运算中,带有缺失值的矩阵则无法参与矩阵运算,原因在于从数学意义上来看,这种运算是要求矩阵必须是全部都是有数值的,例如矩阵的可逆运算,如果矩阵的部分元素出现缺失,那其可逆还是不可逆呢,这是个问题。

 

关于基本运算


矩阵的运算多种多样,其对应的不同运算符功能都不一样,下面一一介绍一下:

1.“+”表示矩阵元素对应相加,它有这么一个性质,当两矩阵A、B矩阵的维度相同时,则表示两矩阵对应元素的相加,当两矩阵维度不相同时,则只限于至少有一个矩阵为向量(行向量或者列向量)或者标量,此时矩阵则不再是对应元素相加,而是向量与矩阵对应维度每一个元素相加,如果两矩阵维度不同,而又都不是标量或者向量,则会报错,具体示例如下: 

2.“—”表示矩阵对应相减,这个与“+”用法一样,另外一种用法是当做负号标志,对应一个矩阵使用,不再多加介绍了。3.“#”表示矩阵对应元素相乘,与“+”用法一样。

4.“##”表示矩阵对应元素的乘方,与“+”用法一样。

5.“/”表示矩阵对应元素相除,这个与“+”用法一样,但是需要注意一个地方就是A/B时,B中的元素如果出现缺失,结果不会报错,但是日志中会出现警告,并且结果矩阵对应元素为缺失值,示例如下: 

6.“@”表示kronecker积,用于计算两个矩阵元素的乘积,但是它跟“+”用法不一样,它中文名为克罗内克积,对应的两个矩阵可以是任一的大小,维度可以任意,例如矩阵A为一个n×m矩阵,B为一个p×q矩阵,那么A@B则为一个np×mq矩阵,对应的矩阵如下所示:         

 从上面矩阵的形式可以看出,A@B其实就是由多个分块矩阵组成,每个分块矩阵都是由A中的对应元素aij#B,示例如下:

7.“><”表示求两个矩阵对应元素中的较小值,“<>”表示求两个矩阵对应元素的较大值,“&”、“|”、“^”与或非对应矩阵元素的求解,上述与“+”用法都一致。

8.“:”表示生成一个连续的向量,形式为value1:value2。例如A=4:8,表示A={4 5 6 7 8},也可以倒着写,A=8:4,表示A={8 7 6 5 4},还可以用来表示字符型向量,A=’v1’:’v3’,表示A={‘v1’ ‘v2’ ‘v3’},也可以用字母顺序来表示,A=’a’:’c’,表示A={‘a’ ‘b’ ‘c’}。

9.“*”表示矩阵的乘积,这种形式要求两矩阵的前一个矩阵的列维度等于后一个矩阵的行维度。例如m×p的矩阵A*p×n的矩阵B,得到结果矩阵为m×n的矩阵C,C中的第i行第j列元素可以表示如下所示:

例如A={1 2 3,4 5 6},B={1 4,2 5,3 6},则A*B如下所示:

10.“**”这个表示矩阵的幂运算,例如A**m表示m个矩阵的乘积,注意当m为-1时,则结果表示为矩阵的逆,当m为非整数形式时,它会自动转化为整数,其转化方式为取不大于该数的最大整数,如下所示: 

11.“||”表示将两个矩阵水平连接,这个要求两矩阵的行维度保持一致;“//”表示将两矩阵纵向连接,这个则要求两矩阵的列维度保持一致,“`”表示将矩阵转置,示例如下: 

 12.“[ ]”这个运算符使我们用的最多的一个符号,其基本形式为:matrix[rows, columns];matrix[elements];      通常我们用来表示矩阵的行列元素,row和column可以是标量也可以是向量,示例如下: 


而当“[ ]”与上述运算符“+”、“#”、“<>”、“><”、“:”等结合,其发挥出来的作用绝对让你意想不到。大家可以自己去体验一下,我在这里就不多介绍了。 好了,对于矩阵的定义和基本运算介绍就到这里了,下一节将为大家带来矩阵的函数运算和自定义模块。  


  

Clipboard Image.png

  

推荐 0
本文由 mingfeng07 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册