Скользящее среднее из трех предыдущих значений в R

В пакете зоопарка есть функция rollmean, которая позволяет создавать скользящие средние. rollmean(x,3) примет предыдущее, текущее и следующее значение (т.е. 4, 6 и 2) в таблице ниже. Это показано во втором столбце.

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 значения в четвертом ряду. Это отображается в третьем столбце. Кто-нибудь может сказать мне название функции, которая поможет достичь этого?

3 ответа

Решение

Я изо всех сил пытался найти простую функцию для скользящих средних, которая имела бы некоторую гибкость, чтобы делать то, что мне нужно. Наконец, я написал пару функций, расширяющих функцию, основанную на функции фильтра, которую Ринни дает выше в комментарии (но которая сама по себе не будет работать, поскольку она будет включать текущее наблюдение в среднем за 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. Функция скользящего среднего, обращенная назад, без учета текущих значений, основанная на показаниях [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)
    }
    

Ты можешь использовать 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)

Более простая реализация функции mavback w_i_l_l на основе его функции mav

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

Другие вопросы по тегам