检测价值的剧烈变化

时间:2013-11-21 09:03:25

标签: r math statistics

我有一个时间序列,我想找到,如果价值变化剧烈。例如,我有一个时间序列:

1,3,5,2,4,3,2,5,6,1,3,2,4,10,15,20,24,34,40

在此示例中值为10时,时间序列开始急剧变化。我怎样才能发现这种变化?

我所做的是将当前值与过去的第三个值进行比较,如果变化超过五个,那么集合中会发生剧烈变化,但我认为没有最好的方法。

你知道这可能是一个更好的工作方式吗?

修改

我有一个时间序列,我想注意斜率(在此图像中)是否开始快速上升

enter image description here

1 个答案:

答案 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