IML的条件与循环 | 【SAS Says·扩展篇】IML:3.编程

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

【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;


sas

0 人点赞