用numpy估计周期性的自相关

时间:2017-11-17 13:13:00

标签: python numpy time-series correlation

我有一大组时间序列(> 500),我想只选择那些是周期性的。我做了一些文献研究,发现我应该寻找自相关。使用numpy我将自相关计算为:

def autocorr(x):
    norm = x - np.mean(x)
    result = np.correlate(norm, norm, mode='full')
    acorr = result[result.size/2:]
    acorr /= ( x.var() * np.arange(x.size, 0, -1) )
    return acorr

这会返回一组系数(r?),当绘图应该告诉我时间序列是否是周期性的。

我制作了两个玩具示例:

#random signal
s1 = np.random.randint(5, size=80)
#periodic signal
s2 = np.array([5,2,3,1] * 20)

s1 s2

当我生成自相关图时,我得到:

Autocorr1 Autocorr2

第二个自相关向量清楚地表明了一些周期性:

Autocorr1 =  [1, 0.28, -0.06,  0.19, -0.22, -0.13,  0.07 ..]
Autocorr2 =  [1, -0.50, -0.49,  1, -0.50, -0.49,  1 ..]

我的问题是,如何从自相关向量中自动确定时间序列是否是周期性的?有没有办法将值汇总到一个系数,例如if = 1完美周期,if = 0根本没有周期性。我试图计算平均值,但没有意义。我应该看看1的数量?

1 个答案:

答案 0 :(得分:2)

我会使用mode ='same'而不是mode ='full',因为在mode ='full'时我们得到极端移位的协方差,其中只有1个数组元素与self重叠,其余为零。这些都不会有趣。在mode ='same'的情况下,移位阵列的至少一半与原始阵列重叠。

此外,要获得真实的相关系数(r),您需要除以重叠的大小,而不是原始x的大小。 (在我的代码中,这些是np.arange(n-1, n//2, -1))。然后每个输出将介于-1和1之间。

一眼Durbin–Watson statistic,类似于2(1-r),表明人们认为其低于1的值是自相关的重要指标,其对应于r> 1。 0.5。这就是我在下面使用的内容。关于自相关重要性的统计上合理的处理参考统计文献;一个起点是为你的时间序列建立一个模型。

def autocorr(x):
    n = x.size
    norm = (x - np.mean(x))
    result = np.correlate(norm, norm, mode='same')
    acorr = result[n//2 + 1:] / (x.var() * np.arange(n-1, n//2, -1))
    lag = np.abs(acorr).argmax() + 1
    r = acorr[lag-1]        
    if np.abs(r) > 0.5:
      print('Appears to be autocorrelated with r = {}, lag = {}'. format(r, lag))
    else: 
      print('Appears to be not autocorrelated')
    return r, lag

两个玩具示例的输出:

  

似乎不是自相关的   似乎与r = 1.0,lag = 4

自相关