开篇话:
前段时间数说君征原创稿,果真得到了不少牛人的赐稿,比如本文的作者Ansta,作为数说工作室的特约撰稿人,将会承担下“【SAS Says】高级篇” 的写作。
SAS基础篇中,我们介绍了一些入门的东西。在进阶篇中,我们将介绍一些统计方面的SAS应用,包括主成分分析、判别分析、非参数检验、logistic模型等等。进阶篇要稍晚些与大家见面,我们首先邀请Ansta为大家带来高级篇,高级篇将介绍SAS的IML模块、SQL模块、宏语句以及贝叶斯(插一句,如果大家觉得好,求打赏,1元不嫌少,5元不嫌多;如果大家觉得不好,欢迎赐予评论,与作者交流、改进)。
本节目录:
1. IML基本语句
2. 标量、向量与矩阵
(1)定义标量
(2)定义向量
(3)定义矩阵
3. 矩阵的元素运算
(1)四则运算
(2)比较运算
(3)取值运算
4. 矩阵运算
(1)矩阵相乘
(2)水平连接
(3)垂直连接
(4)转置
(5)截取运算符
【SAS Says】高级篇:IML(1)
你还在一边用SAS做统计分析、一边用MATLAB做矩阵运算吗?SAS IML模块可以直接做矩阵运算啦!IML(Interactive Matrix Language),交互式矩阵语言,是SAS的矩阵模块。
我们不去比较SAS IML模块和MATLAB的运算功能,只要知道,在SAS里,IML和SAS数据集做交互将会方便很多,你也不用将数据倒来倒去!
来吧,带你进入IML的世界,它不会让你失望的!
1
基本语句
IML基本语句/数说工作室
Proc iml;
IML语句(每一句同样要以分号结尾)
quit;
IML模块的语句以proc iml开头,以quit结尾推出,中间的语句要加分号。
怎么在IML模块里定义矩阵呢?
看下面的内容
2
标量、向量与矩阵
(1)定义标量
就是在iml模块里,定义数值或者字符串,
例子
proc iml; a=100; b=.; c="Hello"; print a,b,c; quit;
(左边是语句,右边是跑出来的结果)
(2)定义向量
定义一个向量/数说工作室
a={ x1 x2 x3 … xn }
比如,生成一个数值行向量和一个字符行向量:
例子
proc iml; a={1 2 3, 4 5 6}; b={'Hello,' 'world!'}; print a,b; quit;
(3)定义矩阵
定义一个N×M矩阵/数说工作室
a = { n11 n12 … n1m, n21 n22 … n2m, …, nm1 nm2 … nmm } ;
记得行与行之间用逗号隔开。比如,想建立一个矩阵:
例子
proc iml; a={1 2 , 3 4}; print a; quit;
3
矩阵的元素运算
注意,是矩阵中的各个元素之间的运算,不是两个矩阵的运算。
(1)四则运算
两个矩阵a和b,那么运算符分别为:
- 加: ;
- 减: -;
- 乘: #;
- 除: /;
- 乘方: ##;
对两个矩阵:
,
,
各运算结果如下:
例子
proc iml; a={1 2,3 4}; b={0 2,1 1}; c1=a b; c2=a-b; c3=a#b; c4=a/b; print c1,c2,c3,c4; quit;
(2)比较运算
用比较运算符比较两个矩阵中的元素,如果比较成立,则返回1,否则返回0,比如:
例子
proc iml; a={1 2,3 4}; b={0 2,1 1}; c1=a>b; c2=a<=b; print c1,c2; quit;
(3)取值运算
<>:取出矩阵中对应元素较大的;
><:取出矩阵中对应元素较小的。
例子
proc iml; a={1 2,3 4}; b={0 2,1 1}; c1=a><b; c2=a<>b; print c1,c2; quit;
4
矩阵运算
(1) 矩阵相乘:*
如果
,
,
那么
例子
proc iml; a={1 2, 3 4}; b={0 2, 1 1}; c=a*b; print c; quit;
(2)水平连接:||
将两个行数相等的矩阵水平连接
例子
proc iml; a={1 2,3 4}; b={0 2,1 1}; c=a || b; print c; quit;
(3)垂直连接://
将两个列数相等的矩阵垂直连接
例子
proc iml; a={1 2,3 4}; b={0 2,1 1}; c=a // b; print c; quit;
(4)转置:`
此符号一般位于键盘的esc下方
例子
proc iml; a={1 2,3 4}; c=a`; print c; quit;
(5)截取运算符:[ ]
用于截取矩阵的一部分,格式为:a [ row, column ]。
其中,row或column留空表示截取整个行或者列。
例子
proc iml; a={1 2 3, 4 5 6, 7 8 9}; b=a [ 1, 3 ]; c=a [ 1, ]; d=a [ , 3 ]; print a,b,c,d;
quit;
在“[]”的帮助下,我们不仅可以对行或者列的数字进行加总、取均值的操作,还可以进行:
- 相乘: #
- 求最大值: <>
- 求最小值: ><
- 求最大值的索引: <:>
- 求最小值的索引: >:<
- 求平方和: ##
也可以进行组合操作,比如,我们想对a矩阵的每列求出最大值,然后讲着三个最大值求平均:
例子
proc iml; a={1 2 3, 4 5 6, 7 8 9}; x=a[ <>, : ]; print a,x; quit;
注意a[ <> , : ]的运算顺序一定是从左向右的:先计算每列的最大值,为{7,8,9},然后计算平均值,为8。