如果我想以n
当前年份的滞后计算以前的平均年份,我将如何实现?它像“正确的”滚动平均窗口一样简单吗?或者它是一个“左”滚动平均窗口?我不确定在这里使用哪个窗口。
样本数据
set.seed(1234)
dat <- data.frame(year = c(1990:2010),
x = rnorm(21))
dat$x_lag1 <- lag(dat$x, 1)
如果我想以n
当前年份的滞后计算以前的平均年份,我将如何实现?它像“正确的”滚动平均窗口一样简单吗?或者它是一个“左”滚动平均窗口?我不确定在这里使用哪个窗口。
样本数据
set.seed(1234)
dat <- data.frame(year = c(1990:2010),
x = rnorm(21))
dat$x_lag1 <- lag(dat$x, 1)
从偏移量的角度考虑可能更容易。如果你想要一个 3 的窗口,那么
align = "right"
对应于使用基于-2、-1、0的偏移量的窗口,即前一个点之前、前一个点和当前点之前的点。当前点是窗口的最右端。请注意,末尾rollapplyr
带有 a与指定相同r
align = "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
总之使用align = "right"
就是答案。align
指定结果索引是否与left/center/right
观察的滚动窗口对齐。如果width=3, align="right"
然后从左侧开始的两个观测值与当前观测值一起传递,以FUN
计算当前观测值索引处的值。
可以使用lag
rolling( 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