使用内置的anscombe 数据框,我们将y1 列与x1 和x2 进行回归,等等。我们在这里使用宽度3 来进行说明。
xnames 应设置为 x 变量的名称。在anscombe 数据集中,以x 开头的列名是x 变量。再举一个例子,如果除第一列之外的所有列都是 x 变量,则可以使用 xnames <- names(DF)[-1]。
我们定义了一个 R 平方函数 rsq,它接受要使用的索引 ix 和 x 变量名称 xname。然后我们在xnames 上sapply 和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 ))
通过长度(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) 也可以颠倒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)