金融大数据分析——VAR的脉冲响应图的整齐排列

R语言有很强大的绘图和构建计量模型的功能,比一些软件如Eviews或者SPSS等更加的灵活,但实际应用中出现的一些问题出现也会跟我们带来很多困扰,需要我们不断地尝试加以解决。

近日在创作一篇论文,主要是利用SVAR模型来刻画变量之间的相互影响关系。本人比较喜欢用R语言分析,但在进行脉冲响应分析的时候遇到了一个问题:如何利用R将脉冲响应图整齐地排列起来?起初,我也认为这是一件很简单的事情,但是真正操作的时候,才发现困难重重,足足花了两天的时间才解决这个问题,所以想在这里和大家一起分享一下!

在进行VAR或者SVAR模型时,我们需要加载R语言中很经典的包‘vars’(在老版本中可能是‘VAR’)。数据的读取和模型的设定我就不再赘述,因为这会因不同的问题有很大的不同,我们这里重点讲解一下R语言如何画出脉冲响应图,并将所有脉冲响应图进行整齐地排列和保存。

首先我们需要创建一个VAR的数据类型,‘z<-VAR(SVAR,p=1)’SVAR是我们要研究的经济变量构成的矩阵,本实验包含'A','B','C','D','E'这5个变量。我们这里先构建SVAR模型p=SVAR(z, estmethod = 'scoring', Amat =NULL, Bmat =bmat,start = NULL, max.iter = 100)

P就是一个SVAR模型的结果。然后我们使用命令svec.irf <- irf(p,response = A, n.ahead = 48, boot = TRUE)时,我们可以得到A对于其余5个变量的的脉冲响应图。这个时候问题就来了:这种脉冲响应图只能按enter键一张图一张图地看,不能够一次性的观看所有的图。这很让人抓狂!而且我们将这些图保存起来的时候,也会有很大的麻烦。比如保存成PDF时,会有5页的PDF;保存成PNG或JPEG格式的时候,也得不断点击才能看下一张图,我们无法把所有的的图归并到一张图中,因此我们无法做出我们想要能够粘贴到论文中的结果图!


就像上图所示,每次只能够粘贴一个图,得按ENTER键才能看下一张!而我们希望展示的是1*5的图片,到最后为了展示各个变量的脉冲响应应该展示5*5的图片!当然我也尝试过简单的par(mfrow=c(5,5))这样的方法,然而并没有什么用!(感兴趣的小伙伴们可以试试),因为这是一个plot,不是多个plot。本人经过苦苦思索,终于探索出一套有效的解决办法!那就是模拟地画出脉冲响应图,我们需要对R语言的画图命令和图片效果有深刻地理解,话不多说,我们先附上代码:

#创建1*5的画布窗口,并得出第一个变量的脉冲响应图

par(mfrow=c(1,5))
for(i in 1:1)
{
p=SVAR(z, estmethod = 'scoring',  Amat =NULL, Bmat =bmat,start = NULL, max.iter = 100)
svec.irf <- irf(p,response=name[i], n.ahead = 48, boot = TRUE)
##利用循环语句,得出每一个脉冲响应的图,整齐地排列到画布上
for(j in 1:5)
{
p=as.vector(svec.irf$irf[[j]])
q=as.vector(svec.irf$Upper[[j]])
k=as.vector(svec.irf$Lower[[j]])
low=min(k)-0.1
high=max(q)+0.1
plot(p,type='l',main=paste(paste(svec.irf$response,'from'),svec.irf$impulse[j]),ylim=c(low,high))
lines(q,type='l',lty=2,col='red')
lines(k,type='l',lty=2,col='red')
abline(h=0,col='red')
}
}

R语言有非常强大的画图功能,同时其画图命令的繁琐有时让我们望而却步。不过我已经帮大家设定好了参数,大家可以直接运行代码就好!这个代码运行出来的图如下:

就像上图所示,每次只能够粘贴一个图,得按ENTER键才能看下一张!而我们希望展示的是1*5的图片,到最后为了展示各个变量的脉冲响应应该展示5*5的图片!当然我也尝试过简单的par(mfrow=c(5,5))这样的方法,然而并没有什么用!(感兴趣的小伙伴们可以试试),因为这是一个plot,不是多个plot。本人经过苦苦思索,终于探索出一套有效的解决办法!那就是模拟地画出脉冲响应图,我们需要对R语言的画图命令和图片效果有深刻地理解,话不多说,我们先附上代码:

