2016-06-27 17 views
1

Wie kann ich ein rollendes Fenster/Schleife (Rückschauperiode 30 Tage/Datenpunkte) erstellen, während ich die Daten mit base::rank rangiere? Siehe unten, dass die Funktion apply.rolling nicht zu funktionieren scheint.apply.rolling window/loop mit einer Rangfunktion

Siehe Beispiel unten:

# example data 
require(xts) 
set.seed(3)  
A <- matrix(runif(900, max=30), ncol=3) 
Data <- xts(A, Sys.Date()-300:1) 
names(Data) <- c("C1", "C2", "C3") 

Daraus ergibt sich (nur der letzten 7 Tage/Datenpunkte werden angezeigt):

2016-06-20 16.71131510 12.80074552 19.27525535 
2016-06-21 22.92512330 25.11613536 17.45237229 
2016-06-22 20.09403965 17.20945809 28.06481040 
2016-06-23 28.68593738 4.84698272 18.36108782 
2016-06-24 15.52956209 25.54946621 3.97892474 
2016-06-25 25.76582707 18.14117193 8.17883282 
2016-06-26 25.23925100 16.07418907 15.35118717 

ich nur die letzten 30 Datenpunkte wählen:

rolldata30 <- tail(Data[,2:3], 30) 
rollindex30 <- tail(Data[,1], 30) 

Ich ordne die Daten (letzten 30 Datenpunkte) von Vektor C2 und C3 Basis d auf ihren ursprünglichen Werten. Dies ist also der Zeitraum 2016-05-28 bis 2016-6-26. Dann mache ich einen neuen Vektor, der einen Durchschnitt der beiden berechnet. factorx zeigt das Ergebnis, das ich interessiert bin

rank30 <- as.xts(apply(-rolldata30, 2, rank, na.last= "keep")) 
factor <- cbind(rollindex30, global = rowMeans(rank30)) 
factorx <- last(factor) 

was zur Folge hat.

2016-06-20 16.711315 14.5 
2016-06-21 22.925123 9.5 
2016-06-22 20.094040 9.0 
2016-06-23 28.685937 19.0 
2016-06-24 15.529562 15.0 
2016-06-25 25.765827 18.5 
2016-06-26 25.239251 17.0 

mit Daten am letzten Tag:

  C1  global 
2016-06-26 25.23925  17 

Wie kann ich die Berechnung Roll machen in Um die gleiche Berechnung für 2016-5-27 bis 2016-06-26, 2016-05-26 bis 2016-06-25 usw.?

PerformanceAnalytics::apply.rolling Verwendung gibt einen Fehler:

Fehler in xts (x, order.by = order.by, Frequenz = Frequenz, .CLASS = "double",: order.by erfordert eine entsprechende zeit basiertes Objekt

require(PerformanceAnalytics) 
test1 <- apply.rolling(Data, width=30, gap=30, by=1, FUN=function(x) as.xts(-x, 2, rank)) 

ich die folgende Funktion aus. factorz das gleiche Ergebnis gibt. Vielleicht hilft die Funktion zu machen, rollen sie?

rollrank <- function(x) 
{ 
    a <- tail(x, 30) 
    b <- as.xts(apply(-a, 2, rank, na.last= "keep")) 
    c <- cbind(a, global = rowMeans(b)) 
    d <- last(c) 
    return(d) 
} 
factorz <- rollrank(Data[,2:3]) 

Antwort

1

Das FUN Argument zu apply.rolling macht keinen Sinn. Ich vermute, du meinst FUN = function(x) as.xts(apply(-x, 2, rank, na.last="keep")). Aber das wird immer noch nicht funktionieren, weil FUN ein Objekt mit mehr als einer Zeile zurückgibt.

Ihre rollrank Funktion kommt Ihnen sehr nahe und Sie sollten rollapply statt apply.rolling verwenden. Ich schlage vor, dass Sie eine Funktion basierend auf Ihrem ersten Beispiel erstellen und dann diese Funktion an rollapply übergeben.

myrank <- function(x) { 
    rolldata30 <- x[,2:3] 
    rollindex30 <- x[,1] 
    rank30 <- as.xts(apply(-rolldata30, 2, rank, na.last= "keep")) 
    factor <- cbind(rollindex30, global = rowMeans(rank30)) 
    factorx <- last(factor) 
    return(factorx) 
} 
test1 <- rollapply(Data, 30, myrank, by.column=FALSE) 
tail(test1) 
#     C1 global 
# 2016-06-23 7.806336 19.5 
# 2016-06-24 17.456436 17.5 
# 2016-06-25 29.196350 12.5 
# 2016-06-26 25.185687 11.0 
# 2016-06-27 19.775105 6.5 
# 2016-06-28 12.067774 16.0 
+0

Vielen Dank, das ist, was ich gesucht habe! –