代码之家  ›  专栏  ›  技术社区  ›  yatu Sayali Sonawane

非平稳时间序列的自相关

  •  1
  • yatu Sayali Sonawane  · 技术社区  · 6 年前

    我在python中实现了一个函数来计算特定滞后k下时间序列的自相关,它是在假设某些时间序列可能不是平稳的情况下实现的。 然而,我发现对于其中一些,我得到的值大于1,特别是在最后的滞后。所以我想我一定是算错了。

    我正在实施以下措施:

    enter image description here

    其中,对于与滞后序列相对应的项,我计算的是从滞后k开始的平均值和标准偏差。

    def custom_autocorrelation(x, lag = 12):
        n = len(x)
        std = x.std()
        mu = x.mean() 
        autocov = 0
        mu_lag = x[lag:].mean() 
        std_lag = x[lag:].std() 
        for j in range(n-lag):
            autocov += (x[j] - mu)*(x[j+lag] - mu_lag)
        autocorr = autocov/(std*std_lag*(n-lag))
        return autocorr
    

    作为一个例子,我试着用下面的序列,对于k=12,系数为1.03:

    np.array([20623., 11041.,  5686.,  2167.,  2375.,  2057.,  3141.,   504.,
             152.,  6562.,  8199., 15103., 16632.,  7190.,  6987.,  2652.,
            1949.,  2223.,  1703.,  2163.,  1850.,  6932.,  5932., 13124.,
           14846.,  7850.,  4526.,  1277.,  1036.,  1500.,  1648.,  1384.,
            1446.,  3477.,  6818., 12446.,  9734.])
    

    1 回复  |  直到 6 年前
        1
  •  2
  •   Alexander McFarlane    6 年前

    我想你只是把等式写错了。以下部分

    std = x.std()
    mu = x.mean() 
    

    std = x[: n - lag].std()
    mu = x[: n - lag].mean() 
    

    解决这个问题

    In [221]: custom_autocorrelation(a, 12)
    Out[221]: 0.9569497673729846
    

    我也从一个 previous answer 大大加快了计算速度

    def modified_acorr(ts, lag):
        """An autocorrelation estimation as per
        http://itfeature.com/time-series-analysis-and-forecasting/autocorrelation-time-series-data
    
        Args:
            ts (np.ndarray): series
            lag (int): the lag
    
        Returns:
            float: The autocorrelation
        """
        return (
            (ts[:ts.size - lag] - ts[:ts.size - lag].mean()) *
            (ts[lag:] - ts[lag:].mean())
        ).ravel().mean() / (ts[lag:].std() * ts[:ts.size - lag].std())
    

    比较正则自相关函数,我们得到相似的答案

    In [197]: modified_acorr(a, 12)
    Out[197]: 0.9569497673729849
    
    In [218]: acorr(a, a.mean(), 12) / acorr(a, a.mean(), 0)  # normalisation
    Out[218]: 0.9201920561073853