使用內置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
不再需要內部匿名函數的明確參數(取代上面的):
sapply(xnames, function(xname) rollapply(1:n, 3, function(ix)
summary(lm(y1 ~., anscombe[c("y1", xname)], subset = ix))$r.sq))
更新:有固定的線路現在是n <- nrow(anscombe)