Скользящее среднее из трех предыдущих значений в 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 периода).
Функция скользящего среднего, включающая текущее наблюдение
mav <- function(x,n){filter(x,rep(1/n,n), sides=1)}
Функция скользящего среднего, которая не включает текущее наблюдение
mavback <- function(x,n){ a<-mav(x,1) b<-mav(x,(n+1)) c<-(1/n)*((n+1)*b - a) return(c) }
Функция скользящего среднего, обращенная назад, без учета текущих значений, основанная на показаниях [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) }