R / 具有扩展数据框的滚动回归
R / Rolling Regression with extended Data Frame
你好,我目前正在使用以下代码进行回归分析:
for (i in 1:ncol(Ret1)){
r2.out[i]=summary(lm(Ret1[,1]~Ret1[,i]))$r.squared
}
r2.out
此代码针对第一列运行数据框中每一列的简单 OLS 回归,并提供这些回归的 R^2。 此刻 回归使用列的所有数据点。 我现在需要的是,代码不是使用列中的所有数据点,而是使用滚动的window数据点。因此,他计算了整个时间范围内 30 天的滚动 window R^2。输出是一个矩阵,每个 (1,i) 对的每个滚动 window 的所有 R^2。
此代码执行滚动回归部分,但不对每个 (1,i) 对进行回归。
dolm <- function(x) summary(lm(Ret1[,1]~Ret1[,i]))$r.squared
rollapplyr(Ret1, 30, dolm, by.column = FALSE)
非常感谢您提供的任何帮助。
使用内置的 anscombe
数据框,我们将 y1
列与 x1
和 x2
等进行回归。我们在这里使用 3 的宽度说明的目的。
xnames
应设置为 x 变量的名称。在 anscombe
数据集中,以 x
开头的列名是 x 变量。作为另一个例子,如果除了第一列之外所有列都是 x 变量,那么可以使用 xnames <- names(DF)[-1]
。
我们定义了一个 R 平方函数 rsq
,它使用索引 ix
和 x 变量名称 xname
。然后我们 sapply
在 xnames
上,并且每个 rollapply
在索引 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 ))
给出维度 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
变化
1) 也可以颠倒 rollapply
和 sapply
的顺序,将最后一行代码替换为:
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 <- nrow(anscombe)
你好,我目前正在使用以下代码进行回归分析:
for (i in 1:ncol(Ret1)){
r2.out[i]=summary(lm(Ret1[,1]~Ret1[,i]))$r.squared
}
r2.out
此代码针对第一列运行数据框中每一列的简单 OLS 回归,并提供这些回归的 R^2。 此刻 回归使用列的所有数据点。 我现在需要的是,代码不是使用列中的所有数据点,而是使用滚动的window数据点。因此,他计算了整个时间范围内 30 天的滚动 window R^2。输出是一个矩阵,每个 (1,i) 对的每个滚动 window 的所有 R^2。
此代码执行滚动回归部分,但不对每个 (1,i) 对进行回归。
dolm <- function(x) summary(lm(Ret1[,1]~Ret1[,i]))$r.squared
rollapplyr(Ret1, 30, dolm, by.column = FALSE)
非常感谢您提供的任何帮助。
使用内置的 anscombe
数据框,我们将 y1
列与 x1
和 x2
等进行回归。我们在这里使用 3 的宽度说明的目的。
xnames
应设置为 x 变量的名称。在 anscombe
数据集中,以 x
开头的列名是 x 变量。作为另一个例子,如果除了第一列之外所有列都是 x 变量,那么可以使用 xnames <- names(DF)[-1]
。
我们定义了一个 R 平方函数 rsq
,它使用索引 ix
和 x 变量名称 xname
。然后我们 sapply
在 xnames
上,并且每个 rollapply
在索引 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 ))
给出维度 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
变化
1) 也可以颠倒 rollapply
和 sapply
的顺序,将最后一行代码替换为:
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 <- nrow(anscombe)