Если у вас есть свой irf
объект в data
вы можете сначала собрать данные, необходимые в data.frame
, а затем использовать этот объект для построения в ggplot2
Этот шаг не может быть без сомнения, сделать гораздо проще и чище, но это то, что у меня есть:
library(dplyr)
library(tidyr)
variables <- data$irf %>% names
ir <- lapply(1:length(variables), function(e){
data_to_plot <- data.frame(data %>% `$`(irf) %>% `[[`(variables[e])) %>%
mutate("t" = 1:NROW(.)) %>%
gather(.,Variable, Value, -t)
upper_ci <- data.frame(data %>% `$`(Upper) %>% `[[`(variables[e])) %>%
mutate("t" = 1:NROW(.)) %>%
gather(.,Variable, Upper, -t)
lower_ci <- data.frame(data %>% `$`(Lower) %>% `[[`(variables[e])) %>%
mutate("t" = 1:NROW(.)) %>%
gather(.,Variable, Lower, -t)
res <- inner_join(data_to_plot, upper_ci, c("t","Variable")) %>%
inner_join(.,lower_ci, c("t","Variable")) %>%
mutate(impulse = paste("Shock to", variables[e]))
}) %>% rbind_all
Это дает data.frame
под названием ir
со следующей установкой:
t Variable Value Upper Lower impulse
(int) (chr) (dbl) (dbl) (dbl) (chr)
1 1 Var2 1.0000000 1.0000000 1.0000000 Shock to Var2
2 2 Var2 0.7954066 0.7995073 0.7914643 Shock to Var2
3 3 Var2 0.6089447 0.6151634 0.6028292 Shock to Var2
4 4 Var2 0.4588737 0.4649281 0.4533494 Shock to Var2
5 5 Var2 0.2273798 0.2344760 0.2220514 Shock to Var2
6 6 Var2 0.1762154 0.1831608 0.1691510 Shock to Var2
7 7 Var2 0.1349820 0.1454106 0.1278052 Shock to Var2
8 8 Var2 0.1203771 0.1310155 0.1119077 Shock to Var2
9 9 Var2 0.1150205 0.1255296 0.1050281 Shock to Var2
10 10 Var2 0.1121840 0.1263839 0.1009568 Shock to Var2
.. ... ... ... ... ... ...
Ключевым моментом является необходимость символов для коэффициентов, variable
и impulse
для построения графика в ggplot2
. Lower
и Upper
- это полосы, определяемые функцией irf
. Вы можете указать их на любой уровень CI, который, как я полагаю, я считаю.
Используя ggplot2
вы первый участок фактический импульс (называемый Value
здесь), а затем добавить пунктирные линии для двух доверительных интервалов:
ggplot(ir, aes(x = t, y = Value, colour = Variable)) +
geom_line(size = 1) +
geom_line(aes(x = t, y = Upper, colour = Variable), linetype = 2, size = 1) +
geom_line(aes(x = t, y = Lower, colour = Variable), linetype = 2, size = 1) +
scale_colour_manual(values = c("steelblue", "firebrick2", "forestgreen")) +
scale_x_continuous(limits = c(1,20), breaks = 1:20) +
facet_wrap(~impulse, ncol = 1) +
xlab("Time") +
ylab("") +
theme(legend.title = element_blank(),
legend.position = "bottom",
text = element_text(face = "bold"))
Уступая что-то вроде:
Это трудно знать, что вы хотите, когда вы не объясните, почему вы обнаружите, что базовый plot.irf не хватает (я понимаю вас полностью, хотя - я сделал свои собственные графики для функций импульсного ответа i ggplot2, но то, что я нашел la cking может не совпадать с тем, что вам не хватает) – kristang