2013-04-24 7 views
6

W pakiecie zoo znajduje się funkcja zwana rollmean, która umożliwia tworzenie średnich ruchomych. rollmean(x,3) przyjmie poprzednią, bieżącą i następną wartość (tj. 4, 6 i 2) w poniższej tabeli. Jest to pokazane w drugiej kolumnie.Średnia ruchoma z poprzednich trzech wartości w 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 

Chciałbym wykonać to samo zadanie, ale przez uśrednienie poprzednich 3 wartości w czwartym rzędzie. To jest wyświetlane w trzeciej kolumnie. Czy ktoś może mi powiedzieć nazwę funkcji, która pomoże to osiągnąć?

+2

Można użyć 'filtr (x, Rep (1/3,3), boki = 1)' – rinni

Odpowiedz

2

Walczyłem szukając prostej funkcji dla średnich, które miały pewną elastyczność, aby zrobić to, co potrzebne w ruchu. W końcu napisałem kilka funkcji rozszerzających tę opartą na funkcji filtrującej, którą rinni podaje powyżej w komentarzu (ale która sama nie zadziała, ponieważ będzie zawierała bieżącą obserwację w średniej z 3 okresów).

  1. średnia ruchoma funkcję, która obejmuje bieżącą obserwację

    mav <- function(x,n){filter(x,rep(1/n,n), sides=1)} 
    
  2. średnia ruchoma funkcję, która nie zawiera aktualną obserwację

    mavback <- function(x,n){ 
        a<-mav(x,1) 
        b<-mav(x,(n+1)) 
        c<-(1/n)*((n+1)*b - a) 
        return(c) 
    } 
    
  3. do tyłu patrząc średnia ruchoma funkcję, nie włączając prąd obs, na podstawie [h2] odczytów rozpoczynających [h1] okresów wstecz

    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

Można użyć rollmean, ale ustaw align='right'. Lub możesz użyć domyślnego rollmeanr, który ma align='right'.

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

... ale nadal trzeba opóźnić wynik. Innym rozwiązaniem jest użycie rollapply z listy za width argumentu:

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

Implementacja prostsza funkcji mavback w_i_l_l w oparciu o jego Mav funkcji

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