我的时间序列具有以下模式,我想知道是否有人可以分享一个聪明的技巧来删除前导零。我之所以要避免,是因为它可能会对预测模型的选择产生负面影响。
时间序列示例:
TimeSeries <- ts(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 9, 10, 10, 16, 7, 13, 0, 9, 1,
11, 2, 11, 3, 11, 4, 1, 20, 13, 18, 19, 16, 16, 16,
15, 14, 27, 24, 35, 8, 18, 21, 20, 19, 22, 18, 21
),start=c(2001,6),frequency=12)
我可以想象一个过程,通过对时间序列的子集执行多次测试来缩小前导零序列的范围,然后删除仅包含零的前导子集。然而,这将是一个繁琐的过程,在计算方面可能效率低下。
有人知道现有的功能或程序可以有效地做到这一点吗?
这仅删除前导零并保留其他零:
TimeSeries[cumsum(TimeSeries)!=0]
#[1] 9 10 10 16 7 13 0 9 1 11 2 11 3 11 4 1 20 13 18 19 16 16 16 15 14 27 24 35 8 18 21 20 19 22 18 21
为什么会这样?
cumsum
的输出是:
cumsum(TimeSeries)
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 19 29 45 52 65 65 74 75
[33] 86 88 99 102 113 117 118 138 151 169 188 204 220 236 251 265 292 316 351 359 377 398 418 418 437 459 477 498
因此,只有在只有零的情况下,结果才等于零。如果时间序列中间某个地方有零,则累积和不会改变,但也不会为零。
如果时间序列中有负值,您可以使用:
TimeSeries[cumsum(abs(TimeSeries))!=0]
TimeSeries[TimeSeries != 0]
...对我有用,但可能是更好的方法:
> TimeSeries <- ts(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 9, 10, 10, 16, 7, 13, 0, 9, 1,
11, 2, 11, 3, 11, 4, 1, 20, 13, 18, 19, 16, 16, 16,
15, 14, 27, 24, 35, 8, 18, 21, 20, 19, 22, 18, 21
),start=c(2001,6),frequency=12)
> TimeSeries[TimeSeries != 0]
[1] 9 10 10 16 7 13 9 1 11 2 11 3 11 4 1 20 13 18 19 16 16 16 15 14 27
[26] 24 35 8 18 21 20 19 22 18 21
>
希望有帮助!
一个简单的解决方案也是:
yourts <- c(0,1,1,0,1,2,3)
yourts_wo_zeros <- yourts[which.max(yourts != 0):length(yourts)]
因为
which.max
取第一个最大值,在本例中为 False, True, True, ...
我认为它的计算效率应该比 cumsum 稍高一些,因为它避免了可能的大数字