具有多重回归和面板数据的Rollregres

时间:2018-09-13 13:44:02

标签: r regression

我有一个面板数据集,如下所示:

          id  date1    Returns Mkt.RF SMB.y HML.y RMW.y CMA.y RF.y
1 LP60068503 200002  3.9487727   5.95  0.47 -9.00  3.25 -7.18 0.43
2 LP60068503 200003  4.6201232   0.66 -5.04  3.10 -2.74  4.82 0.47
3 LP60068503 200004 -1.2757605  -5.58 -4.37  5.67 -1.08  1.22 0.46
4 LP60068503 200005 -1.3916501  -0.08  0.18  6.05 -3.30  4.84 0.50
5 LP60068503 200006 -2.4193548   0.67  0.50  2.94 -3.15  1.10 0.40
6 LP60068503 200007  0.8264463  -1.58 -0.71  3.25 -0.19 -0.10 0.48

               id  date1    Returns Mkt.RF SMB.y HML.y RMW.y CMA.y RF.y
340373 LP65117791 201207  3.4376360   0.56 -1.38 -2.57  2.29 -2.04 0.00
340374 LP65117791 201208  0.7893412   4.51  0.06  3.38 -1.68  1.45 0.01
340375 LP65117791 201209  0.2556494   3.49  1.65  2.33 -1.52  0.69 0.01
340376 LP65117791 201210 -1.0310320   1.67 -0.61  2.06 -0.93 -0.15 0.01
340377 LP65117791 201211  0.3411351   2.28 -2.40 -0.55  0.62 -0.80 0.01
340378 LP65117791 201212  0.7903986   3.38  2.48  3.09 -0.53  0.89 0.01

我想用三个独立变量计算以下滚动回归,并在新列中获得alpha(a)截距。

返回〜a +ß1* Mkt.RF +ß3* SMB.y +ß3* HML.y + e

宽度窗口应为36个月。

使用rollRegres函数可使用一个自变量,但是我想知道如何将该程序包调整为三个自变量。在具有一个因变量的新列中获取alpha拦截的代码如下:

返回〜a +ß1* Mkt.RF + e

dt[, alpha:=
   roll_regres.fit(x = cbind(1, .SD[["Mkt.RF"]]), y = .SD[["return"]],
                   width = 36L)$coefs[, 1],
   by = id]

所以我想知道如何将其调整为三个或更多独立变量。

2 个答案:

答案 0 :(得分:1)

似乎您正在使用data.table,所以我也会。您可以按照以下步骤实现所需的目标

#####
# simulate data 
n_gr   <- 100 
n_date <- 50
n <- n_gr * n_date
id <- gl(n_gr, n_date)
date. <- rep(1:n_date, n_gr)

set.seed(39820955)
X <- matrix(rnorm(n * 3), n, 
            dimnames = list(NULL, c("Mkt.RF", "SMB.y", "HML.y")))
library(data.table)  
dt <- data.table(id = id, date1 = date., Returns = rowSums(X) + rnorm(n), X)

#####
# estimate coefficients
setkey(dt, id, date1) # sort data

library(rollRegres)
func <- function(SD){
  x <- roll_regres.fit(
    x = cbind(1, SD$Mkt.RF, SD$SMB.y, SD$HML.y), y = SD$Returns, 
    width = 36L)$coefs
  split(x, rep(1:ncol(x), each = nrow(x))) # turn matrix into list of column vectors
}
dt[, c("alpha", "b.Mkt", "b.SMB", "b.HML") := func(.SD), by = id]

tail(dt)
#R     id date1  Returns  Mkt.RF  SMB.y  HML.y  alpha b.Mkt b.SMB b.HML
#R 1: 100    45  1.08926  1.0470  0.277 -0.179 -0.355 0.854  1.25  1.09
#R 2: 100    46 -0.09738 -0.0718 -0.190  0.860 -0.318 0.813  1.26  1.06
#R 3: 100    47  0.00525  1.3981  1.618 -1.335 -0.349 0.742  1.18  1.09
#R 4: 100    48  0.65891 -0.3901 -0.239  1.558 -0.266 0.732  1.02  1.11
#R 5: 100    49 -0.18841 -0.4336  0.266  0.657 -0.265 0.761  1.06  1.14
#R 6: 100    50 -1.55515 -0.6723 -1.567  1.014 -0.275 0.769  1.08  1.14

alphab.Mktb.SMBb.HML是斜率和截距。

  

使用rollRegres函数可使用一个自变量,但是我想知道如何将该程序包调整为三个自变量。

这不是事实。该功能适用​​于多元回归。撰写本文时,小插图和手册页中仅有的示例具有多重回归功能...例如,参见help("roll_regres")vignette("Comparisons", package = "rollRegres")

答案 1 :(得分:0)

要在列中另外获得R²,可以使用以下代码:

func <- function(SD){
+                     x <- roll_regres.fit(
+                      x = cbind(1, SD$Mkt.RF, SD$SMB.y, SD$HML.y), y = SD$Returns, 
+         width = 36L, do_compute = c("sigmas", "r.squareds", "1_step_forecasts"))$r.squareds}
>  dt[, c("R2") := func(.SD), by = id]

我想知道是否也可以调整R²?