【发布时间】:2013-04-04 07:56:43
【问题描述】:
有没有办法使用 rollapply(来自zoo 包或类似的东西)优化函数(rollmean、rollmedian 等)来计算具有基于时间的窗口的滚动函数,而不是基于数字的滚动函数观察?我想要的很简单:对于不规则时间序列中的每个元素,我想计算一个具有 N 天窗口的滚动函数。也就是说,该窗口应包括当前观察前 N 天之前的所有观察。时间序列也可能包含重复项。
下面是一个例子。给定以下时间序列:
date value
1/11/2011 5
1/11/2011 4
1/11/2011 2
8/11/2011 1
13/11/2011 0
14/11/2011 0
15/11/2011 0
18/11/2011 1
21/11/2011 4
5/12/2011 3
具有 5 天窗口的滚动中位数,向右对齐,应进行以下计算:
> c(
median(c(5)),
median(c(5,4)),
median(c(5,4,2)),
median(c(1)),
median(c(1,0)),
median(c(0,0)),
median(c(0,0,0)),
median(c(0,0,0,1)),
median(c(1,4)),
median(c(3))
)
[1] 5.0 4.5 4.0 1.0 0.5 0.0 0.0 0.0 2.5 3.0
我已经找到了一些解决方案,但它们通常很棘手,这通常意味着缓慢。我设法实现了自己的滚动函数计算。问题在于,对于很长的时间序列,中值(rollmedian)的优化版本会产生巨大的时间差异,因为它考虑了窗口之间的重叠。我想避免重新实现它。我怀疑rollapply参数有一些技巧可以使它起作用,但我无法弄清楚。提前感谢您的帮助。
【问题讨论】:
-
rollapply无法做到这一点。您可以使用window滚动您自己的函数(双关语)。 -
这个问答有什么帮助吗? stackoverflow.com/questions/10465998/…
-
rollapply“作弊”,如果您使用median作为乐趣,请致电rollmedian。比较:system.time(rollapply(runif(100000), 5, function(x) median(x)))与system.time(rollapply(runif(100000), 5, median))(前者慢 30 倍)。如果您想要与rollapply在没有“作弊”的情况下达到的速度相当的速度,我可以提供一些解决方案。此外,rollmedian还“作弊”,因为它需要奇怪的观察,所以很明显它只是定义了一个“中间”值的索引,与您尝试做的相比,这是微不足道的。 -
查看这个答案 (stackoverflow.com/questions/20134823/…) 以了解具有基于时间的窗口的快速 Rcpp rollmean 函数。
-
是否可以通过填充 NA 来使时间序列有规律,然后对其应用固定大小的滚动窗口?
标签: r time-series zoo