FOR循环语句允许用户针对不同的控制变量和字符串变量重复执行某个命令集合。FOR循环语句以关键字for开始,以关键字next结束,在这两个关键字之间可以出现任意数量的命令行。FOR循环语句的语法会根据循环语句中是使用控制变量还是使用字符串变量而有所不同。下面对这两种情况进行简单说明。
1.带有控制变量或者标量的FOR循环
为了对一个控制变量的不同值重复执行一组命令,FOR循环需要事先对控制变量设定一个初始值,然后接关键字to,最后是控制变量的终值,终值后面可以接关键字step,step后面的数值代表每次循环的步长。若用户省略step,则使用默认值1。例如,有如下一段FOR循环语句:
for !i=1 to 10 series decile{!i}=(income<level{!i}) next
在上述例子中,设定执行循环的步长step为1,变量!i两次被用作替换变量,第一次是用于声明建立10个序列,即DECILE1~DECILE10;第二次是用于声明10个变量,即LEVEL1~LEVEL10。又如:
for !i=10 to 1 step -1 series rescale{!i}=original/!i next
在上述例子中,循环步长step被设定为-1,!i被用作替换变量来建立10个序列,即RESCALE1~RESCALE10,同时!i也被用作标量作为序列original的除数。
FOR循环是从变量的初始值开始执行的,除非初始值已经超过了终值。当程序从初始值开始执行后,循环控制变量按照步长step进行增减,然后EViews将控制变量与变量终值进行比较。若它超出了终值,则循环结束。
FOR循环的一个重要应用是利用控制变量来改变样本范围。若用户在smpl命令的日期后面加上控制变量的值,则会得到一个新的日期,且整个样本区间的长度也会随着控制变量值的增加而增加。例如:
for !horizon=10 to 72 smpl 1970m1 1970m1+horizon equation eq{!horizon}.ls sales c orders next
上述程序的效果是逐渐地增加估计样本区间的长度,并滚动地对方程进行回归估计。
FOR循环的另一个重要应用是使用带有控制变量的循环语句得到序列或者矩阵对象中元素的值。例如,有如下FOR循环语句:
!rows=@rows(vec1) vector cumsum1=vec1 for !i=2 to !rows cumsum1(!i)=cumsum1(!i-1)+vec1(!i) next
该段程序所实现的效果是计算向量vec1中各元素的和,并将计算结果保存在向量cumsum1中。
为了获得序列的单个元素,用户可以使用@elem函数和@otod函数来获得所需要的序列元素。例如:
for !i=2 to !rows cumsum1(!i)=@elem(ser1,@otod(!i)) next
其中,@otod函数返回的是观测值指针的时期数(时期的计算是从工作文件开始的),即序列元素对应的时期数,@elem函数根据给定的时期数来获得序列的元素。
用户还可以在FOR循环中进行嵌套。对于外部FOR循环的每一次成功的值,内部的FOR循环都将被执行。例如:
用户在使用FOR循环语句时,应该避免改变循环控制变量的值。例如:
for !i=1 to 25 vector a!i !i=!i+10 next
在上述程序中,循环语句中的控制变量已经发生改变。这种类型的循环是很难对其进行追踪的,而且可能会产生出乎编程者意料的结果。若确实需要在循环中改变控制变量,则应该考虑使用While循环。
用户也可以在FOR循环中使用标量来代替控制变量。但是,在使用标量之前,必须对其进行声明,而且标量是不能被用作替换变量的。例如:
scalar i scalar sum=0 vector(10) x for !i=1 to 10 x(i)=i sum=sum+i next
在上述例子中,标量i和变量sum在程序结束时仍然存在于工作文件中,除非用户特意删除它们。