Расчет скользящей средней в R - PullRequest
0 голосов
/ 06 октября 2019

Я пытался вычислить скользящее среднее по вектору в R. В идеале я хотел бы написать функцию, которая вычисляет MA по любому количеству лагов. Математические шаги, которые я должен написать: 1. Создание набора данных с лагом 1: k для каждого столбца. 2. Суммирование по строке 3. деление на 2k + 1

Я застрял на шаге 2 прямо сейчас. Я могу оценить сумму, скажем, для 2 лагов, но создание формулы для нескольких лагов очень громоздко.

Вот где я сейчас.

Я использовал код для вычисления лагов

lagpad <- function(x, k) {
  if (k>0) {
    return (c(rep(NA, k), x)[1 : length(x)] );
  }
  else {
    return (c(x[(-k+1) : length(x)], rep(NA, -k)));
  }
}

Предположим, я вычисляю MA по следующему вектору:

i<-1:50
rowSums(cbind(lagpad(i,1)[1:length(i)], lagpad(i,2)[1:length(i)]))

Это прекрасно работает для 2. Но еслиЯ хочу рассчитать MA для 20 лагов, мне придется привязать 20 столбцов. Есть ли более быстрый способ сделать это / написать эту функцию?

Спасибо

1 Ответ

2 голосов
/ 06 октября 2019

Вот простая функция, использующая различия совокупных сумм ...

x <- 1:10

mav <- function(x, k){
  y <- c(0, cumsum(x))    #cumulative sums of x
  z <- y[-c(1:k)]         #discard first k values
  length(y) <- length(z)  #discard last k values of y
  return((z - y) / k)
}

mav(x,2)
[1] 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5

mav(x,1)
[1]  1  2  3  4  5  6  7  8  9 10

mav(x,4)
[1] 2.5 3.5 4.5 5.5 6.5 7.5 8.5
...