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

时间:2017-08-29 11:02:00

标签: r regression

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

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)

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

1 个答案:

答案 0 :(得分:1)

使用内置的anscombe数据框,我们会针对y1然后x1等对x2列进行回归。我们在此处使用宽度为3插图。

应将

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

我们定义一个R平方函数rsq,它使用索引ix和x变量名xname。然后我们sapply覆盖xnamesrollapply覆盖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 ))

                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

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

rollapply

<强>变体形式

1)也可以颠倒sapplyrollapply(1:n, 3, function(ix) sapply(xnames, rsq, ix = ix)) 替换最后一行代码的顺序:

rsq

2)另一种变化是用以下单个语句替换xname和sapply / rollapply行的定义。它可能有点难以阅读,所以你可能更喜欢第一个解决方案,但它确实需要一个简化 - 即rsq不再需要是内部匿名函数的明确参数(它取代{{ 1}}上面):

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

更新:拥有现在为n <- nrow(anscombe)

的固定行