#创建1*5的画布窗口,并得出第一个变量的脉冲响应图

par(mfrow=c(1,5))
for(i in 1:1)
{
p=SVAR(z, estmethod = 'scoring',  Amat =NULL, Bmat =bmat,start = NULL, max.iter = 100)
svec.irf <- irf(p,response=name[i], n.ahead = 48, boot = TRUE)
##利用循环语句,得出每一个脉冲响应的图,整齐地排列到画布上
for(j in 1:5)
{
p=as.vector(svec.irf$irf[[j]])
q=as.vector(svec.irf$Upper[[j]])
k=as.vector(svec.irf$Lower[[j]])
low=min(k)-0.1
high=max(q)+0.1
plot(p,type='l',main=paste(paste(svec.irf$response,'from'),svec.irf$impulse[j]),ylim=c(low,high))
lines(q,type='l',lty=2,col='red')
lines(k,type='l',lty=2,col='red')
abline(h=0,col='red')
}
}

R语言有非常强大的画图功能,同时其画图命令的繁琐有时让我们望而却步。不过我已经帮大家设定好了参数,大家可以直接运行代码就好!这个代码运行出来的图如下:



就像上图所示,每次只能够粘贴一个图,得按ENTER键才能看下一张!而我们希望展示的是1*5的图片,到最后为了展示各个变量的脉冲响应应该展示5*5的图片!当然我也尝试过简单的par(mfrow=c(5,5))这样的方法,然而并没有什么用!(感兴趣的小伙伴们可以试试),因为这是一个plot,不是多个plot。本人经过苦苦思索,终于探索出一套有效的解决办法!那就是模拟地画出脉冲响应图,我们需要对R语言的画图命令和图片效果有深刻地理解,话不多说,我们先附上代码:

#创建1*5的画布窗口,并得出第一个变量的脉冲响应图

par(mfrow=c(1,5))
for(i in 1:1)
{
p=SVAR(z, estmethod = 'scoring',  Amat =NULL, Bmat =bmat,start = NULL, max.iter = 100)
svec.irf <- irf(p,response=name[i], n.ahead = 48, boot = TRUE)
##利用循环语句,得出每一个脉冲响应的图,整齐地排列到画布上
for(j in 1:5)
{
p=as.vector(svec.irf$irf[[j]])
q=as.vector(svec.irf$Upper[[j]])
k=as.vector(svec.irf$Lower[[j]])
low=min(k)-0.1
high=max(q)+0.1
plot(p,type='l',main=paste(paste(svec.irf$response,'from'),svec.irf$impulse[j]),ylim=c(low,high))
lines(q,type='l',lty=2,col='red')
lines(k,type='l',lty=2,col='red')
abline(h=0,col='red')
}
}

R语言有非常强大的画图功能,同时其画图命令的繁琐有时让我们望而却步。不过我已经帮大家设定好了参数,大家可以直接运行代码就好!这个代码运行出来的图如下:

这样我们就很完美的得到了关于A的脉冲响应的5张图的整齐排列!!!本人做出来的时候非常地激动!那么如何得到所有变量5*5的图呢?聪明的读者已经想到,我们只需要修改上述代码的两个参数即可



par(mfrow=c(5,5))
for(i in 1:5)
{
p=SVAR(z, estmethod = 'scoring',  Amat =NULL, Bmat =bmat,start = NULL, max.iter = 100)
svec.irf <- irf(p,response=name[i], n.ahead = 48, boot = TRUE)
##利用循环语句,得出每一个脉冲响应的图,整齐地排列到画布上
for(j in 1:5)
{
p=as.vector(svec.irf$irf[[j]])
q=as.vector(svec.irf$Upper[[j]])
k=as.vector(svec.irf$Lower[[j]])
low=min(k)-0.1
high=max(q)+0.1
plot(p,type='l',main=paste(paste(svec.irf$response,'from'),svec.irf$impulse[j]),ylim=c(low,high))
lines(q,type='l',lty=2,col='red')
lines(k,type='l',lty=2,col='red')
abline(h=0,col='red')
}
}



猜你喜欢

转载自blog.csdn.net/wujiandao1995424/article/details/80214440