移动平均线,考虑了 NA 的价值和可用日期的差距

Moving average that takes into account NAs in value and gaps in available dates

我正在处理从 2008 年到 2015 年的时间序列,但我将注意力限制在每年的 3 月到 8 月。更复杂的是,一些值被标记为 NA。

这是 df 的子集(未按日期排序)的样子:

  Date       Value   Site
1 2008-08-20     NA  Kenya
2 2008-08-29 12.954  Kenya
3 2008-08-18 29.972  Kenya
4 2008-08-16  5.080  Kenya
5 2009-04-21  3.048  Kenya
6 2009-04-22 12.954  Kenya

可能是一个不重要的细节,因为子集化非常简单,但为了阐明 Site 列的目的,我会提到总共有五个站点具有相同跨度的时间序列数据.

我想添加一列 Value10 来给出 10 天移动平均线。我发现这可以使用 zooTTR 等几个软件包之一轻松完成,但我希望移动平均线对日期和地点敏感,以便它

问题中的数据是为刚果复制的,我们使用宽度 2 而不是 10,所以我们可以 运行 这没有所有 NA 的微不足道的结果:

# data for DF

Lines <- "  Date       Value   Site
2008-08-20     NA  Kenya
2008-08-29 12.954  Kenya
2008-08-18 29.972  Kenya
2008-08-16  5.080  Kenya
2009-04-21  3.048  Kenya
2009-04-22 12.954  Kenya
2008-08-20     NA  Congo
2008-08-29 12.954  Congo
2008-08-18 29.972  Congo
2008-08-16  5.080  Congo
2009-04-21  3.048  Congo
2009-04-22 12.954  Congo"

# set up DF, convert Date column to "Date" class

DF <- read.table(text = Lines, header = TRUE)
DF$Date <- as.Date(DF$Date)

对行进行排序并使用 ave 按站点和 year/month:

执行滚动平均值
# sort rows
o <- order(DF$Site, DF$Date)
DF <- DF[o, ]

# perform rolling mean 
library(zoo)
# w <- 10
w <- 2
roll <- function(x) rollapplyr(c(rep(NA, w-1), x), w, mean)
DF$mean <- ave(DF$Value, DF$Site, as.yearmon(DF$Date), FUN = roll)

这给出:

> DF
         Date  Value  Site   mean
10 2008-08-16  5.080 Congo     NA
9  2008-08-18 29.972 Congo 17.526
7  2008-08-20     NA Congo     NA
8  2008-08-29 12.954 Congo     NA
11 2009-04-21  3.048 Congo     NA
12 2009-04-22 12.954 Congo  8.001
4  2008-08-16  5.080 Kenya     NA
3  2008-08-18 29.972 Kenya 17.526
1  2008-08-20     NA Kenya     NA
2  2008-08-29 12.954 Kenya     NA
5  2009-04-21  3.048 Kenya     NA
6  2009-04-22 12.954 Kenya  8.001

更新 重新排列演示文稿并添加更改的 ave 行以使用 yearmon.