考虑使用以下脚本绘制脉冲响应函数:
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。
谢谢!
答案 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$Lower
和irf$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")
答案 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()