Python 中滞后时间序列的自相关问题

问题描述 投票:0回答:2

我正在尝试对一些数据进行滞后自相关。数据中充满了随机的 nan。数据是一个 NxN 数组,其中 eke_array[i,i] 滞后为零,...eke_array[i,i+n] 滞后 n。在某些时候,这开始返回大于 1 的自相关,特别是在滞后 40 之后,但前几个滞后给出了合理的相关性。

这是我实现的功能:

def auto_corr(eke_array):

    nlag = np.shape(eke_array)[0]
    eke_lag_0 = []
    auto_store = []
    std_store = []
    for mylag in range(0,80):
        autocorr = 0
        numvalid = 0
        norm = 0
        std = 0
        for i in range(0, 105):
            if i+mylag > 104:
                break
            lag0 = eke_array[i,i]
            lag_itt = eke_array[i,i+mylag]
            if not np.isnan(lag_itt):
                if not np.isnan(lag0):
                    numvalid += 1

                    diff = lag0 - lag_itt
                    std = std + diff**2
                    autocorr = autocorr + lag0*lag_itt
        print(numvalid, mylag,i )
        auto_store.append((autocorr/numvalid))
        std_store.append(std / numvalid)

    for k in range(105):
        eke_lag_0.append(eke_array[k,k])
    eke_lag_0 = np.asarray(eke_lag_0)
    eke_lag_0 = eke_lag_0[~np.isnan(eke_lag_0)]
    norm = np.sum(eke_lag_0 ** 2) / np.size(eke_lag_0)

    std_store = np.sqrt(np.asarray(std_store))
    auto_store = auto_store/norm
    return std_store, auto_store, norm
python nan autocorrelation
2个回答
0
投票

我以错误的方式正常化。这是互相关,因此归一化是两个滞后时间序列的标准差。


0
投票

正确标准化自相关函数至关重要。

试试这个:

import numpy as np

def auto_corr(eke_array):
    nlag = np.shape(eke_array)[0]
    auto_store = []
    std_store = []

    for mylag in range(0, nlag):
        autocorr = 0
        numvalid = 0
        std = 0
        for i in range(0, nlag - mylag):
            lag0 = eke_array[i, i]
            lag_itt = eke_array[i, i + mylag]
            if not np.isnan(lag_itt) and not np.isnan(lag0):
                numvalid += 1
                autocorr += lag0 * lag_itt
                std += (lag0 - lag_itt) ** 2

        auto_store.append(autocorr / numvalid if numvalid != 0 else np.nan)
        std_store.append(np.sqrt(std / numvalid) if numvalid != 0 else np.nan)

    eke_diag = np.diag(eke_array)
    eke_diag = eke_diag[~np.isnan(eke_diag)]
    norm = np.sum(eke_diag ** 2) / len(eke_diag)

    std_store = np.array(std_store)
    auto_store = np.array(auto_store) / norm

    return std_store, auto_store, norm
© www.soinside.com 2019 - 2024. All rights reserved.