2013-04-24 7 views
6

В пакете zoo есть функция rollmean, которая позволяет вам делать скользящие средние. rollmean(x,3) примет предыдущее, текущее и следующее значение (т.е. 4, 6 и 2) в таблице ниже. Это показано во втором столбце.Скользящее среднее из предыдущих трех значений в 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 

Я хотел бы выполнить ту же работу, но усредняя предыдущие 3 значения в четвертой строке. Это отображается в третьем столбце. Может ли кто-нибудь сказать мне название функции, которая поможет это сделать?

+2

Вы можете использовать 'фильтр (х, респ (1/3,3), стороны = 1)' – rinni

ответ

2

Я изо всех сил искал простой функции для скользящих средних, которые имели некоторую гибкость, чтобы делать то, что мне было нужно. Я, наконец, написал пару функций, расширяющих один, основанный на функции фильтра, которую rinni дает выше в комментарии (но который сам по себе не будет работать, потому что он будет включать текущее наблюдение в среднем 3 периода).

  1. скользящих средней функции, которая включает в себя текущее наблюдение

    mav <- function(x,n){filter(x,rep(1/n,n), sides=1)} 
    
  2. скользящей средней функцию, которая не включает в себя текущее наблюдение

    mavback <- function(x,n){ 
        a<-mav(x,1) 
        b<-mav(x,(n+1)) 
        c<-(1/n)*((n+1)*b - a) 
        return(c) 
    } 
    
  3. обратного ищет скользящую среднюю функцию, не включая ток obs, основанный на [h2] показаниях, начиная с [h1] периодов назад

    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

Вы можете использовать rollmean, но установить align='right'. Или вы можете использовать rollmeanr, который по умолчанию имеет align='right'.

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

... но вам все же нужно будет отстать от результата. Другим решением является использование rollapply со списком для width аргумента:

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

Реализация функции проще mavback w_i_l_l, основанный на его MAV функции

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