R: Вывод IRF вручную

#r #plot #var

#r #построение #var

Вопрос:

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

 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.

Спасибо!

Ответ №1:

Вы можете просмотреть данные, возвращаемые 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. Есть идеи, как я мог бы нарисовать доверительную полосу вместо двух линий? Мне нужно заполнить комнату в пределах нижнего и верхнего доверительного интервала.

2. Добавлен пример графика

Ответ №2:

У меня была похожая проблема, поэтому я смоделировал ее сам. Я не продвинутый пользователь 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)
}
}
  

Ответ №3:

Вот мое решение для получения фрейма данных, который можно использовать в 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)
}
  

С помощью этого вы можете вернуть данные.фрейм со столбцами = Нижний, irf, верхний, Импульс, Отклик. Когда вы используете dplyr::bind_rows() для фреймов данных, вы можете накладывать разные фреймы данных друг на друга, а с помощью 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()