Добавить доверительный интервал к графику R IRF

#r #plot #polygon

#r #график #полигон

Вопрос:

Я использую следующий пример кода для построения функции импульсной характеристики:

 # Load data and apply VAR
library("vars")
data(Canada)
data <- Canada
data <- data.frame(data[,1:2])
names(data)
var <- VAR(data, p=2, type = "both")

# Apply IRf
irf <- irf(var, impulse = "e", response = "prod", boot = T, cumulative = FALSE, n.ahead = 20)
str(irf)
plot(irf)

# Response
irf$irf
# Lower amp; Higher
irf$Lower
irf$Upper

#Create DataFrame and Plot
irf_df <- data.frame(irf$irf,irf$Lower,irf$Upper)
irf_df$T<-seq.int(nrow(irf_df)) #T
irf_df
plot(data.frame(irf_df$T, irf_df[1]), type="l", main="Impulse Response")
abline(h=0, col="blue", lty=2)
  

Похоже, что пока это работает, хотя я чувствую, что код можно было бы улучшить.

Можно ли добавить доверительную полосу для нижней и верхней границ доверительного интервала?

Ответ №1:

Если вы хотите отобразить полосы Lower и Upper , вы можете использовать lines() функцию, при желании установив y-границы графика.

 plot(irf_df$T, irf_df$prod, type="l", main="Impulse Response",
    ylim = c(min(irf_df$prod.1), max(irf_df$prod.2)) * 1.1)
abline(h=0, col="blue", lty=2)
lines(irf_df$T, irf_df$prod.1, lty = 2)
lines(irf_df$T, irf_df$prod.2, lty = 2)
  

Для более причудливого графика с заполненной доверительной полосой используйте polygon . Здесь мы настраиваем пустой график, затем строим полигон и, наконец, накладываем линию. Также обратите внимание, что здесь нет необходимости настраивать новый data.frame: мы можем просто использовать значения из irf() выходных данных:

 plot(irf$irf$e, type = "n", main = "Impulse Response",
    ylim = c(min(irf$Lower$e), max(irf$Upper$e)))
polygon(x = c(seq_along(irf$irf$e), rev(seq_along(irf$irf$e))),
        y = c(irf$Lower$e, rev(irf$Upper$e)),
        lty = 0, col = "#fff7ec")
lines(irf$irf$e)
  

Вывод:
введите описание изображения здесь

Комментарии:

1. Этот вариант уже хорош, но мне нравится заполнять пространство между двумя линиями — скажем, светло-светло-красным — а не только отображать линии.

2. Идеально, именно то, что я искал 🙂