一、案例来源与某书籍,数据集样式,采用动态线性回归的方式拟合时间序列模型:
查找gfr与自变量pe、ww2、pill的关系,R代码如下:
rm(list = ls()) setwd("D:\\download\\系数\\金融时间序列分析") library(foreign);library(dynlm);library(car);library(lmtest) fertil3 <- read.dta("http://fmwww.bc.edu/ec-p/data/wooldridge/fertil3.dta") tsdata <- ts(fertil3,start = 1913) # create time series start at 1913 # 建立动态回归(dynlm函数),包含滞后项(maybe x or y,this is x: L()),此时包含1阶和2阶滞后 res <- dynlm(gfr~pe+L(pe) + L(pe,2) + ww2 + pill, data = tsdata) # create Linear regression of model with lags coeftest(res) # F test H0 : all pe coefficients are=0 linearHypothesis(res, matchCoefs(res,"pe"))
pe取2阶滞后,pe coefficients are=0,对因变量的影响pe相关性均不强,再进行F检验得到如下效果。
二、去趋势项(针对非平稳性时间序列数据,如存在伪回归问题)
解决方式:
- 自变量中加人趋势项(trend函数),将数据集从时间维度上做一个趋势,减轻趋势性对回归的影响
数据集:
library(foreign);library(dynlm); library(stargazer) hseinv <- read.dta("http://fmwww.bc.edu/ec-p/data/wooldridge/hseinv.dta") tsdata <- ts(hseinv, start = 1947) res1 <- dynlm(log(invpc) ~ log(price), data = tsdata) res2 <- dynlm(log(invpc) ~ log(price) + trend(tsdata), data = tsdata) stargazer(res1,res2,type = "text")
检验结果如下:
结果看出趋势项对回归的影响是显著的,有趋势项时,自变量不显著,不含趋势项时,自变量是显著的。说明存在伪回归问题,存在趋势项同时影响X和Y,但X和Y之间不存在相关性。
三、去季节性影响(season())
library(foreign); library(dynlm); library(lmtest) barium <- read.dta("http://fmwww.bc.edu/ec-p/data/wooldridge/barium.dta") tsdata <- ts(barium, start= c(1978,2), frequency = 12) # 月度数据,monthly time series begining in Feb. 1978 res <- dynlm(log(chnimp) ~ log(chempi) +log(gas) + log(rtwex) + befile6 + affile6 + afdec6 + season(tsdata), data = tsdata) coeftest(res)
季度数据进行平均(哪些季度影响显著):
四、非平稳性序列--随机游走(游走结果不确定) X
1.形式(其中误差项服从独立同分布,xt-1前系数等于1):
随机游走模型(d=1,p=q=0),ARIMA(p,d,q)为ARIMA(0,1,0)即为随机游走模型。
set.seed(1234) plot(c(0,50),c(0,0),type = 'l', lwd=2, ylim = c(-18,18)) # initial graph # loop over draws for (r in 1:5) { e <- rnorm(50) y <- ts(cumsum(e)) # random walk as cumulative sum of shocks lines(y, col = gray(.6)) # add line to graph }
图形形式如下:
2. 带趋势的随机游走(在随机游走的基础上带上趋势a,如a=2):
set.seed(2224) plot(c(0,50),c(0,100),type = 'l', lwd=2) # initial graph # loop over draws for (r in 1:5) { e <- rnorm(50) y <- ts(cumsum(2+e)) # random walk as cumulative sum of shocks lines(y, col = gray(.6)) # add line to graph }
随机游走非平稳序列需Xt前系数=1,相反平稳序列需系数小于1
3.差分方式处理随机游走(yt-yt-1,yt-1-yt-2,...................),作用是使时间序列中单位根或随机游走变平稳
set.seed(22224) plot(c(0,50),c(2,2),type = 'l', lwd=2,ylim = c(-1,5)) # initial graph # loop over draws for (r in 1:20) { e <- rnorm(50) y <- ts(cumsum(2+e)) # random walk as cumulative sum of shocks Dy <- diff(y) # first difference lines(Dy, col = grey(.6)) # add line to graph }
五、序列相关
1.序列相关并不影响估计的无偏性和一致性,而仅影响标准误差项,序列相关指其误差项和误差的滞后项之间有一定联系(显著相关), 序列相关的存在可使得回归结果受到误差项的序列相关性影响(影响回归系数的显著性)。
library(foreign);library(dynlm); library(lmtest) phillips <- read.dta("http://fmwww.bc.edu/ec-p/data/wooldridge/phillips.dta") tsdata <- ts(phillips , start=1948) reg.s <- dynlm(inf ~ unem, data = tsdata, end = 1996) # 通货膨胀率和失业率之间的关系 summary(reg.s)
结果显示通货膨胀率和失业率之间不显著。是否是序列相关造成的?下一步提取出残差项。(误差之间存在序列相关性,由于无法获取误差项,固以残差替代)
检测模型残差和其残差滞后项之间是否存在相关性:
residuals.s <- resid(reg.s) # 模型残差 coeftest(dynlm(residuals.s ~ L(residuals.s))) # 残差和残差滞后项进行回归
结果发现存在显著正相关,而失业率对因变量影响不显著?考虑通过对通货膨胀率进行差分观察(d)其对失业率的影响,差分逻辑是观察通货膨胀率的变化对失业率带来的影响。
reg.ea <- dynlm( d(inf) ~ unem , data = tsdata, end = 1996) residual.ea <- resid(reg.ea) coeftest(dynlm(residual.ea ~ L(residual.ea)))
差分以后,再次观察残差项和其滞后项之间就不存在相关性了,证明对因变量差分后的模型误差之间就不存在序列相关性了。检查一下模型效果相关性就变显著了。
2.消除序列相关性影响
判断误差项之间序列相关其他方式:
library(foreign); library(dynlm) ; library(car) ; library(lmtest) barium <- read.dta("http://fmwww.bc.edu/ec-p/data/wooldridge/barium.dta") tsdata <- ts(barium, start = c(1978,2), frequency = 12) reg <- dynlm(log(chnimp) ~ log(chempi) + log(gas) + log(rtwex) +befile6 +affile6 + afdec6 , data = tsdata ) residual <- resid(reg) resreg <- dynlm( residual ~ L(residual) + L(residual,2) + L(residual,3) +log(chempi) + log(gas) + log(rtwex) +befile6 +affile6 + afdec6, data = tsdata )
结果检验:
残差一阶滞后显著,证明存在序列相关性(判断方式为所有滞后项只要有一个显著即显著存在序列相关影响)。
或者对三个滞后项做F检验(lmtest包linearHypothesis方法)
linearHypothesis(resreg, c("L(residual)"))
结果也说明一阶滞后是显著的。说明误差项存在序列相关。
第三种是使用bgtest,原理是使用拉格朗日乘数的统计量来讨论是否有序列相关性。检验回归的R方,原因是回归方程包含了误差项,如果R2很大,则说明滞后项可以解释残差本身,反之不能解释残差。
(需要注意的是,bgtest检测的是原模型本身,不需要去做残差处理。其中参数 order=n 表示考虑n阶以内的滞后项)
结果说明原始模型中存在序列相关性。
3.异方差问题
随机误差的方差项非常数,而是随时间变化而变化。判断残差序列是否存在异方差,可以通过残差的时序图或残差的平方时序图来判断
残差平方图:
若残差序列是方差齐性的,则 存在E(ξt) = σ2 , ξt2 应该在某个常数值 σξ2 附近随机波动,它不应该具有任何明显趋势,否则就认为残差序列存在异方差性。
1)帕莱斯温士顿估计(orcutt包)--- cochrane.orcutt() ---- 消除序列相关性
library(foreign) ; library(dynlm); library(car) ; library(orcutt) barium <- read.dta("http://fmwww.bc.edu/ec-p/data/wooldridge/barium.dta") tsdata <- ts(barium, start = c(1978,2) ,frequency = 12) # OLS estimation olsres <- dynlm(log(chnimp) ~ log(chempi) + log(gas) + log(rtwex) + befile6 + affile6 + afdec6 ,data = tsdata ) model <- cochrane.orcutt(olsres) # 注意的是温士顿估计model和summary(olsres)模型参数的显著性是一样的,但是相关系数不同
summary(olsres)
2)coeftest( , vcov = hccm) 检测异方差标准误
library(foreign) ; library(car) ; library(lmtest) ; gpa3 <- read.dta("http://fmwww.bc.edu/ec-p/data/wooldridge/gpa3.dta") # OLS regression reg <- lm(cumgpa ~ sat+hsperc+tothrs+female+black+white,data = gpa3,subset = (spring==1)) bptest(reg) # results with usual SE coeftest(reg) # results with HAC SE coeftest(reg, vcov = hccm)
3)序列相关文件标准误和普通标准误coeftest () / coeftest( , VCOVHAC)
library(foreign) ; library(dynlm) ; library(lmtest) ; library(sandwich) minwg <- read.dta("http://fmwww.bc.edu/ec-p/data/wooldridge/prminwge.dta") tsdata <- ts(minwg , start = 1950) # OLS regression reg <- dynlm(log(prepop) ~ log(mincov) + log(prgnp) + log(usgnp) + trend(tsdata),data = tsdata) # results with usual SE coeftest(reg) # results with HAC SE coeftest(reg, vcovHAC)
4)自回归条件异方差( 误差项的平方可以用误差平方的滞后项来解释)
运用在如股票波动存在聚集性(暴涨和暴跌),暴涨和暴跌之间不存在相关性,而暴涨和暴跌的平方之间存在相关性,残差项平方平衡掉涨和跌符号带来的影响。
library(foreign) ; library(dynlm) ; library(lmtest) nyse <- read.dta("http://fmwww.bc.edu/ec-p/data/wooldridge/nyse.dta") tsdata <- ts(nyse) # Linear regression of model reg <- dynlm(return ~ L(return) ,data = tsdata) # squared residual residual.sq <- resid(reg)^2 ARCHreg <- dynlm(residual.sq ~ L(residual.sq)) coeftest(ARCHreg)
检验结果发现平方项之间确实有强的相关性。