lm 函数/系数,用于一个数据帧 R 中的特定不同时间窗口/事件

问题描述

我正在使用市场模型进行事件研究:AR(i,t)=R(i,t) - ((alpha(i) + beta(i)*R(m,t))。我很挣扎由于数据格式和过滤,计算 alpha(intercept) 和 beta(slope) 估计量。这就是我的数据目前的样子:

    Date       ISIN             R  STOXX_Return     rating_Change     rating    
 9  2016-10-01 CH00  0.0175315633 -0.0003749766              0.00          A
10  2016-11-01 CH00 -0.0733760706 -0.0220566972              0.00          A
11  2016-12-01 CH00 -0.0107454123  0.0182991778              0.00          A
12  2017-01-01 CH00  0.0457420548  0.0641541456              1.90          A
...
21  2017-10-01 CH00  0.0250723834  0.0374169332              0.00          A
22  2017-11-01 CH00 -0.0780495570  0.0179348620              0.00          A
23  2017-12-01 CH00  0.0688209502 -0.0312226700              0.00          A
24  2018-01-01 CH00 -0.0064684781  0.0144049186             -0.90          A
..
74  2017-01-01 GB00  0.0409336446  0.0641541456              0.00         B+
75  2017-02-01 GB00  0.0056671717  0.0006470779              0.00         B+
76  2017-03-01 GB00  0.0028145957  0.0364348490              0.00         B+
77  2017-04-01 GB00  0.0366417787  0.0144673074              3.66         B+
...

如果评级变化不为零,则存在“事件”(第 12、24、77 行)。

我需要的是使用 lm() 函数对事件前窗口进行回归(例如 9:11、21:23、74:77 行 - 即事件前 -3:1) .

但是,每个 ISIN 有多个事件

  • 意味着我必须按 ISIN 和事件(非零评级变化)和
  • 然后对每个事件前窗口和每个 ISIN 使用 lm() (R ~ STOXX_Return) 进行回归和
  • 将值保存在事件和事件前窗口旁边的列中。

我没有设法在有条件的 for 循环或 magrittr/dplyr(或任何 google-able :-) )中做到这一点。没有真正解决 - 我只是不知道如何管理 ISIN 和事件的“双过滤器”,以及以下回归和系数的输出。 有没有人解决这个问题的方法

非常感谢您的任何支持 - 非常感谢!

回复后补充

我尝试了以下方法

PRE-WINDOW
filter_lmco_pre_tmp1 <- within(data,{
  event_pre_window <- if_else(lag(rating_Change!=0),1,0)
  event_pre_window <- ave(event_pre_window,lag(ISIN),FUN=cumsum)
})
    Date       ISIN          R STOXX_Return     rating_Change     rating event_pre_window
10  2016-11-01 CH00 -0.0733761   -0.0220567              0.00          A               NA
11  2016-12-01 CH00 -0.0107454    0.0182992              0.00          A                0
12  2017-01-01 CH00  0.0457421    0.0641541              1.90          A                0
13  2017-02-01 CH00  0.0208479    0.0006471              0.00          A                1
14  2017-03-01 CH00  0.0351640    0.0364348              0.00          A                1
22  2017-11-01 CH00 -0.0780496    0.0179349              0.00          A                1
23  2017-12-01 CH00  0.0688210   -0.0312227              0.00          A                1
24  2018-01-01 CH00 -0.0064685    0.0144049             -0.90          A                1

POST-WINDOW
filter_lmco_post_tmp1 <- within(data,{
  event_post_window <- if_else(rating_Change !=0,0)
  event_post_window <- ave(event_post_window,ISIN,FUN=cumsum)
})
    Date       ISIN          R   STOXX_Return     rating_Change     rating event_post_window
10  2016-11-01 CH00 -0.0733761   -0.0220567              0.00          A                 0
11  2016-12-01 CH00 -0.0107454    0.0182992              0.00          A                 0
12  2017-01-01 CH00  0.0457421    0.0641541              1.90          A                 1
13  2017-02-01 CH00  0.0208479    0.0006471              0.00          A                 1
14  2017-03-01 CH00  0.0351640    0.0364348              0.00          A                 1
22  2017-11-01 CH00 -0.0780496    0.0179349              0.00          A                 1
23  2017-12-01 CH00  0.0688210   -0.0312227              0.00          A                 1
24  2018-01-01 CH00 -0.0064685    0.0144049             -0.90          A                 2
25  2018-02-01 CH00 -0.0997418    0.0119439              0.00          A                 2

您可以看到,如果有事件(第 12 行或第 24 行),则事件前后 ID 是不同的。 pre window 的第一个 event-id 以 0 开头,post window 的第一个 event-id 以 1 开头。这是因为我落后于 pre-events。但是,如果我不滞后,那么实际事件不包括在预事件中。那么有没有办法同时为前后窗口获取一个“ID”,以便之后的匹配成为可能?

解决方法

考虑使用 ifelseaveby 为预窗口分配列。然后调用 split(或 tail)为每个 ISIN 和事件预窗口创建数据帧列表。最后,使用 # CREATE EVENT PRE-WINDOW COLUMN my_df <- within(my_df,{ event_pre_window <- ifelse(Rating_change != 0,1,0) event_pre_window <- ave(event_pre_window,ISIN,FUN=cumsum) event_pre_window <- ifelse(Rating_Change != 0,event_pre_window-1,event_pre_window) }) # DEFINE FUNCTION TO PROCESS SINGLE DATAFRAME my_lm_model <- function(df) { # ... code to run lm and return results on each pre-window } # SPLIT DF BY ISIN AND PRE-WINDOWS # CALL ABOVE FUNCTION ON EACH TAILED SUBSET pre_windows_lm_results_list <- by( my_df,my_df[c("ISIN","event_pre_window")],function(sub) my_lm_model(tail(sub,3)) ) 检索最后 3 行并传递给您的建模函数。全部在基础 R 中处理!

[]