2010-12-11 3 views
5

comment obtenir une "moyenne mobile" bilatérale qui est une fonction qui fait la moyenne de n nombres de droite et de gauche d'un vecteur et leur donne des poids en fonction de leur distance de la valeur centrale?moyenne mobile recto-verso?

J'ai essayé d'utiliser TTR mais ses moyennes mobiles ne fonctionnent que de gauche à droite et définissent les valeurs les plus à gauche comme NA. Donc, je ne peux pas utiliser ce vecteur lissé comme une entrée pour smooth.spline

Répondre

8

Dans le package zoo rollmean et rollapply ont des arguments qui permettent de nombreuses variations.

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:

Notez que depuis cela a été écrit la version de développement du zoo a été modifié de sorte qu'au lieu d'écrire partial = TRUE on écrit règle = « partielle » ou rule = 3. Le problème était que lorsque de nouvelles règles de fin étaient ajoutées à la version de développement (il y en a maintenant 3 et une 4ème sera ajoutée avant sa sortie) ayant un argument séparé pour chacune d'elles encombre l'interface utilisateur. En outre rule est plus compatible avec approx dans le noyau de R. En fait, rule=1 et rule=2 auront la même signification en rollapply et en approx (du noyau de R) pour une meilleure cohérence et facilité d'utilisation. Les parenthèses autour de mean dans l'exemple ci-dessous sont actuellement requises dans la version de développement pour l'empêcher d'appeler rollmean, où rule="partial" n'a pas encore été implémenté, mais le besoin de le faire sera éliminé au moment de sa sortie officielle.

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

Mais pourquoi la sortie de rollmean est toujours un élément plus court que le débit? – rsk82

2

Vous pouvez essayer kernel avec kernapply (il y a quelques exemples vers la fin de la première page).

5

Regardez la fonction filter(), et en particulier l'argument 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.