如何在Python中获得R的ccf?

时间:2018-12-28 14:13:05

标签: python cross-correlation

我不是统计学家,我只是将一些R代码翻译成Python。

R:

a = 1:1000
b = 1000:1
ccf(a, b, max.lag=100, plot=FALSE)

Autocorrelations of series ‘X’, by lag

   -26    -25    -24    -23    -22    -21    -20    -19    -18    -17    -16
-0.922 -0.925 -0.928 -0.931 -0.934 -0.937 -0.940 -0.943 -0.946 -0.949 -0.952
   -15    -14    -13    -12    -11    -10     -9     -8     -7     -6     -5
-0.955 -0.958 -0.961 -0.964 -0.967 -0.970 -0.973 -0.976 -0.979 -0.982 -0.985
    -4     -3     -2     -1      0      1      2      3      4      5      6
-0.988 -0.991 -0.994 -0.997 -1.000 -0.997 -0.994 -0.991 -0.988 -0.985 -0.982
     7      8      9     10     11     12     13     14     15     16     17
-0.979 -0.976 -0.973 -0.970 -0.967 -0.964 -0.961 -0.958 -0.955 -0.952 -0.949
    18     19     20     21     22     23     24     25     26
-0.946 -0.943 -0.940 -0.937 -0.934 -0.931 -0.928 -0.925 -0.922

Python:

import scipy.signal as ss
import numpy as np

x = np.array(range(1, 1001))
y = np.array(range(1000, 0, -1))

ss.correlate(x, y)
# array([      1,       4,      10, ..., 2994001, 1998000, 1000000])
ss.correlate(x - np.mean(x), y - np.mean(y), method='direct')/(np.std(x)*np.std(y)*len(x))
# array([0.00299401, 0.00597602, 0.00894607, ..., 0.00894607, 0.00597602,
       0.00299401])

这些答案中没有一个靠近R结果。如何在Python中获得相同的结果?

1 个答案:

答案 0 :(得分:1)

这是一个执行相同功能的函数:

import scipy.signal as ss

def ccf(x, y, lag_max = 100):

    result = ss.correlate(y - np.mean(y), x - np.mean(x), method='direct') / (np.std(y) * np.std(x) * len(y))
    length = (len(result) - 1) // 2
    lo = length - lag_max
    hi = length + (lag_max + 1)

    return result[lo:hi]