'right' 与 R 中的 'left' 滚动平均值是哪个?

Which is 'right' versus 'left' rolling mean in R?

如果我想计算前 n 年的平均年份,但要滞后于当年,我将如何实现?它像 "right" 滚动平均值 window 一样简单吗?还是 "left" 滚动平均值 window?我不确定在这里使用哪个 window。

示例数据

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

总之使用align = "right"就是答案。 align 指定与滚动 window 观察值相比,结果索引是否 left/center/right 对齐。如果 width=3, align="right" 则左侧的两个观察值与当前观察值一起传递到 FUN 计算当前观察值索引处的值。

可以使用 lag of rolling(align = "right") 表示得到 mean 之前的 n 观察值,不包括当前观察值。以下答案基于 zoo::rollapply 并计算出 mean5 年。

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

从偏移量的角度考虑可能更容易。如果你想要 window 的 3 那么

  • align = "right" 对应于使用基于 -2、-1、0 偏移量的 window,即先前点、先前点和当前点之前的点。当前点是window的最右端。请注意,rollapplyr 末尾带有 r 与指定 align = "right"
  • 相同
  • align = "center"对应使用一个window基于-1,0,1的偏移量,即前一点当前点和下一点。当前点是window的中心。这是 align= 的默认值。
  • align = "left" 对应于使用基于偏移量 0、1、2 的 window,即当前点、下一个点和之后的点。当前点是window.
  • 最左边的点

rollapply 允许使用 align= 规范或偏移符号。要将后者用于 width,请指定一个包含定义偏移量的单个向量的列表。 (宽度的实际规范是指定一个宽度向量,一个用于输入的每个元素或一个偏移向量列表;但是,在这两种情况下,它们都是循环使用的,因此通常情况下指定单个标量宽度或包含一个单个偏移向量是特殊情况。)

window 在当前点结束

下面我们使用 align= 取以当前点结束的 3 的 window 的平均值,并且还使用偏移量作为替代。我们同时显示数据框和动物园对象。

我们省略了动物园对象的 fill=NA,因为它们无论如何都会自动对齐,因此通常不需要使用它。

library(zoo)

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

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

all.equal(r1, r2)
## [1] TRUE

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

r4 <- rollmeanr(z, 3)

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

all.equal(r3, r4, r5)
## [1] TRUE

window 以前一点结束

如果你想要 3 个先前的点,即偏移量 -3、-2、-1,即不是当前点而是之前的 3 个点,那么下面的方法就可以了。请注意,最后一行中的 lag 需要时间序列,不应与普通向量一起使用。

# r6 is data frame
r6 <- transform(dat, roll = rollapply(x, list(-seq(3)), mean, fill = NA))

# r7, r8, r9 are zoo objects

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

r8 <- stats::lag(rollapplyr(z, 3, mean), -1)

r9 <- stats::lag(rollmeanr(z, 3), -1)

all.equal(r7, r8, r9)
## [1] TRUE