numpy和statsmodels计算相关性时结果不同,如何解读?

7 投票
1 回答
3613 浏览
提问于 2025-04-18 12:23

我找不到为什么用 numpy.correlate 计算两个序列 A 和 B 的相关性时,得到的结果和用 statsmodels.tsa.stattools.ccf 得到的结果不一样的原因。

这里有一个我提到的差异的例子:

import numpy as np
from matplotlib import pyplot as plt
from statsmodels.tsa.stattools import ccf

#Calculate correlation using numpy.correlate
def corr(x,y):
    result = numpy.correlate(x, y, mode='full')
    return result[result.size/2:]

#This are the data series I want to analyze
A = np.array([np.absolute(x) for x in np.arange(-1,1.1,0.1)])
B = np.array([x for x in np.arange(-1,1.1,0.1)])

#Using numpy i get this
plt.plot(corr(B,A))

在这里输入图片描述

#Using statsmodels i get this
plt.plot(ccf(B,A,unbiased=False))

在这里输入图片描述

结果看起来 qualitatively(性质上)不同,这种差异是从哪里来的呢?

1 个回答

10

statsmodels.tsa.stattools.ccf 是基于 np.correlate 的,但它做了一些额外的处理,使得计算出来的相关性更符合统计学的定义,而不是信号处理的定义。想了解更多,可以看看维基百科上的 交叉相关。具体的实现细节可以在 源代码 中查看,内容非常简单。

为了方便参考,我把相关的代码行复制在下面:

def ccovf(x, y, unbiased=True, demean=True):
    n = len(x)
    if demean:
        xo = x - x.mean()
        yo = y - y.mean()
    else:
        xo = x
        yo = y
    if unbiased:
        xi = np.ones(n)
        d = np.correlate(xi, xi, 'full')
    else:
        d = n
    return (np.correlate(xo, yo, 'full') / d)[n - 1:]

def ccf(x, y, unbiased=True):
    cvf = ccovf(x, y, unbiased=unbiased, demean=True)
    return cvf / (np.std(x) * np.std(y))

撰写回答