来自Statsmodels VAR的R2

时间:2018-01-02 15:44:10

标签: python statsmodels

是否有一种从Statsmodels的VAR包中提取R2的简单方法?

遵循statsmodels文档中的示例: http://www.statsmodels.org/dev/vector_ar.html

from statsmodels.tsa.api import VAR
model = VAR(data)
results = model.fit(2)
results.summary()

Summary of Regression Results   
==================================
Model:                         VAR
Method:                        OLS
Date:           Tue, 28, Feb, 2017
Time:                     21:38:11
--------------------------------------------------------------------
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
--------------------------------------------------------------------
.
.

然后继续显示每个方程的系数,最后显示残差的相关矩阵。但是,它没有显示每个方程的R平方。

有没有人知道是否有一种简单的方法可以从statsmodels VAR中提取R-square而无需从头开始工作?

1 个答案:

答案 0 :(得分:1)

为每个方程式使用sklearn.metrics.r2_score将有效(不幸的是,超出了statsmodels)。该示例代码假定在数据帧'foobar'中有一列名为data的列,这将是我们提取的公式R2;显然,VAR()fit()方法应适合您的特定情况

import statsmodels.api as sm
import sklearn.metrics as skm
estVAR = sm.tsa.VAR(data).fit(1)
skm.r2_score(estVAR.fittedvalues['foobar']+estVAR.resid['foobar'],
  estVAR.fittedvalues['foobar'])

将拟合值添加到残差的原因是要获取VAR可以为其构建拟合值的实际数据(而不是整个样本,由于需要将其某些观测值未构建拟合值,因此滞后的观察结果在右侧)。顺便说一句,通过执行此操作,我们可以确认这就是我们想要的R2

y = estVAR.fittedvalues['foobar']+estVAR.resid['foobar']
R2 = 1 - np.sum(estVAR.resid['foobar'].values**2)/np.sum((y.values-y.mean())**2)