【SAS Says】高级篇:IML(1)

2018-04-04 16:05:22 浏览数 (1)

开篇话:

前段时间数说君征原创稿,果真得到了不少牛人的赐稿,比如本文的作者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。

sas

0 人点赞