4

如果我想以n当前年份的滞后计算以前的平均年份,我将如何实现?它像“正确的”滚动平均窗口一样简单吗?或者它是一个“左”滚动平均窗口?我不确定在这里使用哪个窗口。

样本数据

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

2 回答 2

7

从偏移量的角度考虑可能更容易。如果你想要一个 3 的窗口,那么

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

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

以当前点结束的窗口

下面我们使用align=以当前点结尾的 3 窗口的平均值,并使用偏移量作为替代方案。我们展示了数据框和动物园对象。

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

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

以前一点结束的窗口

如果您想要 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
于 2018-05-01T16:13:33.513 回答
3

总之使用align = "right"就是答案。align指定结果索引是否与left/center/right观察的滚动窗口对齐。如果width=3, align="right"然后从左侧开始的两个观测值与当前观测值一起传递,以FUN计算当前观测值索引处的值。

可以使用lagrolling( 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
于 2018-05-01T06:12:25.070 回答