首页 > 解决方案 > 检测显着的趋势变化

问题描述

我想使用 R 检测趋势曲线显着变化的日期。红点是我看到显着变化的时间点,应该检测到这些。小的波动应该被忽略。

趋势曲线

我已经尝试过breakpoints查找虚线所示日期的函数。我看不出这些线与数据有何关联。

图表中的示例数据:

structure(c(431.510725286867, 421.634186460535, 379.627938613016, 
425.906255600274, -14.1367284804303, -384.10599618701, -611.193815166686, 
-460.535003689942, -309.875390598749, -84.9820334889592, 217.330882967973, 
437.111949107673, 738.919896124628, 752.79552200685, 804.851028725362, 
757.869760812822, 1197.91301915761, 1567.88256933466, 1794.97067632374, 
1644.31215300884, 1493.6528224525, 1268.75973855711, 968.432034953716, 
743.503624686386, 510.63191994943), .Tsp = c(2016.66666666667, 
2018.66666666667, 12), class = "ts")

标签: rtime-seriesdata-analysis

解决方案


比较前向和后向有限差分,过滤掉小的值。

明确地:计算 Δ( t ) = x ( t +1)- x ( t ) 和 ∇( t ) = x ( t )- x ( t-1 ),然后 d( t ) = Δ( t )-∇( t )= x ( t +1)- x ( t -1),并保持td ( t )| > ε,其中 ε 捕获了所谓的小波动。

在您的情况下,d = c(NA, -32.1, 88.3, -486.3 , 70.1, 142.9, 377.7 , 0.0, 74.2, 77.4, -82.5, 82.0, -287.9 , 38.2, -99.0, 487.0 , -70.1, -142.9 , -377.7 , -0.0, -74.2, -75.4, 75.4, -7.9, NA)。对于 t=c(4, 7, 13, 16, 19),绝对值大于 ε=200,正好是你的 4 个红点。

当然,可以更严格地选择 ε=200 的阈值(在d的直方图上,200 的值在脸上跳跃)。

您可能还想通过取几个点的平均值而不是前一个值和下一个值来平滑波动:d n ( t ) = x ( t + n )+ ...+ x ( t + 1 )- x ( t -1)-...- x ( t -n)。


推荐阅读