移动平均线,考虑了 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 天移动平均线。我发现这可以使用 zoo
或 TTR
等几个软件包之一轻松完成,但我希望移动平均线对日期和地点敏感,以便它
- 如果前 10 个值中的任何一个生成 NA
,则生成当天的 NA
- 为前 10 个值在
Date
中包含跳跃的那一天生成一个 NA,例如从 2008 年 8 月到 2009 年 3 月。
- 对其作用的
Site
数据敏感
问题中的数据是为刚果复制的,我们使用宽度 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
.
我正在处理从 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 天移动平均线。我发现这可以使用 zoo
或 TTR
等几个软件包之一轻松完成,但我希望移动平均线对日期和地点敏感,以便它
- 如果前 10 个值中的任何一个生成 NA ,则生成当天的 NA
- 为前 10 个值在
Date
中包含跳跃的那一天生成一个 NA,例如从 2008 年 8 月到 2009 年 3 月。 - 对其作用的
Site
数据敏感
问题中的数据是为刚果复制的,我们使用宽度 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
.