Построение причинности Грейнджера на основе ssr: извлечение значений из списка в словаре в словаре

#python #dictionary #statistics #graphing

#python #словарь #Статистика #построение графиков

Вопрос:

Я относительно новичок в программировании на Python, и я работаю над проектом, включающим анализ сигналов. У меня есть несколько наборов данных, но для простоты я задам этот вопрос, используя только два из них.

Во-первых, информация о данных:

  • Два набора данных временных рядов
  • Частота дискретизации 1 раз в день
  • 11 значений данных, отсутствующих в наборе столбцов 826, отсутствие функциональности в python для обработки nan означало, что я усек на 677-м лаге, за единицу до первого пропущенного значения.
  • Оба проходят расширенный тест Дики Фуллера, то есть они неподвижны. Для меня это подозрительно, но пока я соглашусь с этим.
  • Я нормализовал данные с помощью boxcox.

Я пытаюсь проверить, вызывает ли aos aucs.

Соответствующие строки кода (на данный момент):

 mydict = statsmodels.tsa.stattools.grangercausalitytests(zip(aucs[1:677],aos[1:677]), maxlag=100, addconst=True, verbose=True)
pp.pprint(mydict)
  

«Подробный» режим в вызове функции выдает очень хороший результат, например, для 79-го лага:

 Granger Causality
number of lags (no zero) 79
ssr based F test:         F=1.0481  , p=0.3772  , df_denom=438, df_num=79
ssr based chi2 test:   chi2=112.8566, p=0.0075  , df=79
likelihood ratio test: chi2=103.3680, p=0.0343  , df=79
parameter F test:         F=1.0481  , p=0.3772  , df_denom=438, df_num=79
  

Из моих исследований, основанный на ssr F-тест является «стандартным» тестом причинности Грейнджера, и поэтому я хочу использовать его для своего проекта.

Я хочу сделать две вещи: (1) распечатать каждое из них в файл, (2) отобразить распределение F на основе ssr и связанные с ним p-значения / доверительные границы.

Однако для первой проблемы «подробный» код режима встроен в фактическую функцию (т. Е. Я передаю весь свой набор данных этой функции). Он итеративно выводит выходные данные по мере выполнения вычислений, а затем возвращает всю структуру словаря сразу, отдельно. Таким образом, я не могу «распечатать» вывод в файл (он находится внутри функции), и я не могу распечатать словарь (он имеет глубину в несколько уровней).

Вот структура двух задержек с использованием pretty printer, которую я получаю из фактического вывода:

 { 1: ( { 'lrtest': (3.4447802797894838, 0.063451857791777685, 1),
         'params_ftest': (3.438235992254306, 0.064141599476182851, 672.0, 1),
         'ssr_chi2test': (3.4535852600768981, 0.063114725408777453, 1),
         'ssr_ftest': (3.4382359922543344, 0.06414159947617562, 672.0, 1)},
       [ <statsmodels.regression.linear_model.RegressionResultsWrapper object at 0x116ccd210>,
         <statsmodels.regression.linear_model.RegressionResultsWrapper object at 0x116cc9d90>,
         array([[ 0.,  1.,  0.]])]),
  2: ( { 'lrtest': (2.849736097306959, 0.24054020071776955, 2),
         'params_ftest': (1.4172919220343254, 0.24309625306924146, 669.0, 2),
         'ssr_chi2test': (2.8557690745918363, 0.23981570719685263, 2),
         'ssr_ftest': (1.4172919220340792, 0.24309625306930535, 669.0, 2)},
       [ <statsmodels.regression.linear_model.RegressionResultsWrapper object at 0x116cc9590>,
         <statsmodels.regression.linear_model.RegressionResultsWrapper object at 0x116cc9490>,
         array([[ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.]])]),
  

Как вы можете видеть, это довольно грязно. Я понимаю, что мне нужно выполнить несколько циклов for (например, Для x in mydict , for y in mydict[x] и т. Д.), Но Появляется так много разных уровней / типов данных, Что я теряюсь в том, как именно выполнять цикл. Я продолжаю получать ошибки, связанные с итерацией (т. Е. Не могу перебирать этот тип данных, потому что это невозможно повторить и т.д.). Я хочу распечатать эти значения в текстовый файл таким образом, чтобы они выглядели так же, как и в режиме вывода «подробного». Затем я хочу извлечь значения отдельных столбцов и создать массив (F-значение для каждого лага) и отобразить его.

Я прошу прощения, если это простой вопрос, и любая помощь очень ценится!

Комментарии:

1. Вам не нужно печатать их в текстовый файл, вы можете поместить результаты в массив для построения графика. Вам нужны результаты для всех лагов или только для максимальных лагов?

Ответ №1:

При установке maxlags=2 выполняются задержки 1 и 2. Задержки и результаты являются первой парой ключ: значение в возвращаемом dict. Тогда dict результатов теста является первым элементом кортежа значений, а F-оценка является первым элементом кортежа пары ключ-значение для ssr_ftest . Итак, чтобы получить это значение для задержки 2, вы должны использовать

 fscore = mydict[2][0]['ssr_ftest'][0]