【问题标题】:How to transform log-differenced data fitted by statsmodels' VAR function back to actual values如何将 statsmodels 的 VAR 函数拟合的对数差分数据转换回实际值
【发布时间】:2016-06-23 23:14:51
【问题描述】:

我在 VAR 模型上关注了statsmodel tutorial,并对我获得的结果有疑问(我的整个代码可以在本文末尾找到)。

原始数据(存储在mdata)显然是非平稳的,因此需要使用以下行进行转换:

data = np.log(mdata).diff().dropna()

如果绘制原始数据 (mdata) 和转换后的数据 (data),则绘图如下所示:

然后使用对数差分数据拟合

model = VAR(data)
results = model.fit(2)

如果我随后绘制原始对数差分数据与拟合值,我会得到如下图:

我的问题是我怎样才能得到相同的情节,但原始数据没有对数差异。如何将拟合值确定的参数应用于这些原始数据?有没有办法使用我获得的参数将拟合的对数差分数据转换回原始数据,如果可以,如何实现?

这是我的整个代码和我获得的输出:

import pandas
import statsmodels as sm
from statsmodels.tsa.api import VAR
from statsmodels.tsa.base.datetools import dates_from_str
from statsmodels.tsa.stattools import adfuller
import numpy as np
import matplotlib.pyplot as plt

mdata = sm.datasets.macrodata.load_pandas().data

dates = mdata[['year', 'quarter']].astype(int).astype(str)
quarterly = dates["year"] + "Q" + dates["quarter"]

quarterly = dates_from_str(quarterly)

mdata = mdata[['realgdp', 'realcons', 'realinv']]
mdata.index = pandas.DatetimeIndex(quarterly)
data = np.log(mdata).diff().dropna()

f, ((ax1, ax2, ax3), (ax4, ax5, ax6)) = plt.subplots(2, 3, sharex='col', sharey='row')
ax1.plot(mdata.index, mdata['realgdp'])
ax2.plot(mdata.index, mdata['realcons'])
ax3.plot(mdata.index, mdata['realinv'])
ax4.plot(data.index, data['realgdp'])
ax5.plot(data.index, data['realcons'])
ax6.plot(data.index, data['realinv'])
f.suptitle('Original data vs. log-differenced data ')
plt.show()

print adfuller(mdata['realgdp'])
print adfuller(data['realgdp'])

# make a VAR model
model = VAR(data)
results = model.fit(2)
print results.summary()
# results.plot()
# plt.show()

f, axarr = plt.subplots(3, sharex=True)
axarr[0].plot(data.index, data['realgdp'])
axarr[0].plot(results.fittedvalues.index, results.fittedvalues['realgdp'])
axarr[1].plot(data.index, data['realcons'])
axarr[1].plot(results.fittedvalues.index, results.fittedvalues['realcons'])
axarr[2].plot(data.index, data['realinv'])
axarr[2].plot(results.fittedvalues.index, results.fittedvalues['realinv'])

f.suptitle('Original data vs. fitted data ')
plt.show()

给出以下输出:

(1.7504627967647102, 0.99824553723350318, 12, 190, {'5%': -2.8768752281673717, '1%': -3.4652439354133255, '10%': -2.5749446537396121}, 2034.5171236683821)
(-6.9728713472162127, 8.5750958448994759e-10, 1, 200, {'5%': -2.876102355, '1%': -3.4634760791249999, '10%': -2.574532225}, -1261.4401395993809)
  Summary of Regression Results   
==================================
Model:                         VAR
Method:                        OLS
Date:           Wed, 09, Mar, 2016
Time:                     15:08:07
--------------------------------------------------------------------
No. of Equations:         3.00000    BIC:                   -27.5830
Nobs:                     200.000    HQIC:                  -27.7892
Log likelihood:           1962.57    FPE:                7.42129e-13
AIC:                     -27.9293    Det(Omega_mle):     6.69358e-13
--------------------------------------------------------------------
Results for equation realgdp
==============================================================================
                 coefficient       std. error           t-stat            prob
------------------------------------------------------------------------------
const               0.001527         0.001119            1.365           0.174
L1.realgdp         -0.279435         0.169663           -1.647           0.101
L1.realcons         0.675016         0.131285            5.142           0.000
L1.realinv          0.033219         0.026194            1.268           0.206
L2.realgdp          0.008221         0.173522            0.047           0.962
L2.realcons         0.290458         0.145904            1.991           0.048
L2.realinv         -0.007321         0.025786           -0.284           0.777
==============================================================================

