绘制基于SSR的格兰杰因果关系:从字典内字典的列表中提取值

3 投票
1 回答
2162 浏览
提问于 2025-04-18 10:48

我刚开始学习用Python编程,正在做一个信号分析的项目。我有几个数据集,但为了简单起见,我只用其中两个来问这个问题。

首先,关于数据的一些信息:

  • 两个时间序列数据集
  • 采样频率是每天一次
  • 在826列的数据中,有11个值缺失,由于Python处理缺失值的功能有限,我在第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)绘制基于SSR的F分布及相关的p值/置信区间。

但是,对于第一个问题,“详细”模式的代码是内置在实际函数中的(也就是说,我把整个数据集传给了这个函数)。它在计算时会逐步打印输出,然后一次性返回整个字典结构。因此,我不能直接“打印”输出到文件(因为它在函数内部),也不能打印字典(因为它的层级太深了)。

这是我从实际输出中得到的两个滞后的结构,使用了漂亮打印工具:

{ 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 mydictfor y in mydict[x],等等),但输出的数据层级和类型太多,我不知道该如何循环。我一直遇到与迭代相关的错误(比如,无法对这种数据类型进行循环,因为它不可迭代,等等)。我想把这些值打印到文本文件中,使它们看起来和“详细”模式的输出一样。然后,我想提取每一列的值,创建一个数组(每个滞后的F值),并绘制图表。

如果这是个简单的问题,我很抱歉,任何帮助都非常感谢!

1 个回答

0

当你设置 maxlags=2 时,程序会计算滞后期为1和2的结果。滞后期和结果会作为返回字典中的第一个键值对。然后,测试结果的字典是返回值元组中的第一个元素,而F-score则是 ssr_ftest 的键值对中的第一个元组元素。所以,如果你想获取滞后期为2的值,你可以使用以下代码:

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

撰写回答