r - 检测显着的趋势变化
问题描述
我想使用 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")
解决方案
比较前向和后向有限差分,过滤掉小的值。
明确地:计算 Δ( t ) = x ( t +1)- x ( t ) 和 ∇( t ) = x ( t )- x ( t-1 ),然后 d( t ) = Δ( t )-∇( t )= x ( t +1)- x ( t -1),并保持t为 d ( 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)。
推荐阅读
- excel - 将当前 ID 字段访问到 Excel 单元格
- javascript - 向 React Draft Wysiwyg 添加水平规则按钮
- android - 在 Android 上使用带有日期选择器对话框的 EditText
- python - 如何解压内部包含 tar.gz 文件的 tar 文件目录?
- mysql - 带有自定义函数的 MYSQL SELECT
- android - 使用自定义路径播放列表视图音频
- node.js - 在 Jenkins 上运行时 cucumber-js 解析错误
- ballerina - 如何使用 Ballerina 创建 .txt 文件?
- spring - SpringBoot SAML SP Shibboleth IDP
- php - 如何让 Mysqlnd_ms 在不同的实例上运行每个查询