#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. Идеально, именно то, что я искал 🙂