2010-12-11 16 views
5

cómo obtener el "promedio móvil" de dos lados que es una función que promedia n números de la derecha y la izquierda de un vector y les da pesos de acuerdo con su distancia del valor central?promedio móvil de dos caras?

Intenté usar TTR pero sus promedios móviles solo funcionan de izquierda a derecha y establece los valores más a la izquierda como NA. Así que no puedo usar ese vector suavizado como entrada para smooth.spline

Respuesta

8

En el paquete zoológico rollmeanrollapply y tienen argumentos que permiten numerosas variaciones.

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:

Tenga en cuenta que ya que este fue escrito la versión de desarrollo del zoológico se cambió para que en vez de escribir partial = TRUE uno escribe regla = "parcial" o rule = 3. El problema era que a medida que se agregaban nuevas reglas de finalización a la versión de desarrollo (ahora hay 3 y se agregará una cuarta antes de su lanzamiento), tener un argumento separado para cada una satura la interfaz de usuario. También rule es más consistente con approx en el núcleo de R. De hecho, rule=1 y rule=2 tendrá el mismo significado en rollapply y en approx (desde el núcleo de R) para una mejor consistencia y facilidad de uso. Los paréntesis alrededor de mean en el ejemplo siguiente se requieren actualmente en la versión de desarrollo para evitar que llame al rollmean, donde rule="partial" aún no se ha implementado, pero la necesidad de hacerlo se eliminará cuando se lance oficialmente.

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

¿Pero por qué la salida de rollmean es siempre un elemento más corto que la salida? – rsk82

2

Puede probar kernel junto con kernapply (hay algunos ejemplos hacia el final de la primera página).

5

observar la función filter(), y en particular el argumento sides:

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. 
Cuestiones relacionadas