我可能会误读其中一些,但我在处理不规则的时间序列时遇到了问题。例如,zoo
包中滚动均值的常用方法需要每个数据的唯一值。但在这种情况下,这不是滚动平均值,而是每时间单位平均值的滚动平均值 - 时间单位将减少数据点对平均值的影响比具有更多数据点的平均值更多。
在我看来,真正的移动平均线不需要使用聚合,而是使用每个计算点的分布。
鉴于我有以下数据框或不规则值,我怎样才能最好地为每个值创建移动平均度量。
df <- data.frame(year = c(rep(2000,3),rep(2001,1),rep(2004,4),rep(2005,3),+
rep(2006,3),rep(2007,1),rep(2008,2),rep(2009,6),rep(2010,8)),+
value1=rnorm(31), value2=rnorm(31), value3=rnorm(31))
我找到了一种简单的方法,可以通过子集化将其作为初始答案发布,但这种方法在有限的情况下有效,需要每次都进行自定义。我想知道什么是一般解决方案。此外,如果有人能够评论在滚动平均值计算中使用平均值与平均分布的平均值的做法,那将会更有帮助。谢谢!
答案 0 :(得分:1)
不规则时间序列在滑动或滚动窗口内的计算可以通过Nina Scholz的聚集非等额联接的能力来解决。
有许多类似的问题,例如data.table或r calculating rolling average with window based on value (not number of rows or date/time variable)。
但是,这个问题有所不同,因此值得自己回答。从Rolling regression on irregular time series可以得出结论,OP正在寻找居中的滚动窗口。此外,还要计算几列的滚动平均值。
library(data.table)
cols <- c("value2", "value3")
setDT(df)[SJ(year = (min(year) + 2):(max(year) - 2))[, c("start", "end") := .(year - 2, year + 2)],
on = .(year >= start, year < end),
c(.(year = i.year), lapply(.SD, mean)), .SDcols = cols, by = .EACHI][, -(1:2)]
year value2 value3 1: 2002 0.57494219 -0.53001134 2: 2003 0.33925292 0.75541896 3: 2004 -0.05834453 0.23987209 4: 2005 0.17031099 0.13074666 5: 2006 0.05272739 0.09297215 6: 2007 -0.12935805 -0.38780964 7: 2008 0.19716437 -0.11587017
结果与OP自己的结果rmeans
相同。
set.seed(123) # ensure reproducible sample data
df <- data.frame(
year = rep(2000:2010, c(3, 1, 0, 0, 4, 3, 3, 1, 2, 6, 8)),
value1 = rnorm(31), value2 = rnorm(31), value3 = rnorm(31))
答案 1 :(得分:0)
所以这是我提出的简单子集。如果有人发现自己发现了同样的问题,可能会有所帮助:
df <- data.frame(year = c(rep(2000,3),rep(2001,1),rep(2004,4),rep(2005,3), +
rep(2006,3),rep(2007,1),rep(2008,2),rep(2009,6),rep(2010,8)), +
value1=rnorm(31), value2=rnorm(31), value3=rnorm(31))
rmeans <- data.frame()
for (i in (min(df$year)+2):(max(df$year)-2)){
rmeans <- rbind(rmeans, data.frame(year=i,as.data.frame.list(colMeans(df +
[df$year>=(i-2)&df$year<(i+2),-c(1,2)]))))
}