上面的程序是误差服从广义的误差分布(ged)推广形式的模型最大似然法估计参数的小程序,但是在if语句过程中老是报告z1变量未被定义,请高手指点帮忙修改以下.
thanks in advance!!!
'change path to program path %path = @runpath + "../data/" cd %path
' load workfile load sy
series y = sy
' set sample to 1/2/82-7/9/92 (10/6/86 is obs 3945) sample s0 1 1 sample s1 2 500 smpl s1
' get starting values from Gaussian ARCH equation eq1 eq1.arch y c show eq1.output
' declare and initialize parameters coef(1) mu = eq1.c(1) coef(1) omega = eq1.c(2) coef(1) alpha = eq1.c(3) coef(1) beta = eq1.c(4) coef(1) lambda=0.5 coef(1) a=0.2
' set presample values of expressions in logl smpl s0 series sig2=omega(1) series res=0 !pi = @acos(-1)
' set up GARCH likelihood logl ll1 ll1.append @logl logl ll1.append res=y-mu(1) ll1.append sig2 = omega(1)+alpha(1)*res(-1)^2 +beta(1)*sig2(-1) ll1.append u=@gamma(2/lambda(1))/@sqrt(@gamma(3/lambda(1))*@gamma(1/lambda(1))*(1-3*a(1)+3*a(1)^2)-@gamma(2/lambda(1))^2*(1-2*a(1))^2) ll1.append z=res/@sqrt(sig2) ll1.append z1=res/@sqrt(sig2)+(1-2*a(1))*u if z1<=0 then ll1.append log1=@log(lambda(1))+@gammalog(2/lambda(1))-@logu-@gammalog(1/lambda(1))+(@gamma(2/lambda(1))/a/@gamma(1/lambda(1))*z1/u)^lambda(1) else z1>0 ll1.append log1=@log(lambda(1))+@gammalog(2/lambda(1))-@logu-@gammalog(1/lambda(1))-(@gamma(2/lambda(1))/(1-a)/@gamma(1/lambda(1))*z1/u)^lambda(1) endif
' estimate and display output smpl s1 ll1.ml(showopts, m=1000, c=1e-5)
'estimate same model using EViews' ' build-in function
equation eq2 eq2.arch(tdist) y c show eq2 show ll1.output
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
指出几点仅供楼主参考
运行到if语句时,ll1的设定还没有完成,当然更没有运行,因此z1变量此时必定是未被定义。是不是应该将if语句放入ll1的设定中?即在if z1<=0 then,else z1>0以及endif三个语句前加上ll1.append
另外,楼主需要考虑,如果将if语句放入ll1的设定中,对ll1进行估计时EViews有个迭代运算次序的问题,z1<=0这个条件不知是不是逐个观测值进行判断。好像上面的程序是按观测值运算的,可以试试。
程序中这句:ll1.append z=res/@sqrt(sig2), 定义的z没有用到啊
本人曾经尝试过将if then ,else 以及endif 语句加入ll1.append,但是还是出现上述的问题,另外就是当把res/@sqrt(sig2)直接加入到z1的定义中时,z1无法出来数值,还请高手指教.
另外就是在将z1加入到ll1时,本人是希望z1出来的逐个数值与0对比,但是好象z1代表了一个数列,不知应该如何将数列里的每个数提取出来与0进行判断,希望指点迷津.
谢谢!!!1