Results for equation realcons
==============================================================================
                 coefficient       std. error           t-stat            prob
------------------------------------------------------------------------------
const               0.005460         0.000969            5.634           0.000
L1.realgdp         -0.100468         0.146924           -0.684           0.495
L1.realcons         0.268640         0.113690            2.363           0.019
L1.realinv          0.025739         0.022683            1.135           0.258
L2.realgdp         -0.123174         0.150267           -0.820           0.413
L2.realcons         0.232499         0.126350            1.840           0.067
L2.realinv          0.023504         0.022330            1.053           0.294
==============================================================================

Results for equation realinv
==============================================================================
                 coefficient       std. error           t-stat            prob
------------------------------------------------------------------------------
const              -0.023903         0.005863           -4.077           0.000
L1.realgdp         -1.970974         0.888892           -2.217           0.028
L1.realcons         4.414162         0.687825            6.418           0.000
L1.realinv          0.225479         0.137234            1.643           0.102
L2.realgdp          0.380786         0.909114            0.419           0.676
L2.realcons         0.800281         0.764416            1.047           0.296
L2.realinv         -0.124079         0.135098           -0.918           0.360
==============================================================================

Correlation matrix of residuals
             realgdp  realcons   realinv
realgdp     1.000000  0.603316  0.750722
realcons    0.603316  1.000000  0.131951
realinv     0.750722  0.131951  1.000000

【问题讨论】:

    标签: python pandas statistics var statsmodels


    【解决方案1】:

    您正在寻找 np.exp,它是 np.log 的倒数。

    例如,在您的realgdp 上应用np.exp

    axarr[0].plot(results.fittedvalues.index, np.exp(results.fittedvalues['realgdp']))
    

    将使fittedvalues 恢复到原来的比例。

    但您可能希望将fittedvalues 绘制在与原始mdata 相同的图上。 为此,您将需要额外的步骤(与您获取data 的操作相反)。

    如果您查看索引:

    print mdata.index[:5]
    print results.fittedvalues.index[:5]
    
    DatetimeIndex(['1959-03-31', '1959-06-30', '1959-09-30',
                   '1959-12-31', '1960-03-31'],
                  dtype='datetime64[ns]', freq=None)
    DatetimeIndex(['1959-12-31', '1960-03-31', '1960-06-30',
                   '1960-09-30', '1960-12-31'],
                  dtype='datetime64[ns]', freq=None)
    

    您会注意到fittedvalues'1959-12-31' 开头,因此要重构您的fittedvalues,您需要:

    1. mdata 中的值的log 附加到'1959-12-31' 之前的索引(即'1959-09-30')到fittedvalues 的开头
    2. 计算此数组的cumsum()(与.diff()相反)
    3. 计算结果值的np.exp

    realgdp 为例,您可以将其与mdata 的原始值一起绘制,如下所示:

    f, ax = plt.subplots()
    ax.plot(mdata.index, mdata['realgdp'], label='Original Data')
    ax.plot(mdata.index[2:],
            np.exp(np.r_[np.log(mdata['realgdp'].iloc[2]), 
                         results.fittedvalues['realgdp']].cumsum()),
           label='Fitted Data')
    ax.set_title('Original data vs. UN-log-differenced data')
    ax.legend(loc=0)
    

    请注意,您需要在 results = model.fit(2) 之后调用此脚本

    这将产生这个情节:

    【讨论】:

    • 太好了,效果很好,也感谢您的详细解释!所以我现在赞成它,以后可能会根据其他答案的质量接受它。它不是原始问题的一部分,但您知道如何解释计算的系数吗?所以例如对于realgdp,我得到L1.realcons=0.675016L1.realgdp=-0.279435。这到底告诉我什么?有人可以以某种方式将这些系数解释为类似相关系数的东西吗?如何用语言表达这种关系?
    【解决方案2】:

    我认为你想预测最终值不想要对数和差异值(即原始数据)

    在这个数据集中,他们有兴趣计算利率。 这里附上我的代码截图

    要与原始数据集值交叉检查的最后一个单元格数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      相关资源
      最近更新 更多