Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 计算列中包含因变量的滚动回归系数_R_Rollapply - Fatal编程技术网

R 计算列中包含因变量的滚动回归系数

R 计算列中包含因变量的滚动回归系数,r,rollapply,R,Rollapply,我希望计算滚动回归的系数(特别是截距)。有许多因变量。其中一些(Y1和Y2)如下所示。其中每一项都用自变量X1和X2进行回归。此外,Y1和Y2在不同时期都有NAs。数据是一个具有月间隔的时间序列。滚动窗口为6 这是我的代码: rr <- rollapply(df, width = 6, FUN = function(z) coef(lm(Y1~ X1+X2, data = as.data.fram

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

这是我的代码:

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

有两个问题:

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

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

  • 增加了一些改进:

    • 首先将输入转换为类zoo
    • 定义函数
      getCoef
      ,以获得给定数据和公式左右两侧的系数
    • 定义函数
      roll
      以使用
      rollappyr
    • lappy
      功能
      roll
      覆盖
      c(“Y1”、“Y2”)
      以生成2个动物园对象的列表
    • 可以选择将
      fortify.zoo
      映射到
      L
      上,以给出数据帧列表
    代码:

    注:可复制形式的输入
    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)
    
    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)
    
    Map(fortify.zoo, L)
    
    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)