Home Articles

R /滚动回归与扩展数据框架

Asked
Viewed 907 times
2

你好我正在使用以下代码进行回归分析:

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

此代码对第一列中的数据框中的每列运行简单的OLS回归,并提供这些回归的R ^ 2 . At the Moment 回归使用列的所有数据点 . What I Need 现在是代码而不是使用列中的所有数据点只使用数据点的滚动窗口 . 所以他计算了整个时间框架内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)

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

1 Answer

  • 1

    使用内置的 anscombe 数据框,我们针对 x1 然后 x2 等回退 y1 列 . 为了说明的目的,我们在这里使用宽度3 .

    xnames 应设置为x变量的名称 . 在 anscombe 数据集中,以 x 开头的列名是x变量 . 作为另一个示例,如果除了第一列之外的所有列都是x变量,则可以使用 xnames <- names(DF)[-1] .

    我们定义一个R平方函数 rsq ,它使用索引, ix 和x变量名 xname . 然后我们在 xnamessapply ,在 1:n 上的每一个 rollapply .

    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 ))
    

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

    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
    

    Variations

    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))
    

    Update: 有固定的线路,现在 n <- nrow(anscombe)

Related