事件 ID - PRE 和 POST Window - 在 R 中

Event ID - PRE and POST Window - in R

我正在使用市场模型进行事件研究。每个 ISIN 有多个事件。如果“Rating_Change”为“非零”,则有一个事件。我需要的是每个 ISIN 的每个事件的“ID”,以及事件数据的前 window 和 post window。 每个事件都有一个 ID 来标识前事件和 post 事件 windows 应该是 -2:+2 是理想的(在这个例子中,在“真实”中它应该是 -5 :+5).

目前我试过这个......:[=​​16=]

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

这有一个类似的输出,但是,它只需要前 windows 而不是 window “围绕”事件 - 至少我不知道如何制定语法让 windows 围绕 (-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 个事件(加上前和 post window 数据)。非常感谢任何帮助和支持!! 非常感谢你提前。如果我要澄清任何事情或提供更多细节,请告诉我。

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

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,0,0,1,0,0,0,2,0,0,0,4)) %>% 
  dplyr::mutate(event=cumsum(dplyr::lead(Rating_Change, 2)!=0 & !is.na(dplyr::lead(Rating_Change, 2))))