我试图在两个时间序列上运行grangercausalitytests
:
import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import grangercausalitytests
n = 1000
ls = np.linspace(0, 2*np.pi, n)
df1 = pd.DataFrame(np.sin(ls))
df2 = pd.DataFrame(2*np.sin(1+ls))
df = pd.concat([df1, df2], axis=1)
df.plot()
grangercausalitytests(df, maxlag=20)
但是,我得到了
Granger Causality
number of lags (no zero) 1
ssr based F test: F=272078066917221398041264652288.0000, p=0.0000 , df_denom=996, df_num=1
ssr based chi2 test: chi2=272897579166972095424217743360.0000, p=0.0000 , df=1
likelihood ratio test: chi2=60811.2671, p=0.0000 , df=1
parameter F test: F=272078066917220553616334520320.0000, p=0.0000 , df_denom=996, df_num=1
Granger Causality
number of lags (no zero) 2
ssr based F test: F=7296.6976, p=0.0000 , df_denom=995, df_num=2
ssr based chi2 test: chi2=14637.3954, p=0.0000 , df=2
likelihood ratio test: chi2=2746.0362, p=0.0000 , df=2
parameter F test: F=13296850090491009488285469769728.0000, p=0.0000 , df_denom=995, df_num=2
...
/usr/local/lib/python3.5/dist-packages/numpy/linalg/linalg.py in _raise_linalgerror_singular(err, flag)
88
89 def _raise_linalgerror_singular(err, flag):
---> 90 raise LinAlgError("Singular matrix")
91
92 def _raise_linalgerror_nonposdef(err, flag):
LinAlgError: Singular matrix
我不知道为什么会这样。
这个问题是由于数据中两个序列之间的完美相关性而产生的。从回溯中可以看到,内部使用wald测试来计算滞后时间序列参数的最大似然估计。为此,需要估计参数协方差矩阵(然后接近于零)及其逆矩阵(您也可以在回溯中的
invcov = np.linalg.inv(cov_p)
行中看到)。对于某些最大滞后数(>;=5),这个接近零的矩阵现在是奇异的,因此测试崩溃。如果只在数据中添加一点噪声,则错误将消失:另一个需要注意的是重复的列。重复列的相关度为1.0,从而导致奇点。否则,也有可能有两个特性是完全相关的。检查这一点的简单方法是使用
df.corr()
,并查找correlation=1.0的列对。相关问题 更多 >
编程相关推荐