【SAS Says·扩展篇】IML
分6集,回复【SASIML】查看全部:
- 入门 | SAS里的平行世界
- 函数 | 函数玩一玩
- 编程 | IML的条件与循环
- 模块 | 5分钟懂模块
- 穿越 | 矩阵与数据集的穿越
- 作业 | 编一个SAS回归软件
这是一段“资产收益率情景到评级情景的映射”的SAS程序,出自《金融计算与建模》(朱世武,282页):
代码中既用到了循环语句(do .. to ..),也用到了条件语句(if then),本文我们就来认识一下IML模块中的循环与条件语句。
点击查看上两节: 【SAS Says】扩展篇:IML(1):IML入门 【SAS Says】扩展篇:IML(2):函数
【SAS Says · 扩展篇】IML:条件与循环
1
IF-THEN 语句
IF-THEN语句,作为条件语句,虽然用法与其他语言没有什么区别,但是这里是用在矩阵上,那么就有很多方面需要注意。比如,
If a<b then statement.
这里的a和b是矩阵,那么请问,当我在比较a和b时,我在比较什么?
a<b,比的是a中的每个元素和b中相对应的元素,
if a<b,这个条件指的是a中所有元素都要小于b中所有元素,然后才会执行后面的语句,比如:
例子
proc iml; a={1 2, 3 -4}; b={1 -1, 0 1}; if a<b then print 1; else print 0; quit;
那么,假如我想把条件换成a中有任何一个元素小于b中相对应的元素,就执行后面的语句,该怎么写程序?很简单,加一个any函数:
例子
proc iml; a={1 2, 3 -4}; b={1 -1, 0 1}; if any(a<b) then print 1; else print 0; quit;
如果执行语句部分,有多条要执行的怎么办?和SAS base一样,用do来执行:
例子
proc iml; a={1 2, 3 -4}; b={1 -1, 0 1}; if any(a<b) then do; print 1; print a; end; quit;
记得要加end啊。
2
循环语句
(1)DO To BY
Do variable=start TO stop BY increment; Statement; End;
比如:
例子
proc iml; do i=10 to 100 by 20; print i; end; quit;
(2)DO WHILE
Do while (expression); Statement; End;
比如:
例子
proc iml; i=10; Do while (i<100); print i; i=i 30; end; quit;
(3)DO UNTIL
例子
proc iml; i=10; do until (i>100); print i; i=i 30; end; quit;
(4)用do语句导入数据
Infile ‘数据文件路径’; Do data; Input v1; x=x//v1; End;
比如,有一个数据文件testSet.txt
该文件在D盘下面,把它读入SAS的矩阵模块中,编程一个列向量。
例子
proc iml; infile 'D:testSet.txt'; do data; input a; x=x//a; end; print x; quit;