首页 > 技术文章 > R与时间序列

hqczsh 2020-05-02 13:57 原文

一、案例来源与某书籍,数据集样式,采用动态线性回归的方式拟合时间序列模型:

 

 

 

查找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) = σ,    ξ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)

   

 

 检验结果发现平方项之间确实有强的相关性。

推荐阅读