Home Articles

使用列中的因变量计算滚动回归系数

Asked
Viewed 1551 times
0

我希望能够计算滚动回归的系数(特别是截距) . 有许多因变量 . 其中一些(Y1和Y2)如下所示 . 它们中的每一个都用自变量X1和X2回归 . 另外,Y1和Y2在不同时期都具有NA . 数据是按月间隔的时间序列 . 滚动窗口是6 .

这是我的代码:

rr <- rollapply(df, width = 6,  
                  FUN = function(z) coef(lm(Y1~ X1+X2, 
                          data = as.data.frame(z))),
                by.column = FALSE, align = "right")

但是,这段代码的问题是
1)它一次只处理一个自变量(在这种情况下为Y1),
2)它给出了所有滚动回归的相同系数 . 我假设NA的存在搞砸了滚动回归?
如果有人可以点灯,我将不胜感激 . 谢谢 .

这是一个示例数据 .

Date        Y1    Y2    X1      X2
1/1/2009    NA  1.51    0.02    0.75
2/1/2009    NA  -0.38   0.01    0.59
3/1/2009    NA  1.54    0.02    0.96
4/1/2009    NA  1.78    0.01    0.92
5/1/2009    NA  0.94    0.02    0.02
6/1/2009    NA  1.37    0.01    0.46
7/1/2009    NA  1.22    0.01    0.61
8/1/2009    NA  1.32    0.01    0.04
9/1/2009    NA  0.83    0.01    0.03
10/1/2009   NA  0.95    0.02    0.61
11/1/2009   NA  0.28    0.03    0.53
12/1/2009   NA  0.17    0.01    0.32
1/1/2010    1.71    NA  0.03    0.53
2/1/2010    0.39    NA  0.03    0.16
3/1/2010    0.11    NA  0.01    0.58
4/1/2010    1.25    NA  0.01    0.41
5/1/2010    0.57    NA  0.01    0.9
6/1/2010    0.48    NA  0.01    0.58
7/1/2010    0.16    NA  0.01    0.03
8/1/2010    0.37    NA  0.01    0.23
9/1/2010    0.31    NA  0.01    0.77
10/1/2010   0.63    NA  0.01    0.75
11/1/2010   0.61    NA  0.01    0.74
12/1/2010   0.91    NA  0.01    0.41

1 Answer

  • 1

    有两个问题:

    • 将data.frame传递给 rollapply 会导致它转换为矩阵,并且由于其中一列是字符列,因此结果将是字符矩阵,而数字则是所需的 . 使用 df[-1] 或下面显示的代码 .

    • lm 不接受具有所有NA值的因变量 . 在这种情况下检查并返回NA .

    添加一些改进:

    • 首先将输入转换为类动物园 .

    • 定义函数 getCoef 以获得给定数据的系数以及公式的左侧和右侧

    • 定义函数 roll 使用 rollapplyr 执行 rollapply

    • lapply 函数 roll over c("Y1", "Y2") 生成2个动物园对象的列表

    • 可选地将 fortify.zoo 映射到 L 以提供数据帧列表

    码:

    z <- read.zoo(df, FUN = as.yearmon, format = "%m/%d/%Y")
    
    getCoef <- function(z, lhs, rhs) {
      if (all(is.na(z[, lhs]))) NA
      else coef(lm(paste(lhs, "~", rhs), z))
    }
    
    roll <- function(z, lhs, rhs = "X1 + X2") {
      rollapplyr(z, 6, getCoef, by.column = FALSE, coredata = FALSE, lhs = lhs, rhs = rhs)
    }
    
    ynames <- c("Y1", "Y2")
    L <- lapply(ynames, roll, z = z)
    

    (可选)对于data.frames列表:

    Map(fortify.zoo, L)
    

    Note: 可重复形式的输入 df 是:

    Lines <- "Date    Y1  Y2  X1  X2
    1/1/2009    NA  1.51    0.02    0.75
    2/1/2009    NA  -0.38   0.01    0.59
    3/1/2009    NA  1.54    0.02    0.96
    4/1/2009    NA  1.78    0.01    0.92
    5/1/2009    NA  0.94    0.02    0.02
    6/1/2009    NA  1.37    0.01    0.46
    7/1/2009    NA  1.22    0.01    0.61
    8/1/2009    NA  1.32    0.01    0.04
    9/1/2009    NA  0.83    0.01    0.03
    10/1/2009   NA  0.95    0.02    0.61
    11/1/2009   NA  0.28    0.03    0.53
    12/1/2009   NA  0.17    0.01    0.32
    1/1/2010    1.71    NA  0.03    0.53
    2/1/2010    0.39    NA  0.03    0.16
    3/1/2010    0.11    NA  0.01    0.58
    4/1/2010    1.25    NA  0.01    0.41
    5/1/2010    0.57    NA  0.01    0.9
    6/1/2010    0.48    NA  0.01    0.58
    7/1/2010    0.16    NA  0.01    0.03
    8/1/2010    0.37    NA  0.01    0.23
    9/1/2010    0.31    NA  0.01    0.77
    10/1/2010   0.63    NA  0.01    0.75
    11/1/2010   0.61    NA  0.01    0.74
    12/1/2010   0.91    NA  0.01    0.41"
    df <- read.table(text = Lines, header = TRUE)
    

Related