2017-06-01 11 views
2

私は2つの時系列上grangercausalitytestsを実行しようとしています:なぜ私は "LinAlgError:Singular matrix"を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 

を取得していますし、私はこれが事実である理由はわかりません。

答えて

4

問題は、データ内の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 
+0

ありがとうございます! – displayname

関連する問題