R:手动绘制IRF

时间:2016-10-22 07:07:49

标签: r plot var

考虑使用以下脚本绘制脉冲响应函数:

library(vars)
Canada <- Canada * 999
var <- VAR(Canada, p = 2, type = "both")
plot(irf(var, impulse = "rw", response = "U", boot = T, cumulative = FALSE,     n.ahead = 20))
plot(irf(var, impulse = "rw", response = "U", boot = T, cumulative = TRUE,     n.ahead = 20))

我想知道如何访问绘图数据(以及95%的间隔)?

打印带有颜色填充置信带,绿色脉冲响应线和不同轴描述的绘图会很棒。具有R的内置绘图功能的解决方案优于ggplot。

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以查看irf:

返回的数据
library("vars")

# generate some dummy data
df <- data.frame(n=rnorm(100), p=rpois(100, 2))

var <- VAR(df, p = 2, type = "both")
irf <- irf(var, impulse = "n", response = "p", boot = T, 
           cumulative = FALSE, n.ahead = 20)

# inspect coefficients object
str(irf)

您可以从此处访问所需的所有数据(例如,查看irf$Lowerirf$Upper)。

自定义默认绘图的一种方法是查看运行plot(irf)时调用的函数的来源:

vars:::plot.varirf 

在这种情况下,它有点涉及但您可以复制此功能的主体并编辑代码以更改颜色,绘制填充多边形并编辑轴的标签以使其完全按照您希望的方式获得。

<强>更新

这是置信区间的起点:

# set up the base plot
plot(irf$irf$n, type="n", ylim = c(-.3, .5),
  ylab = "Your label", xlab = "Another label")
abline(h=0)

# draw the filled polygon for confidence intervals
polygon(
  c(1:length(irf$Upper$n), length(irf$Lower$n):1),
  c(irf$Upper$n, rev(irf$Lower$n)), 
  col = "grey80", border = NA)

# add coefficient estimate line
lines(irf$irf$n, col = "darkgreen")

example plot

答案 1 :(得分:0)

我有类似的问题,所以我自己建模了。我不是一个高级的R用户,所以也许有人可以把它放到一个函数左右。 此方法创建所有IRF的图,y = 0处的垂直,x轴上的脉冲名称和y轴上的响应。 IRF图也进行了尺寸调整。

“VAR_BS_9016_5VAR”是我的“varest”对象。我使用了5个变量,但这种方法可以很容易地缩短或扩展。

par(mfrow=c(5,5), oma = c(0,0,0,0) + 0.1, mar = c(5,5,0,0) + 0.1)
for (i in 1:5){
for (j in 1:5){
var_plot=irf(VAR_BS_9016_5VAR, impulse =  paste(colnames(VAR_BS_9016_5VAR$y)[i]), response=paste(colnames(VAR_BS_9016_5VAR$y)[j]), n.ahead = 20, ortho=TRUE, boot=TRUE, runs=1000, ci=0.9)
plot(x=c(1:21), y=unlist(var_plot$Lower), type="l", lwd = 3, lty=2,col="red", ylab=paste(colnames(VAR_BS_9016_5VAR$y)[j]), xlab=paste(var_plot$impulse), ylim=range(c(unlist(var_plot$Lower),unlist(var_plot$Upper))) )
lines(x=c(1:21),y=unlist(var_plot$Upper),type="l",lwd = 3, lty=2,col="red")
lines(x=c(1:21),y=unlist(var_plot$irf),type="l", lwd = 3)
abline(a = NULL, h = 0)
}
}

答案 2 :(得分:0)

这是我的解决方案,用于获取当您有多个脉冲和多个响应时可以在ggplot中使用的数据帧。

对于管道操作员,请获取库(dplyr)。由于dplyr和MASS(vars-package的依赖项)存在命名冲突(例如,对于“ select”而言),请务必小心:

getIRFPlotData <- function(impulse, response, list) {
  cbind.data.frame(Week = 0:(nrow(list[[1]][[1]])-1),
        Lower = list[[2]][names(list[[2]]) == impulse][[1]] %>% as.data.frame() %>% dplyr::select_(response) %>% pull(1),
        irf = list[[1]][names(list[[1]]) == impulse][[1]] %>% as.data.frame() %>% dplyr::select_(response) %>% pull(1),
        Upper = list[[3]][names(list[[3]]) == impulse][[1]] %>% as.data.frame() %>% dplyr::select_(response) %>% pull(1),
        Impulse = impulse,
        Response = response, stringsAsFactors = FALSE)
}

通过此方法,您可以返回一个data.frame,其列为Lower,irf,Upper,Impulse,Response。当在数据帧上使用dplyr :: bind_rows()时,可以将不同的data.frame彼此堆叠,并使用ggplot2 :: facet_wrap()和facet_grid()可以生成类似于vars输出的图表: :: plot.varirf(),但是可以灵活地添加内容并处理数据。

getIRFPlotData("Spendings", "Returns", irf4c) %>% ggplot(.) + geom_line(aes(Week, Lower), linetype="dashed") + geom_line(aes(Week, irf)) + geom_line(aes(Week, Upper),linetype="dashed") + geom_ribbon(aes(Week, ymin=Lower, ymax=Upper), alpha = 0.3) + theme_minimal()