2017-08-29 3 views
2

Hallo ich zur Zeit mit dem folgenden Code auf einer Regressionsanalyse arbeiten:R/Roll Regression mit erweiterten Datenrahmen

for (i in 1:ncol(Ret1)){ 
    r2.out[i]=summary(lm(Ret1[,1]~Ret1[,i]))$r.squared 
} 
r2.out 

Dieser Code wird eine einfache OLS Regression jeder Spalte in dem Datenrahmen Agianst ersten Spalte und liefert das R^2 dieser Regressionen. Im Moment verwendet die Regression alle Datenpunkte einer Spalte. Was ich brauche jetzt ist, dass der Code statt alle Datenpunkte in einer Spalte verwendet nur ein rollendes Fenster von Datenpunkten. So berechnet er für ein rollendes Fenster von 30 Tagen den R^2 über den gesamten Zeitrahmen. Die Ausgabe ist eine Matrix mit allen R^2 pro rollierendem Fenster für jedes (1, i) -Paar.

Dieser Code führt den Rolling Regression-Teil durch, aber nicht die Regression für jedes (1, i) -Paar.

dolm <- function(x) summary(lm(Ret1[,1]~Ret1[,i]))$r.squared 
     rollapplyr(Ret1, 30, dolm, by.column = FALSE) 

Ich schätze wirklich jede Hilfe, die Sie zur Verfügung stellen können.

Antwort

1

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)

Verwandte Themen