2016-10-22 178 views
0

考慮下面的腳本繪製的脈衝響應函數:R:繪製IRF手動

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。

謝謝!

回答

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

+0

任何想法如何畫一條信心帶而不是兩條線?我需要在較低和較高的置信區間內填滿房間。 – RPacker

+0

添加了一個示例圖 – blmoore

0

我也有類似的問題,所以我模仿它自己。我不是一個高級的R用戶,所以也許有人可以把它放到一個函數中。 此方法創建一個所有IRF的圖,其中y = 0處的垂直位置,x軸上的脈衝名稱和y軸上的響應。 IRF圖也是尺寸調整的。

「VAR_BS_9016_5VAR」是我的「最近」的對象。我使用了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) 
} 
}