Mit dem eingebauten anscombe
Datenrahmen wird die y1
Spalte gegen x1
und dann x2
usw. regressiert. Zur Veranschaulichung verwenden wir hier eine Breite von 3.
xnames
sollte auf die Namen der x-Variablen festgelegt werden. Im anscombe
Datensatz sind die Spaltennamen, die mit x
beginnen, die x-Variablen. Als ein anderes Beispiel, wenn alle Spalten x Variablen außer der ersten sind, dann könnte verwendet werden.
Wir definieren eine R-Funktion quadriert, rsq
, die die Indizes nimmt zu verwenden, ix
und die x-Variablennamen xname
. Wir haben dann sapply
über die xnames
und für jede rollapply
über die Indizes 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))
das folgende Ergebnis Maße n - w + 1 durch Länge (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) Es wäre auch möglich, die Reihenfolge umzukehren von die rollapply
und sapply
ersetzen die letzte Zeile des Codes mit:
rollapply(1:n, 3, function(ix) sapply(xnames, rsq, ix = ix))
2) Eine weitere Variante besteht darin, die Definition von rsq
und die Sapply/Rollapply-Zeile durch die folgende einzelne Anweisung zu ersetzen. Es mag etwas schwieriger zu lesen sein, aber Sie bevorzugen vielleicht die erste Lösung, aber es bringt eine Vereinfachung mit sich - nämlich xname
muss nicht länger ein explizites Argument der inneren anonymen Funktion sein (die an die Stelle rsq
oben tritt):
sapply(xnames, function(xname) rollapply(1:n, 3, function(ix)
summary(lm(y1 ~., anscombe[c("y1", xname)], subset = ix))$r.sq))
Update: Linie festgelegt haben, die ist jetzt n <- nrow(anscombe)