Domanda

Qual è il modo più efficace per creare una somma media mobile o rotolare in R? Come si fa a fare la funzione di laminazione lungo con un "gruppo da"?

È stato utile?

Soluzione

Mentre zoo è grande, a volte ci sono modi più semplici. Se voi i dati si comporta bene, e è distanziato in modo uniforme, la funzione embed () consente di creare in modo efficace la versione più ritardato di una serie storica. Se si guarda dentro il pacchetto VARS per il vettore di auto-regressione, si vedrà che il pacchetto autore sceglie questo percorso.

Ad esempio, per calcolare la media mobile 3 periodo di x, dove 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

Altri suggerimenti

ho graffiato una buona risposta da Achim Zeileis sopra nella lista r. Ecco cosa ha detto:

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 ha continuato a dire:

 Si noti, che la differenza tra è rotolamento medio e la serie aggregati è dovuta a diversi allineamenti. Questo può essere modificato cambiando il 'allineamento' argomento nella rollmean() o funzione nextfri() nell'aggregato chiamata.

Tutto questo è venuto da Achim, non da me: http://tolstoy.newcastle.edu.au/R/ aiutare / 05/06 / 6785.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top