2013-04-24 13 views
6

Nel pacchetto zoo esiste una funzione denominata rollmean, che consente di calcolare le medie mobili. Lo rollmean(x,3) prenderà il valore precedente, attuale e successivo (ovvero 4, 6 e 2) nella tabella seguente. Questo è mostrato nella seconda colonna.Media mobile dei precedenti tre valori in R

x rollmean ma3 
4  
6 4.0 
2 4.3 
5 3.0   4.0 
2 6.3   4.3 
12 6.0   3.0 
4 6.0   6.3 
2    6.0 

Vorrei ottenere lo stesso lavoro, ma calcolando la media dei 3 valori precedenti nella quarta riga. Questo è visualizzato nella terza colonna. Qualcuno può dirmi il nome della funzione che aiuterà a realizzare questo?

+2

È possibile utilizzare 'filtro (x, rep (1/3,3), i lati = 1)' – rinni

risposta

2

ho lottato alla ricerca di una semplice funzione per le medie che hanno avuto una certa flessibilità per fare quello che mi serviva in movimento. Alla fine ho scritto un paio di funzioni estendendo quella basata sulla funzione filtro che rinni fornisce in precedenza nel commento (ma che di per sé non funzionerà perché includerà l'osservazione corrente nella media dei 3 periodi).

  1. Funzione commovente di media che comprende l'osservazione corrente

    mav <- function(x,n){filter(x,rep(1/n,n), sides=1)} 
    
  2. Funzione commovente di media che non include l'osservazione corrente

    mavback <- function(x,n){ 
        a<-mav(x,1) 
        b<-mav(x,(n+1)) 
        c<-(1/n)*((n+1)*b - a) 
        return(c) 
    } 
    
  3. all'indietro cercando in movimento funzione di media, non compresa la corrente obs, basato su [h2] letture che iniziano [h1] periodi indietro

    mavback1<-function(x,h1,h2){ 
        a<-mavback(x,h1) 
        b<-mavback(x,h1-h2) 
        c<-(1/h2)*(h1*a -(h1-h2)*b) 
        return(c) 
    } 
    
10

È possibile utilizzare rollmean, ma impostare align='right'. Oppure è possibile utilizzare rollmeanr, che ha come valore predefinito align='right'.

ma3 <- rollmeanr(x[,1],3,fill=NA) 

... ma sarà comunque necessario ritardare il risultato. Un'altra soluzione è quella di utilizzare rollapply con una lista per l'argomento width:

ma3 <- rollapplyr(x[,1],list(-(3:1)),mean,fill=NA) 
0

Un'implementazione più semplice della funzione mavback di w_i_l_l in base alla sua funzione di mav

mavback <- function(x,n){ filter(x, c(0, rep(1/n,n)), sides=1) }