事件 ID - PRE 和 POST 窗口 - 在 R

问题描述

我正在使用市场模型进行事件研究。每个 ISIN 有几个事件。如果“rating_Change”为“非零”,则有一个事件。我需要的是每个 ISIN 的每个事件以及事件数据的前窗口和后窗口的“ID”。 理想情况下,每个事件都有一个 ID 来标识事件前和事件后窗口,该窗口应该是 -2:+2(在示例中,在“真实”中,它应该是 -5:+5)。

目前我尝试了这个......:

testing1 <- testing %>% 
  group_by(ISIN) %>%
  mutate(event=cumsum(rating_Change!=0 & !is.na(rating_Change)))

...并收到以下输出

   Date         ISIN    R        STOXX_Return   rating_Change   rating      event
   <date>       <fct>          <dbl>        <dbl>     <dbl>       <fct>      <int>
 3 2016-10-01   CH00  0.0175    -0.000375             0         A              0
 4 2016-11-01   CH00 -0.0734    -0.0221               0         A              0
 5 2016-12-01   CH00 -0.0107     0.0183               0         A              0
 6 2017-01-01   CH00  0.0457     0.0642               1.9       A              1
 7 2017-02-01   CH00  0.0208     0.000647             0         A              1
 8 2017-03-01   CH00  0.0352     0.0364               0         A              1
...
15 2017-11-01  CH00  -0.0780496  0.0179349            0         A              1
16 2017-12-01  CH00   0.0688210 -0.0312227            0         A              1
17 2018-01-01  CH00  -0.0064685  0.0144049           -0.90      A              2
18 2018-02-01  CH00  -0.0997418  0.0119439            0         A              2
19 2018-03-01  CH00  -0.0203781 -0.0463974            0         A              2
...
45 2017-02-01  GB00   0.0056672  0.0006471            0         B+             1
46 2017-03-01  GB00   0.0028146  0.0364348            0         B+             1
47 2017-04-01  GB00   0.0366418  0.0144673            3.66      B+             2
48 2017-05-01  GB00   0.0745412  0.0242931            0         B+             2
49 2017-06-01  GB00   0.1555046  0.0222243            0         B+             2
...

我也用以下方法试过了:

filter_lmco_<- within(testing,{
  event <- if_else(rating_Change!=0,1,0)
  event <- ave(event,lag(ISIN),FUN=cumsum)
  event <- ifelse(rating_Change != 0,event-1,event)
})

这有一个类似的输出,但是,它只需要前窗口而不是窗口“围绕”事件 - 至少我不知道如何制定语法来让窗口围绕(-2:+ 2) 事件。

在这里,我向您展示我真正需要的东西:

   Date         ISIN    R        STOXX_Return   rating_Change   rating       event
   <date>       <fct>          <dbl>        <dbl>     <dbl>       <fct>      <int>
 3 2016-10-01   CH00  0.0175    -0.000375             0         A              0
 4 2016-11-01   CH00 -0.0734    -0.0221               0         A              1
 5 2016-12-01   CH00 -0.0107     0.0183               0         A              1
 6 2017-01-01   CH00  0.0457     0.0642               1.9       A              1
 7 2017-02-01   CH00  0.0208     0.000647             0         A              1
 8 2017-03-01   CH00  0.0352     0.0364               0         A              1
...
15 2017-11-01  CH00  -0.0780496  0.0179349            0         A              2
16 2017-12-01  CH00   0.0688210 -0.0312227            0         A              2
17 2018-01-01  CH00  -0.0064685  0.0144049           -0.90      A              2
18 2018-02-01  CH00  -0.0997418  0.0119439            0         A              2
19 2018-03-01  CH00  -0.0203781 -0.0463974            0         A              2
...
45 2017-02-01  GB00   0.0056672  0.0006471            0         B+             1
46 2017-03-01  GB00   0.0028146  0.0364348            0         B+             1
47 2017-04-01  GB00   0.0366418  0.0144673            3.66      B+             1
48 2017-05-01  GB00   0.0745412  0.0242931            0         B+             1
49 2017-06-01  GB00   0.1555046  0.0222243            0         B+             1
...

有没有人有解决这个问题的想法或方法?总而言之,我有大约 1600 个事件(加上窗口前和窗口后数据)。非常感谢任何帮助和支持!! 非常感谢你。如果我要澄清任何事情或提供更多细节,请告诉我。

解决方法

我认为这应该可以解决问题

testing1 <- testing %>% 
  group_by(ISIN) %>%
  mutate(event=cumsum(lead(Rating_Change,2)!=0 & !is.na(lead(Rating_Change,2))))

在这种情况下它适用于一些虚拟数据

tibble::tibble(
  Rating_Change = c(0,1,2,4)) %>% 
  dplyr::mutate(event=cumsum(dplyr::lead(Rating_Change,2)!=0 & !is.na(dplyr::lead(Rating_Change,2))))