【问题标题】:Rolling regression with expanding window带有扩展窗口的滚动回归
【发布时间】:2020-03-02 22:33:23
【问题描述】:

我是 R 新手,我正在尝试使用扩展窗口运行滚动回归(即对于每个日期 t 使用最多 t 的数据),数据框中有两个自变量,按分类列分组。

例如,在下面的数据框中,我想提取按类别 K 分组的 lm(return ~ regress1 + regress 2) 的系数,使用所有行直到感兴趣的行。因此,对于第 2 行,回归数据集将是 1:2 行,第 3 行将是 1:3 行,第 4 行将只是第 4 行,因为它是分类变量 K = B 的第一行。

myinput <- data.frame(K = c("A", "A", "A", "B", "B", "B", "C", "C", "C"), 
                      date = c(1:3) , return = rnorm(9), regress1 = rnorm(9), regress2 = rnorm(9))

我在这里找到了一个非常有用的主题:Rolling regression with expanding window in R,但我很难将它应用到我的数据集。

如果有人可以帮助我了解我需要如何调整他们使用的方法,我将不胜感激。谢谢。

【问题讨论】:

    标签: r regression rolling-computation


    【解决方案1】:

    使用末尾注释中可重现的myinput,定义一个函数reg 来执行回归。然后使用rollapplyr 和等于datewidth 参数,利用date 在组内是1、2、3 等这一事实,因此等于要回归的行数。最后cbind将结果返回原始数据框。

    library(zoo)
    
    reg <- function(x) coef(lm(as.data.frame(x)))
    
    r <- rollapplyr(zoo(myinput[3:5]), myinput$date, reg, by.column=FALSE, coredata=FALSE)
    cbind(myinput, coef = coredata(r))
    

    给予:

      K date      return   regress1   regress2 coef.(Intercept) coef.regress1 coef.regress2
    1 A    1 -0.56047565 -0.4456620  0.7013559      -0.56047565            NA            NA
    2 A    2 -0.23017749  1.2240818 -0.4727914      -0.47231761     0.1978137            NA
    3 A    3  1.55870831  0.3598138 -1.0678237       0.15985654    -0.9479906    -1.6294374
    4 B    1  0.07050839  0.4007715 -0.2179749       0.07050839            NA            NA
    5 B    2  0.12928774  0.1106827 -1.0260044       0.15171486    -0.2026254            NA
    6 B    3  1.71506499 -0.5558411 -0.7288912       1.05050327    -2.0789081     0.6735997
    7 C    1  0.46091621  1.7869131 -0.6250393       0.46091621            NA            NA
    8 C    2 -1.26506123  0.4978505 -1.6866933      -1.93165311     1.3389399            NA
    9 C    3 -0.68685285 -1.9666172  0.8377870      -0.14625482     0.6376389     0.8515213
    

    注意

    set.seed 必须在使用随机数据之前使用,以使结果可重现。我们使用了这个:

    set.seed(123)
    myinput <- data.frame(K = c("A", "A", "A", "B", "B", "B", "C", "C", "C"), 
      date = 1:3, return = rnorm(9), regress1 = rnorm(9), regress2 = rnorm(9))
    

    【讨论】:

    • 谢谢@G。格洛腾迪克。这看起来很棒。但是,当我应用 rollapply 时,出现以下错误: Math.POSIXt(length.out) 中的错误:未为“POSIXt”对象定义“天花板”。也许我应该补充一点,我使用的日期实际上不是 1、2、3 格式,而是从 1997-03-31 到 1997-06-30、1997-09-30 等的 92 个季度(可能应该'已将其包含在问题中,对此感到抱歉)。这可能是我收到错误的原因吗?
    • 如果每个组的行数相同,k(其中 k = nrow(myinput) / nlevels(myinput$K) 在问题中为 3)那么日期列必须为 1:k .在组内逐字使用代码。如果不是,则 myinput$w
    猜你喜欢
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2017-11-29
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多