Eviews状态空间模型季节调整

每次做一些不知所以然的时间序列处理都会拿Eviews出来折腾一下,放回去之后又其实什么都没搞懂。

状态空间模型做季节调整,思路是将一个序列分解成时间趋势t1、季节波动t2和不规则因素t3。其中季节波动用三角函数拟合,时间因素和不规则因素用AR过程拟合,在Eviews中表示如下,c(*)是参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@signal totalpt=t1+t2+t3+[var=exp(c(2))]
@state t1=2*t1(-1)-t4(-1)+t5(-1)+[var=exp(c(3))]
@state t4=t1(-1)+[var=exp(c(4))]
@state t5=t5(-1)+[var=exp(c(5))]
@state t2=t6(-1)+t8(-1)+t12(-1)+t14(-1)+t16(-1)+[var=exp(c(6))]
@state t6=cos(0.262*c(1))*t6(-1)+sin(0.262*c(1))*t7(-1)+[var=exp(c(7))]
@state t7=-sin(0.262*c(1))*t6(-1)+cos(0.262*c(1))*t7(-1)+[var=exp(c(8))]
@state t8=cos(0.523*c(1))*t8(-1)+sin(0.523*c(1))*t9(-1)+[var=exp(c(9))]
@state t9=-sin(0.523*c(1))*t6(-1)+cos(0.523*c(1))*t9(-1)+[var=exp(c(10))]
@state t10=cos(0.785*c(1))*t10(-1)+sin(0.785*c(1))*t11(-1)+[var=exp(c(11))]
@state t11=-sin(0.785*c(1))*t10(-1)+cos(0.785*c(1))*t11(-1)+[var=exp(c(12))]
@state t12=cos(1.05*c(1))*t12(-1)+sin(1.05*c(1))*t13(-1)+[var=exp(c(13))]
@state t13=-sin(1.05*c(1))*t12(-1)+cos(1.05*c(1))*t13(-1)+[var=exp(c(14))]
@state t14=cos(1.31*c(1))*t14(-1)+sin(1.31*c(1))*t15(-1)+[var=exp(c(15))]
@state t15=-sin(1.31*c(1))*t14(-1)+cos(1.31*c(1))*t15(-1)+[var=exp(c(16))]
@state t16=cos(1.57*c(1))*t16(-1)+sin(1.57*c(1))*t17(-1)+[var=exp(c(17))]
@state t17=-sin(1.57*c(1))*t16(-1)+cos(1.57*c(1))*t17(-1)+[var=exp(c(18))]
@state t3=c(19)*t3(-1)+c(20)*t18(-1)+[var=exp(c(21))]
@state t18=t3(-1)+[var=exp(c(22))]

如果仅仅是这样,那也没什么好说的,点一点估计,结果出来了,Finished!但这时出现了两个问题,1)参数初值设定会改变结果,2)不指定初始值或随意指定,产生的分离序列会很奇怪:我采用的原始序列都是小于1的,拟合出来的趋势序列绝对值甚至出现几十上百的情况。

在不懂原理的情况下怎么解决?后来在人大经济论坛上看到了一种思路。首先,将状态方程(所有state)后面的var项去掉,然后进行估计,根据结果可以产生t1-t18序列;其次,用产生的18个序列,还有原始序列,对所有state方程进行回归,如c(2)就可以用totalpt-(t1+t2+t3)的方差算出来,c(7)可以用t6,t6(-1),t7(-1)回归的残差平方和比样本数算出来,而c(1)取2;最后,把这些c(*)作为初值,增加一行,就可以得出比较理想的拟合序列了。

@param c(1) 2 c(2) -5 c(3) -9 c(4) -9 c(5) -9 c(6) -9 c(7) -10 c(8) -10 c(9) -10 c(10) -10 c(11) -10 c(12) -10 c(13) -10 c(14) -10 c(15) -10 c(16) -10 c(17) -10 c(18) -10 c(19) 0 c(20) 0 c(21) -19 c(22) -19

至于原理,以后有机会再研究。