首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我从grangercausalitytest得到"LinAlgError: Singular matrix“?

为什么我从grangercausalitytest得到"LinAlgError: Singular matrix“?
EN

Stack Overflow用户
提问于 2017-06-01 18:45:47
回答 2查看 85.8K关注 0票数 22

我尝试在两个时间序列上运行grangercausalitytests

代码语言:javascript
复制
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)

然而,我得到了

代码语言:javascript
复制
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

我不知道为什么会这样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-01 21:46:22

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

代码语言:javascript
复制
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
票数 34
EN

Stack Overflow用户

发布于 2019-09-18 03:38:46

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44305456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档