我对使用 Python 进行编码还比较陌生,而且我正在从事一个涉及信号分析的项目。我有几个数据集,但为简单起见,我将仅使用其中两个来问这个问题。
首先,关于数据的信息:
- 两个时间序列数据集
- 采样率 1x/天
- 826 列集中缺少 11 个数据值,python 中缺少处理 nan 的功能意味着我在第 677 个滞后处被截断,第一个缺失值之前的一个滞后。
- 都通过了增强的 dickey fuller 测试,即它们是静止的。这对我来说很可疑,但现在我会接受它。
- 我使用 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 值/置信区间。
然而,对于第一个问题,“详细”模式代码内置于实际函数中(即我将整个数据集传递给该函数)。它在执行计算时迭代打印输出,然后一次单独返回整个字典结构。因此,我无法将输出“打印”到文件(它在函数内),也无法打印字典(它有几层深)。
这里是两个滞后的结构,使用 pretty-print ,我从实际输出中得到:
{ 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 循环(即 for x in mydict
,for y in mydict[x]
等),但是有很多不同的级别/吐出的数据类型让我完全不知道如何循环。我不断收到涉及迭代的错误(即无法遍历此数据类型,因为它不可迭代,等等)。我想将这些值打印到一个文本文件中,使它们看起来与“详细”模式输出中的一样。然后,我想提取各个列值并创建一个数组(每个滞后的 F 值),然后绘制它。
如果这是一个简单的问题,我深表歉意,非常感谢您的帮助!
最佳答案
当您设置 maxlags=2
时,将执行 1 和 2 的滞后。滞后和结果是返回字典中的第一个键值对。然后测试结果的dict是值元组的第一个元素,F-score是ssr_ftest
的键值对的第一个元组元素。因此,要获得滞后 2 的值,您可以使用
fscore = mydict[2][0]['ssr_ftest'][0]
关于python - 绘制基于 ssr 的格兰杰因果关系 : pulling values from list within a dictionary within a dictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24371491/