Что является «правым» по сравнению с «левым» скользящим средним в R? - PullRequest
0 голосов
/ 01 мая 2018

Если я хочу вычислить предыдущие n средние годы с отставанием текущего года, как бы мне этого добиться? Это так же просто, как «правильное» скользящее среднее окно? Или это «левое» скользящее среднее окно? Я не уверен, какое окно использовать здесь.

Пример данных

set.seed(1234)
dat <- data.frame(year = c(1990:2010), 
                  x = rnorm(21))
dat$x_lag1 <- lag(dat$x, 1)

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Может быть проще думать о смещениях. Если вы хотите окно 3, тогда

  • align = "right" соответствует использованию окна на основе смещений -2, -1, 0, то есть точки перед предыдущей, предыдущей и текущей точкой. Текущая точка - самый правый конец окна. Обратите внимание, что rollapplyr с r на конце - это то же самое, что и указание align = "right"
  • align = "center" соответствует использованию окна на основе смещений -1, 0, 1, то есть текущей точки предыдущей точки и следующей точки. Текущей точкой является центр окна.
  • align = "left" соответствует использованию окна на основе смещений 0, 1, 2, то есть текущей точки, следующей точки и точки после этого. Текущая точка является самой левой точкой окна.

rollapply позволяет использовать спецификацию align= или обозначение смещения. Чтобы использовать последнее для width, укажите список, содержащий один вектор, определяющий смещения.

конец окна в текущей точке

Ниже мы используем align=, чтобы взять среднее значение окна 3, оканчивающегося в текущей точке, а также использовать смещения в качестве альтернативы. Мы показываем как фреймы данных, так и объекты зоопарка.

Мы опустили fill=NA для объектов зоопарка, поскольку они автоматически выровняются в любом случае, поэтому обычно его не нужно использовать.

library(zoo)

transform(dat, roll = rollapplyr(x, 3, mean, fill = NA))

transform(dat, roll = rollapply(x, list(seq(-2, 0)), mean, fill = NA))

z <- read.zoo(dat, FUN = identity)
rollapplyr(z, 3, mean)

rollmeanr(z, 3)

rollapply(z, list(seq(-2, 0)), mean) # z from above

конец окна в предыдущей точке

Если вы хотите 3 предыдущих точки, то есть смещения -3, -2, -1, то есть не текущую точку, а 3 предшествующие точки, тогда будет работать следующее. Обратите внимание, что lag в последней строке требует временных рядов и не должен использоваться с простыми векторами.

transform(dat, roll = rollapply(x, list(-seq(3)), mean, fill = NA))

rollapply(z, list(-seq(3)), mean) # z from above

lag(rollapplyr(z, 3, mean), -1)

lag(rollmeanr(z, 3), -1)
0 голосов
/ 01 мая 2018

Если коротко, align = "right" - это ответ. align указывает, будет ли индекс результата выровнен left/center/right по сравнению со скользящим окном наблюдений. Если width=3, align="right", то два наблюдения слева передаются вместе с текущим наблюдением для FUN вычисления значения по индексу текущего наблюдения.

Можно использовать lag скользящего (align = "right") среднего, чтобы получить mean для предыдущих n наблюдений, исключая текущее наблюдение. Приведенный ниже ответ основан на zoo::rollapply и рассчитывает mean для предыдущих 5 лет.

set.seed(1)
dat <- data.frame(year = c(1990:2010), 
                  x = rnorm(21))

library(dplyr)
library(zoo)
#Mean for previous 5 years can be calculated as:

dat$meanx <- lag(rollapply(dat$x, 5, mean, align = "right", fill=NA))

#Test result
dat[1:10,]
# year          x      meanx
# 1  1990 -0.6264538         NA
# 2  1991  0.1836433         NA
# 3  1992 -0.8356286         NA
# 4  1993  1.5952808         NA
# 5  1994  0.3295078         NA
# 6  1995 -0.8204684 0.12926990
# 7  1996  0.4874291 0.09046698
# 8  1997  0.7383247 0.15122413
# 9  1998  0.5757814 0.46601479
# 10 1999 -0.3053884 0.26211490
# so on
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...