2010-12-11 7 views
5

Wie erhält man einen zweiseitigen "gleitenden Durchschnitt", bei dem es sich um eine Funktion handelt, die n Zahlen von rechts und links eines Vektors mittelt und ihnen Gewichte entsprechend ihrer Entfernung vom Mittelpunkt gibt?zweiseitiger gleitender Durchschnitt?

Ich habe versucht, TTR zu verwenden, aber seine gleitenden Durchschnitte funktionieren nur von links nach rechts und setzen die Werte ganz links als NA. Also kann ich diesen geglätteten Vektor nicht als Eingabe für smooth.spline verwenden

Antwort

8

Im Zoo Paket rollmean und rollapply Argumente haben, die zahlreiche Variationen ermöglichen.

library(zoo) 
x <- seq(10)^2 

# no NAs at end 
rollmean(x, 3) 

# NAs at ends 
rollmean(x, 3, na.pad = TRUE) 

# weighted mean 
rollapply(zoo(x), 3, function(x) c(1, 2, 1) %*% x/4) 

# at ends take means of less than 3 points - needs devel version 
# partial= is in development and at this point must use na.rm = TRUE to use partial 
source("http://r-forge.r-project.org/scm/viewvc.php/*checkout*/pkg/zoo/R/rollapply.R?revision=802&root=zoo") 
rollapply(zoo(x), 3, mean, partial = TRUE, na.rm = TRUE) 

EDIT:

Beachten Sie, dass, da dies die Entwicklungsversion von Zoo geschrieben wurde so geändert, dass statt des Schreibens partial = TRUE man schreibt Regel = „teilweise“ oder rule = 3. Das Problem war, dass neue Endregeln zur Entwicklungsversion hinzugefügt wurden (es gibt jetzt 3 und eine vierte wird hinzugefügt, bevor sie veröffentlicht wurde), wobei ein separates Argument für jede die Benutzeroberfläche überfüllt. Auch rule ist konsistenter mit approx im Kern von R. Tatsächlich haben rule=1 und rule=2 die gleiche Bedeutung in rollapply und in approx (aus dem Kern von R) für bessere Konsistenz und Benutzerfreundlichkeit. Die Klammern um mean in dem folgenden Beispiel werden derzeit in der Entwicklungsversion benötigt, um zu verhindern, dass sie rollmean aufrufen, wobei noch nicht implementiert wurde, aber die Notwendigkeit dazu wird bis zur offiziellen Freigabe beseitigt.

source("http://r-forge.r-project.org/scm/viewvc.php/*checkout*/pkg/zoo/R/rollapply.R?revision=815&root=zoo") 
rollapply(zoo(x), 3, (mean), rule = "partial") 
+0

Aber warum Ausgang von Rollmean ist immer ein Element kürzer als esput? – rsk82

2

Sie könnten versuchen kernel zusammen mit kernapply (es gibt einige Beispiele gegen Ende der ersten Seite).

5

Blick auf die filter() Funktion und insbesondere die sides Argument:

filter     package:stats    R Documentation 

Linear Filtering on a Time Series 

Description: 

    Applies linear filtering to a univariate time series or to each 
    series separately of a multivariate time series. 

Usage: 

    filter(x, filter, method = c("convolution", "recursive"), 
      sides = 2, circular = FALSE, init) 

Arguments: 
[...] 
    sides: for convolution filters only. If ‘sides=1’ the filter 
      coefficients are for past values only; if ‘sides=2’ they are 
      centred around lag 0. In this case the length of the filter 
      should be odd, but if it is even, more of the filter is 
      forward in time than backward.