这里分享一下R语言实现VAR和SVAR的整个流程。
主要步骤包括:
1.单位根检验
2.确定滞后阶数
3.格兰杰因果检验
4.模型稳定性检验
5.脉冲响应
6.方差分解
(Johansen协整检验,如果需要的话)
整个过程用到的R语言的扩展包有:
library(zoo)
library(vars)
library(tseries)
首先,数据是下面的样子:
ps:数据是时间序列类型,可以通过下面方法将dataframe转成时间序列类型
data = ts(data)
1.单位根检验
#对data的第一列进行单位根检验
adf.test(data[,1])
2.滞后阶数确定
VARselect函数结果包括AIC、HQ、SC和FPE准则
#参数y为时间序列数据,lag.max为最大滞后阶数
#参数type值包括const截距,trend趋势,both同时包含截距和趋势,none不包含截距和趋势
VARselect(y=data, lag.max = 10, type = c("const"))
3.格兰杰因果检验
格兰杰因果检验有两个方法,第一个是在构造模型之前,第二个是在构造模型之后在模型的基础上进行格兰杰因果检验。
(1)构造模型之前格兰杰因果检验
#函数格式:grangertest(yt~xt)
eg:
grangertest(Value~BCI)
(2)构造模型之后格兰杰因果检验
#函数格式:causality(VARModel,cause)
eg
var = VAR(data ,p = 2, type = "const")
causality(var,cause=c('Count','Value'))
ps:在这里如果想要构建SVAR模型的话,需要根据实际情况构建两个矩阵amat和bmat,然后使用这两个矩阵来构建SVAR模型:
svar = SVAR(var,Amat = amat,Bmat = bmat)
4.模型稳定性检验
#这里使用“OLS-CUSUM”,它给出的是残差累积和,在该检验生成的曲线图中,残差累积和曲线以时间为横坐标,
#图中绘出两条临界线,如果累积和超出了这两条临界线,则说明参数不具有稳定性。
sta = stability(var, type = c("OLS-CUSUM"), h = 0.15, dynamic = FALSE, rescale = TRUE)
plot(sta)##结果稳健
5.脉冲响应
#标题栏说明,这是BCI(或者其他变量)对各个变量(包括BCI自身)的脉冲响应
(1)VAR脉冲响应
var.irf<-irf(var,n.head=10)
plot(var.irf)
(2)SVAR脉冲响应
svar.irf<-irf(svar,n.ahead = 100)
plot(svar.irf)
6.方差分解
#反映了各变量的贡献率
(1)VAR方差分解
fevd1<-fevd(var, n.ahead = 10)
fevd1$Count
(2)SVAR方差分解
fevd2<-fevd(svar, n.ahead = 10)
fevd2$Value
ps:有时候需要进行Johansen协整检验
#Johansen协整检验,
#对r=0(不存在协整关系)的检验统计量大于临界值,表明拒绝原假设
yJoTest = ca.jo(data, type = c("trace"), ecdet = c("none"), K = 2)
summary(yJoTest)
网页链接
R语言中的dplyr包非常神奇,里面包含很多的函数,今天我们就来介绍下窗口函数的应用。窗口函数应用
mtcars %>% group_by(cyl) %>% mutate(rank= min_rank(desc(mpg)))
mtcars %>% group_by(cyl) %>% mutate(mpg_max = max(mpg))
原来的明细还保留,同时每个分组的统计值算出来了,是不是很方便
1.2 批量操作
同时若你嫌麻烦一个个地对变量进行操作,还可以使用mutate_each函数对数据框中的变量批量操作,通过调整funs(即functions)和vars(variables)参数控制functions的数量,以及参与变形的variables,这里控制variables的技巧与select函数相似。
#对每个变量进行排名
mtcars%>%mutate_each(funs(dense_rank))
mpg cyl disp hp drat wt qsec vs am gear carb
1 16 2 13 11 16 9 6 1 2 24
2 16 2 13 11 16 12 10 1 224
3 19 16 615 7 22 2 221
4 17 2 16 115 1624 2 111
5 13 3 23 156 18 10 1 112
#对disp的变量进行排名
mtcars%>%mutate_each(funs(dense_rank,min_rank),disp)
mpg cyl disp hp dratwt qsec vs am gear carb dense_rank min_rank
1 21.0 6 160.0 110 3.90 2.620 16.46 0 144 13 13
2 21.0 6 160.0 110 3.90 2.875 17.02 0 144 13 13
3 22.8 4 108.0 93 3.85 2.320 18.61 1 141 6 6
4 21.4 6 258.0 110 3.08 3.215 19.44 1 031 16 18
5 18.7 8 360.0 175 3.15 3.440 17.02 0 032 23 27
6 18.1 6 225.0 105 2.76 3.460 20.22 1 031 15 17
7 14.3 8 360.0 245 3.21 3.570 15.84 0 034 2327
#对除了disp的变量进行排名
mtcars%>%mutate_each(funs(dense_rank,min_rank),-disp)
2、transmute
返回值中不包含原数据集变量,只保留计算转换后的变量。
mtcars%>%mutate(wt_log=log(wt))
mtcars%>%transmute(wt_log=log(wt))
mtcars %>%mutate(displ_l = disp / 61.0237)
mtcars %>%transmute(displ_l = disp / 61.0237)
title: "R数据实战4:基本数据管理"
author: "wintryheart"
date: "2019年5月17日"
output:
html_document:
toc: TRUE
算术表达式
逻辑表达式
fix(leadship)
rename( dataframe, c(oldname1="newname1", oldname2="newname2", ... ) )
is.na()检测缺失值是否存在。
日期格式
类型转换函数
myvars <- c("q1","q2","q3","q4","q5")
或者
myvars <- paste("q", 1:5, sep="")
newdatas <- leadship[myvars]
使用逻辑判断
newdatas <- leadship[1:3, ]
attach(leadship)
newdats <- leadship[gender == "M" &age>30]
detach(leadship)