我正在研究以下数据集中APP=1
所指示的某些事件日期附近德国债券收益率的发展。例如,2014年9月4日和2014年9月12日都发生了一个事件。
我想比较事件发生前后三天市场的反应。简而言之,我希望下面的图形再包含一行,以表示第二个事件的时间。
为了做出这样的数字,我需要操纵我的数据。这是我当前的数据集:
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轴。
在此先感谢您的帮助!
答案 0 :(得分:0)
感谢,这比原始版本容易理解。如果只有几个事件,则可以生成所需的图表:
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")
它看起来像这样:
如果您只想在x轴上将-3改为+3,只需在上面代码的末尾添加一个加号,然后使用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))