【问题标题】:R / Rolling Regression with extended Data Frame带有扩展数据框的 R / 滚动回归
【发布时间】:2017-09-03 16:43:42
【问题描述】:

您好,我目前正在使用以下代码进行回归分析:

for (i in 1:ncol(Ret1)){
  r2.out[i]=summary(lm(Ret1[,1]~Ret1[,i]))$r.squared 
} 
r2.out

此代码针对第一列的数据帧中的每一列运行一个简单的 OLS 回归,并提供这些回归的 R^2。 此刻回归使用列的所有数据点。 我需要的现在是代码而不是使用列中的所有数据点,而是使用数据点的滚动窗口。因此,他计算了整个时间框架内 30 天的滚动窗口 R^2。输出是一个矩阵,其中每个 (1,i) 对的每个滚动窗口的所有 R^2。

此代码执行滚动回归部分,但不会为每个 (1,i) 对进行回归。

dolm <- function(x) summary(lm(Ret1[,1]~Ret1[,i]))$r.squared 
        rollapplyr(Ret1, 30, dolm, by.column = FALSE)

非常感谢您提供的任何帮助。

【问题讨论】:

    标签: r regression


    【解决方案1】:

    使用内置的anscombe 数据框,我们将y1 列与x1x2 进行回归,等等。我们在这里使用宽度3 来进行说明。

    xnames 应设置为 x 变量的名称。在anscombe 数据集中,以x 开头的列名是x 变量。再举一个例子,如果除第一列之外的所有列都是 x 变量,则可以使用 xnames &lt;- names(DF)[-1]

    我们定义了一个 R 平方函数 rsq,它接受要使用的索引 ix 和 x 变量名称 xname。然后我们在xnamessapplyrollapply 在索引1:n 上。

    library(zoo)
    
    xnames <- grep("x", names(anscombe), value = TRUE)
    n <- nrow(anscombe)
    w <- 3
    rsq <- function(ix, xname) summary(lm(y1 ~., anscombe[c("y1", xname)], subset = ix))$r.sq
    sapply(xnames, function(xname) rollapply(1:n, w, rsq, xname = xname ))
    

    通过长度(xnames)给出维度 n - w + 1 的以下结果:

                    x1           x2           x3        x4
     [1,] 2.285384e-01 2.285384e-01 2.285384e-01 0.0000000
     [2,] 3.591782e-05 3.591782e-05 3.591782e-05 0.0000000
     [3,] 9.841920e-01 9.841920e-01 9.841920e-01 0.0000000
     [4,] 5.857410e-01 5.857410e-01 5.857410e-01 0.0000000
     [5,] 9.351609e-01 9.351609e-01 9.351609e-01 0.0000000
     [6,] 8.760332e-01 8.760332e-01 8.760332e-01 0.7724447
     [7,] 9.494869e-01 9.494869e-01 9.494869e-01 0.7015512
     [8,] 9.107256e-01 9.107256e-01 9.107256e-01 0.3192194
     [9,] 8.385510e-01 8.385510e-01 8.385510e-01 0.0000000
    

    变体

    1) 也可以颠倒rollapplysapply 的顺序,将最后一行代码替换为:

    rollapply(1:n, 3, function(ix) sapply(xnames, rsq, ix = ix))
    

    2) 另一个变体是将rsq 的定义和 sapply/rollapply 行替换为以下单个语句。它可能有点难以阅读,因此您可能更喜欢第一个解决方案,但它确实需要一个简化 - 即,xname 不再需要是内部匿名函数的显式参数(它取代了上面的 rsq ):

    sapply(xnames, function(xname) rollapply(1:n, 3, function(ix) 
        summary(lm(y1 ~., anscombe[c("y1", xname)], subset = ix))$r.sq))
    

    更新:固定线路现在是n &lt;- nrow(anscombe)

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      相关资源
      最近更新 更多