LoginSignup
29
37

Pythonで時系列解析(因果推論)

Last updated at Posted at 2019-10-25

Pythonのstatsmodels==0.10.0を用いて、主に因果推論のやり方をメモ程度に書きました。
それぞれの説明は全くないですがご容赦下さい。

単位根検定

Augmented Dickey-Fuller 単位根検定

.py
from statsmodels.tsa.stattools import adfuller

results = adfuller(x) # x: array_like, 1d
stat = results[0]     # 統計量
pvalue = results[1]  # p値

pvalueが基準(0.05など)より小さい場合、単位根過程であるという帰無仮説が棄却

参考:
https://www.statsmodels.org/stable/generated/statsmodels.tsa.stattools.adfuller.html

共和分検定

Augmented Engle-Granger two-step 共和分検定

.py
from statsmodels.tsa.stattools import coint

results = coint(x, y) # # x, y: array_like, 1d
stat = results[0]     # 統計量
pvalue = results[1]  # p値

pvalueが基準(0.05など)より小さい場合、共和分の関係にないという帰無仮説が棄却

参考:
https://www.statsmodels.org/stable/generated/statsmodels.tsa.stattools.coint.html

グレンジャー因果性検定

前提

下のブログにあるように、以下のようなステップを踏んでから因果性検定を行います

  1. VARモデルを推定する前に、まず個々の原系列に対して単位根検定を実施する
  1. そもそもただの回帰関係が見たいだけなら、気にせずVARモデルを計算して良い
  2. 単位根過程が混ざっていなければ、そのままVARモデルを計算して因果性分析まで行って良い
  3. 単位根過程が混ざっていたら、まず共和分関係(ランク)を推定する
  4. 共和分関係がなければ、差分系列に対してVARモデルを推定して因果性分析まで行って良い
  1. 共和分関係があったら、VECMを推定してからVARモデルに変換して初めて因果性分析を行える

単位根検定、共和分検定は上で説明したように行ってください。
VECMモデルに関してはたぶんいつか追記します。

以下では、上のステップを踏んだ後のVARモデルを推定して因果性分析をするところについて書きます。

その1

####VARモデルで近似して、icがもっとも低くなる次数を見つけてから因果性検定

.py
from statsmodels.tsa.vector_ar.var_model import VAR

maxlags = 100
model = VAR(x) # x: ndarray (data数, column数)
selected_orders = model.select_order(maxlags).selected_orders
# e.g. selected_orders = {'aic': 91, 'bic': 7, 'fpe': 91, 'hqic': 10}
results = model.fit(selected_orders['aic'])
test_results = results.test_causality(causing=0, caused=1)  # x0=>x1への因果を検定
pvalue = test_results.pvalue

pvalueが基準(0.05など)より小さい場合、グレンジャー因果がないという帰無仮説が棄却

参考:
https://www.statsmodels.org/dev/generated/generated/statsmodels.tsa.vector_ar.var_model.VARResults.test_causality.html#statsmodels.tsa.vector_ar.var_model.VARResults.test_causality

その2

####VARモデルの次数を決めうちで因果性検定
次数が決められるときは、もっと簡単にできるっぽいので一応書いておきますが、その1でやればいいと思います。

.py
from statsmodels.tsa.stattools import grangercausalitytests

maxlag = 30 
results = grangercausalitytests(x, maxlag) # x: 2darray (data数, 2), x[:,0] => x[:,1]への因果を検定 
stat = results[0]     # 統計量
p_value = results[1]  # p値

p_valueが基準(0.05など)より小さい場合、x1=>x2のグレンジャー因果がないという帰無仮説が棄却

参考:
https://www.statsmodels.org/stable/generated/statsmodels.tsa.stattools.grangercausalitytests.html

インパルス応答

VARモデルを推定するところまでは、グレンジャー因果性のその1と同じです。

.py
maxlags = 100
model = VAR(x) # x: ndarray (data数, column数)
selected_orders = model.select_order(maxlags).selected_orders
# e.g. selected_orders = {'aic': 91, 'bic': 7, 'fpe': 91, 'hqic': 10}
results = model.fit(selected_orders['aic'])

period = 25
irf = results.irf(period)
irf.plot()

スクリーンショット 2019-10-25 18.35.29.png

こんな感じの図が出るはず

29
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
37