我有一个时间序列,我想找到,如果价值变化剧烈。例如,我有一个时间序列:
1,3,5,2,4,3,2,5,6,1,3,2,4,10,15,20,24,34,40
在此示例中值为10时,时间序列开始急剧变化。我怎样才能发现这种变化?
我所做的是将当前值与过去的第三个值进行比较,如果变化超过五个,那么集合中会发生剧烈变化,但我认为没有最好的方法。
你知道这可能是一个更好的工作方式吗?
修改
我有一个时间序列,我想注意斜率(在此图像中)是否开始快速上升
答案 0 :(得分:1)
ts <- c(1,3,5,2,4,3,2,5,6,1,3,2,4,10,15,20,24,34,40)
#shows elements where difference between x and x + lagth element is greater than 10
diffts <- diff(ts)
rollingwindow <- 5
# option 1
avgslope1 <- vector(mode = "numeric", length = (length(ts)-rollingwindow))
for ( i in 1 : (length(ts)-rollingwindow))
{
avgslope1[i] <- round(mean(ts[i:(i+rollingwindow)]),2)
}
#option 2
avgslope2 <- vector(mode = "numeric", length = (length(ts)-rollingwindow))
for ( i in 1 : (length(diffts)-rollingwindow))
{
avgslope2[i] <- round(mean(diffts[i:(i+rollingwindow)]),2)
}
avgslope1
是5个值的滚动平均值。如果您运行ts[1 + which.max(diff(avgslope1))]
,您将获得接下来五个值的平均值变化最大的值。类似地,ts[1 + which.max(diff(avgslope2))]
返回元素,在该元素中,平均值的变化在接下来的5个元素中最高。
> avgslope1
[1] 3.00 3.17 3.50 3.67 3.50 3.33 3.17 3.50 4.33 5.83 9.00 12.50 17.83 23.83
> avgslope2
[1] 0.17 0.33 0.17 -0.17 -0.17 -0.17 0.33 0.83 1.50 3.17 3.50 5.33 6.00 0.00
> ts
[1] 1 3 5 2 4 3 2 5 6 1 3 2 4 10 15 20 24 34 40