我正在使用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 次 |
最近记录: |