删除R中时间序列中的前导零点

问题描述:

我有以下模式的时间序列,我想知道是否有人可以分享智能技巧来删除前导零。我想避免的原因是它可能对选择预测模型有负面影响。删除R中时间序列中的前导零点

实施例的时间序列:

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 

因此,仅在那里只有零的结果是等于零的情况。如果时间序列中途某处出现零点,cumsum不会改变,但不会为零。

如果在时间序列负值你可以使用:

TimeSeries[cumsum(abs(TimeSeries))!=0] 
+1

请注意,如果TimeSeries处于非负数范围内,则此功能才可用(可靠)。如果'TimeSeries shadow

+0

@shadow看我的编辑。 – Roland

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 
> 

希望帮助!

+0

这将删除所有'zeros'时间序列。因此,如果说前一个位置包含零,则此代码也会将其删除。所以它不是严格的关注去除前导零,而是去除所有的零。 – Jochem

+0

你的例子。只有前导零,但我同意@罗兰的解决方案更好,即使没有解释给出 – hd1

+0

的确如此。我已经为@罗兰的解决方案添加了解释。一旦我看到他的代码,它很容易理解。 – Jochem