【问题标题】:Looping a rolling-window regression with a NA values使用 NA 值循环滚动窗口回归
【发布时间】:2020-08-25 04:07:41
【问题描述】:

这里有一个 R 编程问题。

所以我尝试运行多个滚动窗口回归并保存每个回归的 beta。在我给定的示例中,我想对前 5 个 obs 在 X1 上回归 Y。然后保存 beta(斜率系数)。然后运行下一个 5(所以第 2 行到第 6 行)并保存下一个测试版。对于不同的 X 值,我想这样做三遍。 我的数据如下所示:

Row Y X1 X2 X3 
 1  1  2  3  NA
 2  1  3  5  NA
 3  1  4  6  NA
 4  2  4  6  4
 5  3  3  4  8
 6  4  4  6  7 
 7  3  5  5  3
 8  5  4  6  7

我试图运行的代码是一个循环,如下:

#Rows equals the number of rows in my obs matrix.
for (j in 1:3) {
  for (i in 1:(Rows-4)) {
    Model<- lm(data[((i+0):(4+i)),1] ~ data[((i+0):(4+i)),j])
    betas[i,j] <- coefficients(Model)[2]
  }
}

问题是我的 beta 矩阵只给了我 X3 的第三列的 NA。所以我得到的是:


Row X1     X2   X3 
 1  coef  coef  NA
 2  coef  coef  NA
 3  coef  coef  NA
 4  coef  coef  NA

但是,我想得到的是以下几点:

#my beta matrix looks like this

Row X1     X2   X3 
 1  coef  coef  NA
 2  coef  coef  NA
 3  coef  coef  NA
 4  coef  coef  coef

换句话说,因为最后一列 (X3) 有一些初始 NA,所以即使它正在回归的窗口没有 NA,它也会为所有未来的系数值提供 NA。我尝试过使用 na.omit 命令无济于事。

有没有人可以解决如何进行这种循环回归? 已经很感激了。万事如意

【问题讨论】:

  • 你是如何初始化betas的?作为一个空的数字矩阵?另外,i+0 是多余的。
  • 请原谅,我不太清楚你的意思。我只是将斜率系数保存到一个新矩阵中。
  • 您的代码省略了行。截至目前betas(甚至Rows)不存在。在循环之前显示其创建线。也许betas &lt;- matrix(...).
  • beta = matrix( NA , nrow = 4 , ncol = 3) Rows = nrow(data) 这有帮助吗?
  • 一个问题可能是你的内部for 循环只使用了一行,检查for (i in 1:(Rows-4)) {print(i)}

标签: r loops regression linear-regression


【解决方案1】:

问题归结为您使用 j 引用的列。由于您需要填写一个空矩阵但忽略 data 中的第一列,因此添加 1 以跳过用作因变量的第一列。而且由于 4 处的窗口大于 3 处的 NA 行,因此所有行都应该有回归结果:

for (j in 1:3) {
  for (i in 1:(Rows-4)) {
    Model<- lm(data[i:(4+i),1] ~ data[i:(4+i), j+1])
    betas[i,j] <- coefficients(Model)[2]
  }
}

betas
#              [,1]        [,2]      [,3]
# [1,] 1.428571e-01 -0.05882353 0.2500000
# [2,] 3.333333e-01 -0.12500000 0.3461538
# [3,] 1.648597e-15 -0.37500000 0.1764706
# [4,] 0.000000e+00  0.37500000 0.2872340

Online Demo

【讨论】:

    【解决方案2】:

    我们可以使用outer 方法将任意函数应用于两个对象(列表/向量)元素的所有组合。

    我们需要一个由五个递增序列组成的row.list

    row.list <- lapply(1:(nrow(dat)-4), function(x) x:(x+4))
    # [[1]]
    # [1] 1 2 3 4 5
    # 
    # [[2]]
    # [1] 2 3 4 5 6
    # 
    # [[3]]
    # [1] 3 4 5 6 7
    # 
    # [[4]]
    # [1] 4 5 6 7 8
    

    以及我们解释变量的向量ev

    ev <- c("X1", "X2", "X3")
    

    我们还需要 regFUN,它使用 reformulate 从字符串创建公式,

    regFUN <- Vectorize(function(x, i) lm(reformulate(x, "Y"), dat[i, -1])$coe[2])
    

    我们最终使用outer 将其应用于我们两个对象的所有元素组合。

    res <- t(outer(ev, row.list, regFUN))
    

    结果

    `colnames<-`(res, ev)
    #                X1          X2        X3
    # [1,] 1.428571e-01 -0.05882353 0.2500000
    # [2,] 3.333333e-01 -0.12500000 0.3461538
    # [3,] 1.648597e-15 -0.37500000 0.1764706
    # [4,] 0.000000e+00  0.37500000 0.2872340
    

    数据:

    dat <- read.table(text="Row Y X1 X2 X3 
     1  1  2  3  NA
     2  1  3  5  NA
     3  1  4  6  NA
     4  2  4  6  4
     5  3  3  4  8
     6  4  4  6  7 
     7  3  5  5  3
     8  5  4  6  7", header=TRUE)
    

    【讨论】:

    • 感谢您,我对最终输出感到有些困惑,其中 NA 似乎位于与我所希望的 beta 不同的位置。我想你在想我正在运行一个看起来像 Y ~ X1 + X2 + X3 的模型,而我实际上是在尝试单独执行看起来像 Y ~ X1 的回归并保存 beta,然后是 Y ~ X2 然后保存beta,然后 Y ~ X3 并保存 beta。然后调整窗口并再次回归。
    • 系数也可能是NA 其他原因,例如collinearity。刚刚注意到您想要没有截距的 betas 矩阵,因此我在公式中编辑了0 +
    • 嗨,这是真的。但只有当我对多个我不是的自变量进行回归时,共线性才会成为问题。
    • 我又被你的输出弄糊涂了。似乎您在回归中包含了所有三个变量。我想让它们分开计算。所以我运行以下 4 次,然后保存 beta 4 次(每次都有一个新的数据窗口) Y ~ X1 然后我对 X2 和 X3 做同样的事情,但是对于 X3,因为 NA 我不应该得到初始值。这应该给我以下内容:``` Row X1 X2 X3 1 coef coef NA 2 coef coef NA 3 coef coef NA 4 coef coef coef ```
    • 对不起,我真的错过了你使用双变量模型。检查我对答案的编辑。不过,我没有得到 NA; lm 使用大小写删除,例如在行 1:5 对变量 X3 的回归中,实际上只使用行 4:5
    【解决方案3】:

    我找到了解决问题的方法。问题是,一旦我开始计算最终列 (X3s) 回归,就会显示一条错误消息。

    提供正确解决方案的代码如下:

    for (j in 1:3) {
      for (i in 1:(Rows-4)) {
        try(Model<- lm(data[i:(4+i),1] ~ data[i:(4+i), j+1]), silent=T)
        betas[i,j] <- coefficients(Model)[2]
      }
    }
    

    包含 try 允许我继续运行循环并在最后一列中获得最终值。感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 2017-09-16
      • 2013-07-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多