我正在使用vars 包来可视化脉冲响应。例子:
library(vars)
Canada <- Canada * 1000
var <- VAR(Canada, p = 2, type = "both")
plot(irf(var, impulse = "rw", response = "U", boot = T, cumulative = FALSE, n.ahead = 20))
Run Code Online (Sandbox Code Playgroud)
然而,绘图功能目前并不完全适合我的需求,我更喜欢用数据制作自己的绘图。现在,我如何可视化数据
irf(var, impulse = "rw", response = "U", boot = T, cumulative = FALSE, n.ahead = 20)
Run Code Online (Sandbox Code Playgroud)
?如果可能的话,我也更愿意绘制一条 95% 带(上下 95% 水平之间的填充区域)而不是上下线。
假设你有你的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
Run Code Online (Sandbox Code Playgroud)
这会产生具有以下设置的调用 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
.. ... ... ... ... ... ...
Run Code Online (Sandbox Code Playgroud)
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"))
Run Code Online (Sandbox Code Playgroud)
产生类似的东西:
| 归档时间: |
|
| 查看次数: |
4317 次 |
| 最近记录: |