Eviews 编程基础
武汉大学经济学系数量经济学教研室《实践教改项目组》编制
Eviews 软件支持批处理模式,用户须将待执行的命令按照一定的格式组成一个程序,提交计算机处理.如果用户有计算机编程的经验,将会发现Eviews的特性与大多数语言的特性相似。Eviews程序语言的最主要的新特征是它是宏观的替换语言,用户可以通过把包含有分量名字的变量名连接起来产生对象名。
一.eviews命令基础
在学习编程之前,先回顾一下Eviews的一些常用命令。
(1) 对象类型指定
新建或调用一个对象时,最一般的命令格式是
object_type object_name
其中,对象名称(object_name)自定义,对象类型(object_type)必须采用Eviews规定的标志符,它们有:equation, graph,group,matrix,model,pool,rowvector,sample,series,table 和vector等。
例如命令
series z=3*x –y/2
产生新序列z。命令
matrix(2,3) x
生成名为x的一个2×3矩阵。
(2) 对象命令
对象命令用于指定对象的某种观测方式或进行某项过程操作,一般格式为
action object.view_prog arg_list
其中,action包括以下四个选项:
do 执行程序而不新打开窗口
freeze 从当前对象观测状态生成
或图象
print 打印当前对象观测状态
show打开指定对象窗口进行观测
object指对象名称,view_proc代表待执行的对象观测方式或操作过程,arg_list是对观测方式和操作过程的进一步说明,其中的关键字都用空格分开。
实际应用时action所代表的部分常常可以省略,例如
rev.line 等价于show rev.line
即绘制序列对象rev的折线图。
二. 程序基础
(1) 新建程序
一个程序不是在一个工作文件中的一Eviews对象。它仅仅只是包含Eviews命令的一文本文件。为了生成一新的程序,用户可以点击File/New/Program。用户将会看见一标准的文本编辑窗口。在这里用户可以输入程序的命令文字。用户也可以在命令窗口通过输入Program来打开程序窗口,例如
Program prg2
将打开了一名字为PRG2的一程序窗口。程序名字应该遵守标准的Eviews文件取名规则。
保存程序时,点击窗口上方工具栏的Save 或Save As按钮来完成保存任务.
当程序已经被保存后,它将有扩展名.PRG。
(2)打开程序
打开原有程序只需在主菜单选择File/Open/Program,再输入要打开或调用的程序名称即可。
(2) 运行程序
有几种方法可以用来运行一程序,最简单的方法是在程序编辑窗口点击Run按钮,屏幕会弹出运行程序定义对话框,如图:
图1
用户可以在对话框最上面的空行输入程序的名称,如prg1。在Program arguments下面指定命令行参数值。Execution mode 下面的选项是关于程序的运行模式,点选Verbose update screen表示运行程序同时刷新计算机屏幕,Quiet no screen则不更新。对话框右下角的空格中的数值表示计算机终止程序运行条件即程序执行中错误数的最大值。点选对话框最下面的选项表示将以上定义作为默认运行模式。
用户也可以通过输入Run命令和程序文件名来运行一程序如:
run prg2
or run d:\eviews\ prg2
(3) 中断程序运行
用户按F1键将终止程序的运行,或当程序运行到Stop命令时,它也将终止,或当它达到最大的错误次数或它通过Run定义完成了一文件所有的命令时。
当用户在程序中包含Exit命令时,Eviews将退出运行。
三. 简单程序
(1) 简单程序
最简单的程序只是一系列命令。程序的执行等同于把命令一个一个地输入到命令窗口中。如
Program myprog
在窗口中生成一新的程序。
(2) 程序变量
用户使用程序来编辑.运行和再运行Eviews命令集时,程序语言的真正力量来
自于程序变量和程序控制的定义的使用。
(3)控制变量
控制变量是在Eviews程序中用于代替具体数值的变量,一旦对其赋值,就可以在程序任何地方进行调用。定义一个控制变量的格式是在变量名前标“!”,且变量名不能多于15个字符,如
!y !z !pi
对控制变量赋值使用赋值号“=”,如
!sum=!sum+1
smpl 1980:1+!x 1997:12+!x
(4)字符串变量
字符串变量的取值是一段文本,并在头尾使用双引号。变量名前的标号为“%”,赋值号仍是“=”,例如
%pi=“3.14159”
%sample1=“1990:3 1999:6”
赋值后的字符串变量可用于相关命令,如
smpl %sample1 等价于 smpl 1990:3 1999:6
下面介绍几个常用的字符串函数。@left返回字符串左端开始给定个数的字符;@right返回字符串右端开始给定个数的字符;@mid返回字符串指定起点开始向右给定个数的字符。如
%st1=“I am happy to meet you”
%st2=“We believe Eviews is a wonderful software”
%st3=“learn”
%qq=@left(%st1,13)+ @right(%st3,5)+ @mid(%st2,11,7)
函数@left(%st1,13)表示从变量%st1左端开始截取13个字符,即“I am happy to”;函数@right(%st3,5)表示从变量%st3右端开始截取5个字符,即“learn”;函数@mid(%st2,11,7)表示从变量%st2左起第11个字符开始,向右截取7个字符,即“Eviews”。因此%qq的结果为“I am happy to learn Eviews”。另外,函数@str将控制变量取值转化为字符,若!y=200,则函数@str(!y)返回字符200。
(5)替换变量
看例子
%x=“gdp”
ls %x c %x(-1)
%x=“ks”
ls %x c %x(-1)
这里,通过改变字符串变量%x的取值来代替它在命令中的实际内容,因此称该变量为替换变量。当替换变量与其他字母.数字或变量合用时,应用大括号加以界定,如
!y=3
series x{!y}
这组命令相当于定义了一个名为x3的序列。
(6)命令行参数
命令行参数是一些特殊的字符串变量。在运行程序时,计算机会出现对话框让用户给出参数的具体值。若程序中用到了这些参数,则每次运行程序都可以改变参数值,使程序有较强的通用性。在Eviews中,命令行参数名默认为%1,%2,%3等
等。例如
equation eq2
smpl 1988:1 1999:6
eq2.ls %0 c %1 %1(-1) inc
如果在图1所示的运行程序对话框中定义%0=ks和 %1=m2,则程序最后一行命令相当于
eq2.ls ks c m2 m2(-1) inc
(7)程序控制
Eviews提供了控制程序执行的一些方法,其作用是对于不同的条件,用户可以有选择地或反复地执行一些命令。
(Ⅰ)IF条件句
IF条件句由关键词if 开始,后面紧跟是条件表达式,然后是关键词then。条件表达式中常使用逻辑运算符and 和or,如果需要还可以加上圆括号。若表达式为真,则直到endif的所有命令都被执行,否则命令被跳过,例如
If !x>5 and !x<10 then
Smpl 1978:1 1980 :1+!x
Endif
表示当控制变量!x取值在6到9之间时,产生新样本期1978:1 1980 :1+!x。
IF语句还可以包含else从句,当且仅当if条件表达式不成立时执行。因此,若表达式为真,则运行if 和else之间的命令,否则执行else到 endif之间的命令,例如
If !x>0 then
Series y1=y/!x
Else
Series y1=y
Endif
命令表示当控制变量!x取值为正时,新序列y1用原序列y除以该控制变量值产生;当控制变量取值为负或为0时,新序列y1等于原序列y。
IF语句也能用于字符串变量并可以嵌套,如
If %x=“summer”or %x=“autumn”then
Series y=1
Else
If %x=“winter” then
Series y=2
Else
Series y=3
Endif
Endif
(II)FOR循环
FOR循环可实现将控制或字符串变量的不同取值代入相同一组命令反复执行,但对不同的变量,语法有区别。
先看对控制变量使用FOR循环,如
for !x=1 to 9
series y{!x}=(!x+1)
next
这里,变量!x两次被用作替换变量,分别产生名为y1 到y9九个序列和定义序列值为2到10。
在for语句中一般还应该有关键词step,后面跟循环变量每次第进步长数值,上面的例子省略了这一部分,系统默认为步长是1。语句
for !x= 4 to !x=9 step 1
表示每循环一次,!x的值加1,循环总次数为5次。
与IF语句类似,FOR循环也可以嵌套使用。如
matrix (6,15) matr
for !x=1 to 6
for !y=1 to 15
matr(!x ,!y)=(!x+1)*5 +!y
next
next
这段程序用于产生一个6行15列的矩阵,并将其命名为matr。第四行赋值语句的意义是对第!x 行第!y列的元素进行赋值。
再看对字符串变量使用FOR循环。对字符串变量使用FOR循环时需要在变量名后列出它的取值清单,如
for %x gdp ks rev nkf
equation {%x}1.ls %x c {%x}(-1) time
next
此程序实际估计了名为gdp1,ks1,rev1 和nkf1的四个方程。
循环嵌套的构造方法跟嵌套的IF条件语句很类似,如
!x=1
for %1 10 30
for %2 50 80 90
smpl %1 %2
equation eq{!x}.ls gdp c export
!x=!x+1
next
next
在此程序里共循环了6次,样本期分别为10到50,10到80,10到90,30到50,30到80,30到90,并且控制变量!x起到了给诸方程命名的作用。
(Ⅲ)WHILE循环
在实际应用中经常遇到的是只有满足特定条件时才执行循环命令的情况,这就需要使用WHILE循环语句。WHILE循环以while语句起始,以wend语句结尾,中间可包括任意数目的命令,也允许嵌套使用。
While语句由关键词While和包含控制变量的表达式构成。该表达式具有逻辑真/假值或一个数字取值。对于取值为一个数字的情况,0表示假,其他非零数值则代表真。若表达式为真,则循环执行到wend为止的命令,否则直接运行wend后的程序。例如
!x=1
!y=10
while !x<9 and !y <100
smpl 1990:6 1999:1+!x
series gdp{!x}=gdp/!x
!x=!x+1
!y=!y+2
wend
程序的第一部分作用是给while 语句中的控制变量!x 和!y赋初值,并且一定要注意在循环命令中对控制变量取值更新,如语句!x=!x+1和!y=!y+2起到了避免出现死循环的作用。
(8)处理运行错误
一般情况下,Eviews一旦遇到错误就将停止运行,但用户可使程序继续运行即使程序遇到了错误。在后一种情况下,当发生错误时,用户可能希望完成不同的任务。如,用户希望程序跳过那些产生累积错误结果的命令行而继续运行。
为了检验和处理运行错误,用户可以使用@errorcount函数来返回在运行程序中遇到的错误数目。如:
!err1=@errorcount
关于错误的数目的信息可以被标准的程序定义使用来控制程序的行为。
如,为了检验一方程的估计是否产生了错误,可以比较命令运行前后的错误的数目。如:
!old_count=@errorcount
equation eql.ls y c x
!new_count=@errorcount
if !new_count >!old_count
[Varias Commands]
endif
此程序中,程序将运行一系列命令当方程EQL的估计产生了新的错误。
下面讨论其他的方法。偶尔地,用户可能希望终止一程序或在某些情况下终止一循环的运行。例如,假定用户的程序需要一序列SER!来生成非负的值。下面的命令将检测该序列是否是负的,当SER1有负值时,将终止程序的运行:
series test=(ser1<0)
if @sum(test)<>0 then
stop
endif
(9)多程序文件
当使用长程序时,用户可以通过使用多文件来组织程序的代码。如,有一名为POWER.PRC的程序包含一系列命令。用户可能试图使用RUN命令来运行该程序,必须注意的是Eviews可能将在执行某些命令后停止,这不是用户所期望的,如:
run power.prg
series x= gdp1
上面的程序只运行POWER里面的命令,并在产生序列X前停止。这可能不是用户所期望的。
用户可以使用include来在另一个程序文件中包含一程序文件内容。如可以把
include power
放在任何其他需要使用POWER里面的命令的其他程序的前面。所以上面的程序可以改为
include power
series x=gdp1
就可以产生系列x了。
子程序提供了更普遍的.可选择的方法来重复使用命令和参数。
(10)子程序
子程序是命令集,它可以重复完成某一给定的任务而作小的变动。用户也可以使用一程序中的子程序在另一个程序中来完成相同的任务。
(I) 定义子程序
子程序以关键字subroutine开始,后面接行的名字和任意的参数,并以endsub结束。任何数量的命令都可以在两者之间出现。最简单的子程序是以下形式的:
subroutine y_square
series x=y^2
endsub
这里关键字subroutine后面只接了行的名字。此子程序没有参数,因此每一次被使用它都做相同的事。它的结果是存在产生系列y的平方并存在新系列x中。
可以使用return命令来强迫Eviews在任何时间从子程序中返回。Return的一般用法是当意外的错误发生时。
(II) 带有参数的子程序
子程序很多情况下带有一些具体的变量,更一般地,子程序可以带有参数。
定义带参数的子程序,以subroutine开始,后面是子程序名,左参数,逗号,右参数。每一个参数都是Eviews对象中的一类,并带有参数名。控制变量可以通过标量来传递,字符串变量可以通过字符串类来传递。例如
subroutine power(series v, series t, scalar p)
v=t^p
endsub
此子程序可以生成前面例子中的y_square,当调用POWER并令v=x,t=y,p=2,则可以得到与前面例子中相同的y_square的值。
下面讨论怎样调用子程序。
(III)子程序替代变量
子程序的定义应放在程序的开始,在使用调用函数时,子程序才开始执行。例如:
subroutine y_square
series x=y^2
endsub
load mywork
fetch y
call y_square
此程序的执行以load声明开始,子程序定义被跳过,直到运行到最后一行的“call”才开始执行。
在定义另一个子程序前,关键字subroutine 后必须以endsub结束。子程序可以相互调用,甚至可以调用它自身。
(Ⅳ)调用子程序
一旦程序定义了一个子程序,通过关键字call就可以在程序中调用了。Call后跟子程序名和包含在变量中的一系列需要用到的参数,并用逗号把参数分开。如果子程序带有参数,它们必须以定义中的顺序为它们赋值。下面是一个调用子程序的例子:
include powers
load mywork
fetch z gdp
series x
series gdp2
series gdp3
call y_square
call power(gdp2,gdp,2)
call power(gdp3,gdp,3)
第一个调用的子程序得到x,值为y的平方;第二个调用的子程序得到gdp2,值为 gdp的平方,最后调用的子程序得到gdp3,值为gdp3的三次方。
(Ⅴ)全局变量和局部变量
子程序的变量和对象不是全局的,就是局部的。
全局变量是当调用子程序时存在于工作文件中的对象或在工作文件中的一个子程序中产生的对象。当子程序运行完后,全局变量仍保留在工作文件中。
局部变量是只在子程序中有意义的变量。一旦子程序运行完毕,局部变量就从工作文件中消除了。当在主程序中调用子程序时,用户不会过多的关心局部变量,因为局部变量将在子程序完成后立即消失,主程序接着运行原来的程序。
(Ⅵ)全局子程序
一般情况下,Eviews中的子程序都是全局的。任何全局子程序与存在于工作文件中的任一个全局对象相联系的。当子程序被调用时,如x是工作文件中的一序列,子程序可以调用,并可以改变x的值。
全局子程序中的变量的规则是:
[1]新生成的对象都是全局的,并在子程序完成时仍包含在工作文件中。
[2]全局对象可以在子程序中直接使用和更新。然而,如果一全局对象与一子程序中的参数有相同的名字,那么变量的名字将与子程序中的参数的名字相联系,而不是全局变量。
[3]与全局对象相对应的参数将通过相关的参数直接使用和更新。
下面是调用全局子程序的一个简单例子。
Subroutine y_square
Series x=y^2
Endsub
Load mywork
Fetch y
Call y_square
Y_square 是一全局子程序,它与全局序列y相联系。新全局序列x值为序列y 的平方。当y_square运行完后, x和y的值都保存在工作文件中。
(Ⅶ)局部子程序
全局子程序生成的所有对象都是全局的,并将保留在工作文件中,当从子程序中退出时。当用户在定义子程序时使用关键字local,就得到一局部子程序。所有由局部子程序生成的对象是局部的,并将在工作文件中消除,当子程序运行结束时。当用户希望在子程序中生成许多临时的但不需要保存的对象时,局部子程序是非常有用的。
局部子程序中的变量规则是:
[1]用户不能直接地在一个子程序中使用或更新一个全局变量。
[2]与全局对象相应的参数可以通过相关的参数来使用和更新。
[3]子程序中所有的其他的对象都是局部的,并将在子程序运行完时消失。
要保存局部子程序的运行结果,用户必须在参数中直接保存它们,并在程序运行完时返回它们。例如:
subroutine local ols(series y, series h, scalar ss)
equation temp_eq.ls y c y(-1) y(-1)^2 y(-1)^3
temp_eq.makeresid h
ss=remp_eq.@ss
endsub
此局部子程序带有作为输入的序列y,作为输出返回结果的序列h和标量ss。
方程对象TEMP_EQ对子程序来说是局部的,并将在子程序运行完时消失。