2016-03-10 3 views
3

Я использую vars package для визуализации импульсных откликов. Пример:Функция импульсного отклика (новый)

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

Однако функция участка в настоящее время не идеально подходит для моих потребностей, и я предпочитаю, чтобы сделать свой собственный сюжет с данными. Теперь, как я могу визуализировать данные в

irf(var, impulse = "rw", response = "U", boot = T, cumulative = FALSE,  n.ahead = 20) 

? Если возможно, я также предпочел бы нарисовать 95% -ную полосу (заполненную область между верхним и нижним уровнями 95%), а не верхнюю и нижнюю.

+0

Это трудно знать, что вы хотите, когда вы не объясните, почему вы обнаружите, что базовый plot.irf не хватает (я понимаю вас полностью, хотя - я сделал свои собственные графики для функций импульсного ответа i ggplot2, но то, что я нашел la cking может не совпадать с тем, что вам не хватает) – kristang

ответ

1

Если у вас есть свой 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")) 

Уступая что-то вроде:

Impulse Response Function

+1

Почему-то доверительные интервалы не имеют никакого смысла? – Johnny

+0

Трудно сказать, что не так. Является ли это ошибкой в ​​построении CI, или вы имеете в виду, что данные CI неверны? – kristang

+0

Лучше всего визуализировать только одну переменную, а затем полосы CI (скорее, как файловую область, а не две строки). На текущих графиках пунктирные линии почти невидимы. Но я получаю представление о том, как это можно сделать без ggplot. – Johnny

Смежные вопросы