#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()