【问题标题】:Why am I getting "LinAlgError: Singular matrix" from grangercausalitytests?为什么我从 grangercausalitytests 得到“LinAlgError:奇异矩阵”?
【发布时间】:2017-11-02 11:30:33
【问题描述】:

我正在尝试在两个时间序列上运行 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

我不确定为什么会这样。

【问题讨论】:

    标签: python statsmodels


    【解决方案1】:

    另一件需要注意的是重复的列。重复列的相关性得分为 1.0,从而导致奇异性。否则,您也可能有 2 个完全相关的特征。简单的检查方法是使用df.corr(),并查找相关性 = 1.0 的列对。

    【讨论】:

    • 这不是一个完整的答案,如果您认为应该添加某些内容或添加完整的答案,您可以评论答案
    【解决方案2】:

    问题是由于数据中两个系列之间的完美相关性而出现的。从回溯中,您可以看到,内部使用 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
    

    【讨论】:

    • 感谢您的澄清!
    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 2016-05-18
    • 2015-07-30
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    相关资源
    最近更新 更多