Подмножество набора данных в новые переменные на основе дат событий - PullRequest
0 голосов
/ 23 июня 2018

Я смотрю на динамику доходности немецких облигаций к определенным датам событий, обозначенным APP=1 в наборе данных ниже. Например, 4 сентября 2014 года и 12 сентября 2014 года происходит событие.

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

Чтобы сделать такую ​​фигуру, мне нужно манипулировать своими данными. Вот мой текущий набор данных:

df <- Date   APP  DE10 
  2014-09-22 0    1.010 
  2014-09-19 0    1.043
  2014-09-18 0    1.081
  2014-09-17 0    1.050
  2014-09-16 0    1.061
  2014-09-15 0    1.067
  2014-09-12 1    1.082
  2014-09-11 0    1.041
  2014-09-10 0    1.047
  2014-09-09 0    0.996
  2014-09-08 0    0.953
  2014-09-05 0    0.928
  2014-09-04 1    0.970
  2014-09-03 0    0.955
  2014-09-02 0    0.931
  2014-09-01 0    0.882

Я хочу, чтобы мой набор данных выглядел так:

 APP      Indicator  DE10_Event1 DE10_Event2
 0        1          1.050      0.996
 0        2          1.061      0.996
 0        3          1.067      0.996
 1        4          1.082      0.970
 0        5          1.041      0.955
 0        6          1.047      0.931
 0        7          0.996      0.882

Таким образом, у меня будет возможность построить линии на одной фигуре, поскольку теперь они имеют одинаковую ось Y и X.

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 24 июня 2018

Спасибо, это гораздо проще понять, чем оригинал. Если у вас есть только несколько событий, это сработает для создания нужного вам графика:

library(tidyverse)
library(lubridate)

Я читаю ваши данные как фрейм данных dd. Сначала преобразовали Date в тип Date, а затем определили даты события:

> dd$Date <- as.Date(dd$Date)
> events <- dd %>% filter(APP==1) %>% select(Date)
> events$Date
[1] "2014-09-12" "2014-09-04"

Далее используйте эти даты, чтобы создать один новый столбец разниц в датах для каждого события:

diffs <- dd %>% 
    mutate(Event1_DE10=-interval(ymd(dd$Date),ymd(events$Date[1])) %/% days(1)) %>% 
    mutate(Event2_DE10=-interval(ymd(dd$Date),ymd(events$Date[2])) %/% days(1))

Это даст вам:

> diffs
# A tibble: 16 x 5
   Date         APP  DE10 Event1_DE10 Event2_DE10
   <date>     <int> <dbl>       <dbl>       <dbl>
 1 2014-09-22     0 1.01          10.         18.
 2 2014-09-19     0 1.04           7.         15.
 3 2014-09-18     0 1.08           6.         14.
 4 2014-09-17     0 1.05           5.         13.
 5 2014-09-16     0 1.06           4.         12.
 6 2014-09-15     0 1.07           3.         11.
 7 2014-09-12     1 1.08           0.          8.
 8 2014-09-11     0 1.04          -1.          7.
 9 2014-09-10     0 1.05          -2.          6.
10 2014-09-09     0 0.996         -3.          5.
11 2014-09-08     0 0.953         -4.          4.
12 2014-09-05     0 0.928         -7.          1.
13 2014-09-04     1 0.970         -8.          0.
14 2014-09-03     0 0.955         -9.         -1.
15 2014-09-02     0 0.931        -10.         -2.
16 2014-09-01     0 0.882        -11.         -3.

Вы можете наложить линии, по одной для каждого события, а затем вертикальную линию в конце:

diffs %>% ggplot() + 
    geom_line(aes(x=Event1_DE10,y=DE10), color="blue") +
    geom_line(aes(x=Event2_DE10,y=DE10), color="red") + 
    geom_vline(xintercept=0, linetype="dashed")

Это выглядит так:

enter image description here

Если вы хотите, чтобы от -3 до +3 по оси x, просто добавьте знак плюс в конец кода выше и scale_x_continuous(limits=c(-3,3)), чтобы разделить график в этих пределах x.

Если у вас больше нескольких дат, вам может потребоваться настроить часть mutate так, чтобы она давала новый столбец для всех дат событий в events$Date.

Чтобы увеличить масштаб графика, но не обрезать данные за пределами границ оси, используйте coord_cartesian:

diffs %>% ggplot() + 
    geom_line(aes(x=Event1_DE10,y=DE10), color="blue") +
    geom_line(aes(x=Event2_DE10,y=DE10), color="red") + 
    geom_vline(xintercept=0, linetype="dashed") +
    labs(x="Days from Event") + 
    coord_cartesian(xlim=c(-3,3))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...