【问题标题】:Rollregres with multiple regression and panel data具有多元回归和面板数据的 Rollregres
【发布时间】:2019-02-18 06:30:03
【问题描述】:

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

          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 函数可以处理一个自变量,但我想知道如何将此包调整为三个自变量。在具有 one 因变量的新列中获取 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]

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

【问题讨论】:

    标签: r regression


    【解决方案1】:

    要额外获取列中的 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²?

    【讨论】:

    【解决方案2】:

    看来您正在使用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")

    【讨论】:

    • 谢谢!有没有办法也显示 R²?
    • roll_regres.fit 使用do_compute 参数并对func 和对[.data.table 的调用进行细微更改。
    • 如果我收到以下错误消息,您能告诉我该怎么做:“宽度”上的断言失败:所有元素必须为
    • 来自this line。您的行数是否少于width
    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 2012-08-24
    • 2020-12-15
    • 2017-03-12
    • 1970-01-01
    • 2021-08-05
    • 2021-11-18
    • 2018-04-08
    相关资源
    最近更新 更多