Question

Quelle est la façon la plus efficace de créer une somme moyenne mobile ou de rouler en R? Comment faites-vous la fonction de roulement avec un « groupe par »?

Était-ce utile?

La solution

Alors que le zoo est grand, parfois il y a des moyens plus simples. Si vos données se comporte bien, et est régulièrement espacés, la fonction vous permet de créer efficacement Embed () versions multiples décalée d'une série chronologique. Si vous regardez à l'intérieur du paquet VARS pour l'auto-régression vectoriel, vous verrez que l'auteur du forfait choisit cette voie.

Par exemple, pour calculer la moyenne mobile de durée de 3 x, où x = (1 -> 20) ^ 2:

> x <- (1:20)^2
> embed (x, 3)
      [,1] [,2] [,3]
 [1,]    9    4    1
 [2,]   16    9    4
 [3,]   25   16    9
 [4,]   36   25   16
 [5,]   49   36   25
 [6,]   64   49   36
 [7,]   81   64   49
 [8,]  100   81   64
 [9,]  121  100   81
[10,]  144  121  100
[11,]  169  144  121
[12,]  196  169  144
[13,]  225  196  169
[14,]  256  225  196
[15,]  289  256  225
[16,]  324  289  256
[17,]  361  324  289
[18,]  400  361  324
> apply (embed (x, 3), 1, mean)
 [1]   4.666667   9.666667  16.666667  25.666667  36.666667  49.666667
 [7]  64.666667  81.666667 100.666667 121.666667 144.666667 169.666667
[13] 196.666667 225.666667 256.666667 289.666667 324.666667 361.666667

Autres conseils

Je gratté une bonne réponse de Achim Zeileis plus sur la liste de r. Voici ce qu'il a dit:

library(zoo)
## create data

x <- rnorm(365)
## transform to regular zoo series with "Date" index

x <- zooreg(x, start = as.Date("2004-01-01")) plot(x)

## add rolling/running/moving average with window size 7 

lines(rollmean(x, 7), col = 2, lwd = 2)

## if you don't want the rolling mean but rather a weekly ## time series of means you can do
nextfri <- function(x) 7 * ceiling(as.numeric(x - 1)/7) + as.Date(1) xw <- aggregate(x, nextfri, mean)

## nextfri is a function which computes for a certain "Date" ## the next friday. xw is then the weekly series. 

lines(xw, col = 4)

Achim a poursuivi en disant:

 Notez que la différence entre les deux est laminage moyenne et la série agrégée est due à différents alignements. Cette peut être modifiée en changeant la « alignement » argument en rollmean() ou la fonction nextfri() dans l'ensemble appel.

Tout cela est venu de Achim, pas de moi: http://tolstoy.newcastle.edu.au/R/ aider / 05/06 / 6785.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top