绘制基于SSR的格兰杰因果关系:从字典内字典的列表中提取值
我刚开始学习用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 mydict
,for y in mydict[x]
,等等),但输出的数据层级和类型太多,我不知道该如何循环。我一直遇到与迭代相关的错误(比如,无法对这种数据类型进行循环,因为它不可迭代,等等)。我想把这些值打印到文本文件中,使它们看起来和“详细”模式的输出一样。然后,我想提取每一列的值,创建一个数组(每个滞后的F值),并绘制图表。
如果这是个简单的问题,我很抱歉,任何帮助都非常感谢!
1 个回答
0
当你设置 maxlags=2
时,程序会计算滞后期为1和2的结果。滞后期和结果会作为返回字典中的第一个键值对。然后,测试结果的字典是返回值元组中的第一个元素,而F-score则是 ssr_ftest
的键值对中的第一个元组元素。所以,如果你想获取滞后期为2的值,你可以使用以下代码:
fscore = mydict[2][0]['ssr_ftest'][0]