Ich versuche, mit R den gleitenden Durchschnitt über eine Reihe von Werten in einer Matrix zu berechnen. Die normale Suche nach R-Mailinglisten war jedoch nicht sehr hilfreich. Es scheint keine eingebaute Funktion in R zu geben, mit der ich gleitende Durchschnitte berechnen kann. Bieten irgendwelche Pakete eines an? Oder muss ich meine eigenen schreiben?
r
moving-average
r-faq
Jared
quelle
quelle
forecast::ma
und es enthält alle Nachbarschaften, nicht richtig.Oder Sie können es einfach mit einem Filter berechnen. Hier ist die Funktion, die ich verwende:
Wenn Sie verwenden
dplyr
, achten Sie darauf,stats::filter
in der obigen Funktion anzugeben .quelle
stats::filter
sides = 2
entspricht align = "center" für zoo :: rollmean oder RcppRoll :: roll_mean.sides = 1
entspricht der "richtigen" Ausrichtung. Ich sehe keine Möglichkeit, "links" auszurichten oder mit "partiellen" Daten (2 oder mehr Werte) zu berechnen.Die Verwendung
cumsum
sollte ausreichend und effizient sein. Angenommen, Sie haben einen Vektor x und möchten eine laufende Summe von n ZahlenWie in den Kommentaren von @mzuther ausgeführt, wird davon ausgegangen, dass die Daten keine NAs enthalten. Um mit diesen umzugehen, müsste jedes Fenster durch die Anzahl der Nicht-NA-Werte geteilt werden. Hier ist eine Möglichkeit, den Kommentar von @Ricardo Cruz aufzunehmen:
Dies hat immer noch das Problem, dass, wenn alle Werte im Fenster NAs sind, ein Fehler durch Division durch Null auftritt.
quelle
cumsum(c(1:3,NA,1:3))
cx <- c(0, cumsum(ifelse(is.na(x), 0, x)))
.In data.table 1.12.0 neue
frollmean
Funktion wurde hinzugefügt , schnelle und exakte mittleren rollen zu berechnen sorgfältig HandhabungNA
,NaN
und+Inf
,-Inf
Werte.Da es in der Frage kein reproduzierbares Beispiel gibt, gibt es hier nicht viel mehr zu besprechen.
Weitere Informationen finden Sie
?frollmean
im Handbuch, das auch online unter verfügbar ist?frollmean
.Beispiele aus dem folgenden Handbuch:
quelle
Das
caTools
Paket hat einen sehr schnell rollenden Mittelwert / min / max / sd und einige andere Funktionen. Ich habe nur mitrunmean
und gearbeitetrunsd
und sie sind die schnellsten aller anderen bisher genannten Pakete.quelle
Sie können
RcppRoll
für sehr schnell gleitende Durchschnitte verwenden, die in C ++ geschrieben sind. Rufen Sie einfach dieroll_mean
Funktion auf. Dokumente finden Sie hier .Andernfalls sollte diese (langsamere) for-Schleife den Trick ausführen:
quelle
res = arr
. Dann gibt es eine Schleife, die vomn
oder bis zum 15. Element bis zum Ende des Arrays iteriert . Das bedeutet, dass die allererste Teilmenge, deren Mittelwert er nimmt,arr[1:15]
die Stelle ausfülltres[15]
. Jetzt ziehe ich es vor,res = rep(NA, length(arr))
anstattres = arr
jedes Elementres[1:14]
gleich NA zu setzen, anstatt einer Zahl, bei der wir nicht den vollen Durchschnitt von 15 Elementen nehmen konnten.In der Tat
RcppRoll
ist sehr gut.Der von cantdutchthis gepostete Code muss in der vierten Zeile korrigiert werden, um das Fenster zu fixieren:
Ein anderer Weg, der mit Fehlschlägen umgeht, ist hier angegeben .
Ein dritter Weg, um diesen Code zu verbessern, um Teilmittelwerte zu berechnen oder nicht, folgt:
quelle
Um die Antwort von cantdutchthis und Rodrigo Remedio zu ergänzen ;
quelle
Hier ist ein Beispielcode, der zeigt, wie ein zentrierter gleitender Durchschnitt und ein nachlaufender gleitender Durchschnitt mithilfe der
rollmean
Funktion aus dem Zoo- Paket berechnet werden .quelle
Man kann das
runner
Paket zum Verschieben von Funktionen verwenden. In diesem Fallmean_run
Funktion. Das Problem dabeicummean
ist, dass es keineNA
Werte verarbeitet, abermean_run
tut.runner
Paket unterstützt auch unregelmäßige Zeitreihen und Fenster können vom Datum abhängen:Man kann auch andere Optionen wie angeben
lag
und nurat
bestimmte Indizes rollen . Mehr in der Paket- und Funktionsdokumentation .quelle
Obwohl etwas langsam, können Sie aber auch zoo :: rollapply verwenden, um Berechnungen für Matrizen durchzuführen.
wobei x der Datensatz ist, ist FUN = Mittelwert die Funktion; Sie können es auch in min, max, sd usw. ändern und width ist das rollende Fenster.
quelle
set.seed(123); x <- rnorm(1000); system.time(apply(embed(x, 5), 1, mean)); library(zoo); system.time(rollapply(x, 5, mean))
Auf meinem Computer ist es so schnell, dass es eine Zeit von 0 Sekunden zurückgibt.Hierfür kann das Slider-Paket verwendet werden. Es hat eine Schnittstelle, die speziell dafür entwickelt wurde, sich ähnlich wie purrr anzufühlen. Es akzeptiert jede beliebige Funktion und kann jede Art von Ausgabe zurückgeben. Datenrahmen werden sogar zeilenweise iteriert. Die pkgdown Seite ist hier .
Der Overhead von Slider- und Datentabellen
frollapply()
sollte ziemlich gering sein (viel schneller als im Zoo).frollapply()
scheint für dieses einfache Beispiel hier etwas schneller zu sein, aber beachten Sie, dass nur numerische Eingaben erforderlich sind und die Ausgabe ein skalarer numerischer Wert sein muss. Schiebereglerfunktionen sind vollständig allgemein gehalten, und Sie können einen beliebigen Datentyp zurückgeben.quelle