Как выполнить тест причинно-следственной связи по Грейнджеру в Python


Тест на причинность Грейнджера используется для определения того, полезен ли один временной ряд для прогнозирования другого.

В этом тесте используются следующие нулевая и альтернативная гипотезы:

Нулевая гипотеза (H 0 ): временной ряд x не является временным рядом y по причине Грейнджера.

Альтернативная гипотеза ( HA ): временной ряд x временной ряд причин Грейнджера y

Термин «причины Грейнджера» означает, что знание значения временного ряда x при определенном отставании полезно для прогнозирования значения временного ряда y в более поздний период времени.

Этот тест создает статистику F-теста с соответствующим p-значением.Если p-значение меньше определенного уровня значимости (т. е. α = 0,05), то мы можем отклонить нулевую гипотезу и заключить, что у нас есть достаточно доказательств, чтобы сказать, что временной ряд x по Грейнджеру вызывает временной ряд y.

Мы можем использовать функцию grangercausalitytests() из пакета statsmodels для выполнения теста Грейнджера-причинности в Python:

from statsmodels. tsa.stattools import grangercausalitytests

#perform Granger-Causality test
grangercausalitytests(df[['column1', 'column2']], maxlag=[ 3 ])

Обратите внимание, что maxlag указывает количество лагов для использования в первом временном ряду.

В следующем пошаговом примере показано, как использовать эту функцию на практике.

Шаг 1: Загрузите данные

В этом примере мы будем использовать набор данных, который содержит значения количества яиц, произведенных вместе с количеством цыплят в США с 1930 по 1983 год:

import pandas as pd

#define URL where dataset is located
url = "https://raw.githubusercontent.com/Statology/Miscellaneous/main/chicken_egg.txt"

#read in dataset as pandas DataFrame
df = pd.read_csv (url, sep=" ")

#view first five rows of DataFrame
df.head ()

 year chicken egg
0 1930 468491 3581
1 1931 449743 3532
2 1932 436815 3327
3 1933 444523 3255
4 1934 433937 3156

Связанный: Как читать файлы CSV с помощью Pandas

Шаг 2. Выполните тест Грейнджера-причинности

Далее мы будем использовать функцию grangercausalitytests () для выполнения теста Грейнджера-причинности, чтобы увидеть, является ли количество произведенных яиц прогнозом будущего количества цыплят. Мы запустим тест, используя три лага:

from statsmodels. tsa.stattools import grangercausalitytests

#perform Granger-Causality test
grangercausalitytests(df[['chicken', 'egg']], maxlag=[ 3 ])

Granger Causality
number of lags (no zero) 3
ssr based F test: F=5.4050 , p=0.0030 , df_denom=44, df_num=3
ssr based chi2 test: chi2=18.7946 , p=0.0003 , df=3
likelihood ratio test: chi2=16.0003 , p=0.0011 , df=3
parameter F test: F=5.4050 , p=0.0030 , df_denom=44, df_num=3

Статистика F-теста оказывается равной 5,405 , а соответствующее значение p равно 0,0030 .

Поскольку p-значение меньше 0,05, мы можем отклонить нулевую гипотезу теста и сделать вывод, что знание количества яиц полезно для прогнозирования будущего количества цыплят.

Шаг 3. Выполните тест Грейнджера-причинности в обратном порядке.

Хотя мы отвергли нулевую гипотезу теста, на самом деле возможно, что имеет место случай обратной причинно-следственной связи. То есть вполне возможно, что количество цыплят вызывает изменение количества яиц.

Чтобы исключить эту возможность, нам нужно выполнить тест Грейнджера-причинности в обратном порядке, используя цыплят в качестве переменной-предиктора и яйца в качестве переменной ответа :

from statsmodels. tsa.stattools import grangercausalitytests

#perform Granger-Causality test
grangercausalitytests(df[['egg', 'chicken']], maxlag=[ 3 ])

Granger Causality
number of lags (no zero) 3
ssr based F test: F=0.5916 , p=0.6238 , df_denom=44, df_num=3
ssr based chi2 test: chi2=2.0572 , p=0.5606 , df=3
likelihood ratio test: chi2=2.0168 , p=0.5689 , df=3
parameter F test: F=0.5916 , p=0.6238 , df_denom=44, df_num=3

Статистика F-теста оказывается равной 0,5916 , а соответствующее значение p равно 0,6238 .

Поскольку p-значение не меньше 0,05, мы не можем отвергнуть нулевую гипотезу. То есть количество цыплят не является предсказанием будущего количества яиц.

Таким образом, можно сделать вывод, что знание количества яиц полезно для предсказания будущего количества цыплят.

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные задачи с временными рядами в Python:

Как создать график временных рядов в Seaborn
Как создать график временных рядов в Matplotlib

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.