Python 为什么我会得到;线性误差:奇异矩阵;来自格兰杰因果关系测试?

Python 为什么我会得到;线性误差:奇异矩阵;来自格兰杰因果关系测试?,python,statsmodels,Python,Statsmodels,我正在尝试对两个时间序列运行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

我正在尝试对两个时间序列运行
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因果关系
滞后数(不为零)1
基于ssr的F检验:F=272078066917221398041264652288.0000,p=0.0000,df_denom=996,df_num=1
基于ssr的chi2测试:chi2=272897579116697209542421773360.0000,p=0.0000,df=1
似然比检验:chi2=60811.2671,p=0.0000,df=1
参数F测试:F=27207806691722055361334520320.0000,p=0.0000,df_denom=996,df_num=1
格兰杰因果关系
滞后数(无零)2
基于ssr的F检验:F=7296.6976,p=0.0000,df_denom=995,df_num=2
基于ssr的chi2测试:chi2=14637.3954,p=0.0000,df=2
似然比检验:chi2=2746.0362,p=0.0000,df=2
参数F测试: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_linalgeror_singular(err,flag)
88
89 def_raise_LINALGEROR_单数(错误,标志):
--->90误差(“奇异矩阵”)
91
92 def_raise_LINALGEROR_nonposdef(错误,标志):
线性误差:奇异矩阵

我不知道为什么会这样

由于数据中两个系列之间存在完美的相关性,因此出现了问题。从回溯中,您可以看到,内部使用wald测试来计算滞后时间序列参数的最大似然估计。为此,需要估计参数协方差矩阵(随后接近零)及其逆矩阵(如回溯中的
invcov=np.linalg.inv(cov_p)
行所示)。对于某些最大滞后数(>=5),这个接近零的矩阵现在是奇异的,因此测试崩溃。如果只在数据中添加一点噪声,错误就会消失:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import grangercausalitytests

n = 1000
ls = np.linspace(0, 2*np.pi, n)
df1Clean = pd.DataFrame(np.sin(ls))
df2Clean = pd.DataFrame(2*np.sin(ls+1))
dfClean = pd.concat([df1Clean, df2Clean], axis=1)
dfDirty = dfClean+0.00001*np.random.rand(n, 2)

grangercausalitytests(dfClean, maxlag=20, verbose=False)    # Raises LinAlgError
grangercausalitytests(dfDirty, maxlag=20, verbose=False)    # Runs fine

另一件需要注意的事情是重复的列。重复列的相关性得分为1.0,导致奇点。否则,也可能有两个功能完全相关。检查这一点的简单方法是使用
df.corr()
,并查找相关系数为1.0的列对。

感谢您的澄清!这不是一个完整的答案,如果您认为应该添加一些内容或添加完整的答案,您可以对答案进行评论