【问题标题】:Autocorrelation for non-stationary time series非平稳时间序列的自相关
【发布时间】:2019-02-12 15:34:39
【问题描述】:

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

我正在执行以下操作:

                      

对于与滞后序列相对应的术语,我正在计算从滞后 k 开始的平均值和标准偏差。

我在 python 中实现了以下代码,它计算特定滞后 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.])

任何帮助将不胜感激!

【问题讨论】:

  • 嗨@AlexanderMcFarlane 抱歉,如果在某些方面似乎不太清楚。让我知道您对问题表述有什么疑问。
  • 我认为你的问题在于手段和标准开发:你有方程的来源吗?我怀疑您的问题是理论/概念问题,而不是编码
  • @AlexanderMcFarlane 是的,我也这么认为。我通过计算非归一化自相关(en.wikipedia.org/wiki/Autocorrelation#Signal_processing)与一些 python 库进行了比较,结果是相同的。所以肯定跟这个有关
  • 这似乎不是同一个方程式?

标签: python time-series


【解决方案1】:

我认为您只是错误地写下了方程式。以下部分

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

【讨论】:

  • 过会儿会好好研究一下,但快速看起来你是对的:)
  • 如果这是你要找的,那么你能接受我的回答吗,我会知道我的答案很适合你:)
  • 是的,就是这样!非常感谢@AlexanderMcFarlane
猜你喜欢
  • 2022-08-17
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 2015-09-09
  • 1970-01-01
相关资源
最近更新 更多