使用plot()函数能否在同一窗口展示VAR模型的多个IRF脉冲响应函数
问题原因
vars包自带的irf对象的plot()方法底层基于grid绘图体系实现,和base R绘图的par参数体系不兼容,因此你设置par(mfrow)不会生效。
解决方案1:提取IRF数据用base R绘图(可兼容par(mfrow))
你可以直接从irf对象中提取脉冲响应估计值、置信区间上下限数据,用base R原生的plot()函数绘图,此时par参数可以正常生效,示例代码如下:
library(vars) # 替换为你自己拟合的VAR模型Var1 data(Canada) Var1 <- VAR(Canada, p = 2, type = "const") # 生成你需要的多个IRF对象,示例为3个不同响应变量的IRF irf1 <- irf(Var1, n.ahead = 10, ortho = TRUE, response = "e") irf2 <- irf(Var1, n.ahead = 10, ortho = TRUE, response = "prod") irf3 <- irf(Var1, n.ahead = 10, ortho = TRUE, response = "rw") irf_list <- list(irf1, irf2, irf3) # 设置画布布局,可自行调整行数、列数 par(mfrow = c(3,1), mar = c(4,4,2,1)) # 循环绘制每个IRF for (i in seq_along(irf_list)) { irf_obj <- irf_list[[i]] # 提取对应冲击的IRF数据,此处以第一个冲击为例,可根据需求调整索引 irf_val <- irf_obj$irf[[1]][,1] lower <- irf_obj$Lower[[1]][,1] upper <- irf_obj$Upper[[1]][,1] n_ahead <- length(irf_val) # 绘制脉冲响应曲线 plot(0:(n_ahead-1), irf_val, type = "l", lwd = 2, col = "blue", xlab = "年份", ylab = "增长率", main = paste0("响应变量:", irf_obj$response)) # 绘制95%置信区间 lines(0:(n_ahead-1), lower, lty = 2, col = "red") lines(0:(n_ahead-1), upper, lty = 2, col = "red") # 添加0参考线 abline(h = 0, lty = 3, col = "gray") }
解决方案2:用grid排列工具直接拼接原生IRF图
如果你不想自行编写绘图逻辑,也可以将plot.irf生成的grid对象转为可拼接的grob对象,再统一排版:
library(vars) library(gridExtra) library(ggplotify) # 生成多个IRF对象 irf1 <- irf(Var1, n.ahead = 10, ortho = TRUE, response = "e") irf2 <- irf(Var1, n.ahead = 10, ortho = TRUE, response = "prod") irf3 <- irf(Var1, n.ahead = 10, ortho = TRUE, response = "rw") # 将每个IRF图转为grob对象 g1 <- as.grob(~plot(irf1, main = "", xlab = "年份", ylab = "增长率")) g2 <- as.grob(~plot(irf2, main = "", xlab = "年份", ylab = "增长率")) g3 <- as.grob(~plot(irf3, main = "", xlab = "年份", ylab = "增长率")) # 按3行1列布局排列 grid.arrange(g1, g2, g3, nrow = 3)
内容的提问来源于stack exchange,提问作者Joe94
相关产品推荐
相关产品推荐

