具有不同移动窗口大小的后向移动平均线,以保持输出序列大小与 R 中的原始时间序列相同

问题描述

我有一个很长的时间序列变量。我想执行一个窗口大小为 20 的向后移动平均。如果我保持这个窗口大小,那么输出系列将缩短长度 20(我的意思是前 20 个值将是 NA)但我想要的是输出系列应该与非 NA 的原始系列具有相同的长度。为此,我想在开始时改变窗口大小,以便获得所需的输出。例如,对于原始时间序列中的前 20 个值,移动窗口大小可以分别为 1、2、3、....、20。然后我想之后保持20的窗口大小。如何做到这一点?

这是窗口大小为 3 的示例数据和所需的输出

Days    Original_Values    Desired_Output
 1           2                  2
 2           4                  2
 3           1                  3
 4           3                  7/3
 5           5                  8/3
 6           6                  9/3
 7           4                  14/3
 8           9                  15/3

解决方法

使用末尾注释中可重复显示的输入,使用 rollapplyr 指定偏移量 -1、-2、-3 并使用参数 partial=TRUE 使其使用少于指定的偏移量,如果只有更少的可用。由于没有先前的元素,因此无法计算第一个元素,因此指定使用 fill 参数填充第一个元素。

library(zoo)

DF2 <- transform(DF,roll = 
  rollapplyr(Original,list(-(1:3)),mean,partial = TRUE,fill = Original[1]))

with(DF2,identical(Desired,roll))  # check that result matches Desired
## [1] TRUE

注意

Lines <- "
 Days        Original           Desired
 1           2                  2
 2           4                  2
 3           1                  3
 4           3                  7/3
 5           5                  8/3
 6           6                  9/3
 7           4                  14/3
 8           9                  15/3"
DF <- read.table(text = Lines,header = TRUE)
DF <- transform(DF,Desired = sapply(Desired,function(x) eval(parse(text = x))))