Как вычислить автокорреляцию со значениями Nan - PullRequest
0 голосов
/ 10 февраля 2020

Я хотел бы вычислить автокорреляцию оценка в python. Если массив не имеет значений NAN, автокорреляция может быть вычислена явно с помощью

def autocorr_naive(x):
    N = len(x)
    return np.array([np.mean(x[iSh:] * x[:N-iSh]) for iSh in range(N)])

или с помощью функции numpy correlate

def autocorr_numpy(x):
    N = len(x)
    return np.correlate(x, x, 'full')[N-1:] / N

Функция numpy значительно быстрее, чем рукописный, предположительно потому, что он использует теорему Винера-Хинчина или аналогичную для эффективной аппроксимации корреляции.

Проблема заключается в том, что numpy. коррелят в настоящее время, по-видимому, не обрабатывает корреляции , если в перекрытии присутствуют значения NAN. Наивное расширение для обработки значений NAN просто игнорирует их при вычислении среднего значения

def autocorr_naive_nan(x):
    N = len(x)
    return np.array([np.nanmean(x[iSh:] * x[:N-iSh]) for iSh in range(N)])

Наивное расширение имеет две проблемы. Во-первых, он мучительно медленный по сравнению с реализацией numpy. Во-вторых, у него много нежелательных покачиваний на хвосте, где перекрытие состоит всего из нескольких точек, и оценка, естественно, плохая. Аппроксимация на основе БПФ, используемая в numpy, кажется, не смещена этими артефактами, по крайней мере, в той же степени.

Pragmati c Вопрос : Есть ли библиотека I можно использовать для вычисления эквивалента autocorr_naive_nan эффективным способом?

...