Python - 滚动窗口 OLS 回归估计

Des*_*gos 3 python numpy pandas scikit-learn statsmodels

对于我的评估,我在此链接( https://drive.google.com/drive/folders/0B2Iv8dfU4fTUMVFyYTEtWXlzYkk ) 中找到了一个数据集,格式如下。我数据集中的第三列 (Y) 是我的真实值 - 这就是我想要预测(估计)的值。

 time     X   Y
0.000543  0  10
0.000575  0  10
0.041324  1  10
0.041331  2  10
0.041336  3  10
0.04134   4  10
  ...
9.987735  55 239
9.987739  56 239
9.987744  57 239
9.987749  58 239
9.987938  59 239
Run Code Online (Sandbox Code Playgroud)

我想运行例如 5 window 的滚动OLS regression estimation,并且我已经使用以下脚本进行了尝试。

# /usr/bin/python -tt

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv('estimated_pred.csv')

model = pd.stats.ols.MovingOLS(y=df.Y, x=df[['X']], 
                               window_type='rolling', window=5, intercept=True)
df['Y_hat'] = model.y_predict

print(df['Y_hat'])
print (model.summary)
df.plot.scatter(x='X', y='Y', s=0.1)
Run Code Online (Sandbox Code Playgroud)

回归分析的概要如下所示。

   -------------------------Summary of Regression Analysis-------------------------

Formula: Y ~ <X> + <intercept>

Number of Observations:         5
Number of Degrees of Freedom:   2

R-squared:           -inf
Adj R-squared:       -inf

Rmse:              0.0000

F-stat (1, 3):        nan, p-value:        nan

Degrees of Freedom: model 1, resid 3

-----------------------Summary of Estimated Coefficients------------------------
      Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%
--------------------------------------------------------------------------------
             X     0.0000     0.0000       1.97     0.1429     0.0000     0.0000
     intercept   239.0000     0.0000 14567091934632472.00     0.0000   239.0000   239.0000
---------------------------------End of Summary---------------------------------
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我想对Yat进行后向预测t+1(即Y根据前一个值预测 的下一个值,即p(Y)t+1通过包括均方误差 ( MSE) - 例如,如果我们查看第 5 行, 的值为X2 和Y是 10。假设预测值 ( p(Y)t+1) 是 6,因此mse将是(10-6)^2。我们如何使用0.20.0 版中删除的statsmodelsor 或scikit-learnfor来做到这一点,因为我找不到任何参考?pd.stats.ols.MovingOLSPandas

Vlo*_*lox 5

这是使用 statsmodels 进行滚动 OLS 的概述,应该适用于您的数据。只需使用df=pd.read_csv('estimated_pred.csv')而不是我随机生成的 df:

import pandas as pd
import numpy as np
import statsmodels.api as sm

#random data
#df=pd.DataFrame(np.random.normal(size=(500,3)),columns=['time','X','Y'])
df=pd.read_csv('estimated_pred.csv')    
df=df.dropna() #uncomment this line to drop nans
window = 5

df['a']=None #constant
df['b1']=None #beta1
df['b2']=None #beta2
for i in range(window,len(df)):
    temp=df.iloc[i-window:i,:]
    RollOLS=sm.OLS(temp.loc[:,'Y'],sm.add_constant(temp.loc[:,['time','X']])).fit()
    df.iloc[i,df.columns.get_loc('a')]=RollOLS.params[0]
    df.iloc[i,df.columns.get_loc('b1')]=RollOLS.params[1]
    df.iloc[i,df.columns.get_loc('b2')]=RollOLS.params[2]

#The following line gives you predicted values in a row, given the PRIOR row's estimated parameters
df['predicted']=df['a'].shift(1)+df['b1'].shift(1)*df['time']+df['b2'].shift(1)*df['X']
Run Code Online (Sandbox Code Playgroud)

我存储常数和 beta,但是有多种方法可以进行预测……您可以使用我的拟合模型对象RollOLS.predict()方法,或者自己乘以我在最后一行中所做的(更容易这样做)在这种情况下,因为变量的数量是固定且已知的,您可以一次性完成简单的列数学运算)。

使用 sm 进行预测时,它看起来像这样:

predict_x=np.random.normal(size=(20,2))
RollOLS.predict(sm.add_constant(predict_x))
Run Code Online (Sandbox Code Playgroud)

但请记住,如果您按顺序运行上述代码,则预测值将仅使用最后一个窗口的模型。如果您想使用不同的模型,那么您可以随时保存这些模型,或者在 for 循环中预测值。请注意,您还可以使用 获得拟合值RollOLS.fittedvalues,因此如果您正在RollOLS.fittedvalues[-1]为循环中的每次迭代平滑数据拉取和保存。


为了帮助了解如何使用您自己的数据,这里是滚动回归循环运行后我的 df 的尾部:

      time         X           Y           a           b1          b2
495 0.662463    0.771971    0.643008    -0.0235751  0.037875    0.0907694
496 -0.127879   1.293141    0.404959    0.00314073  0.0441054   0.113387
497 -0.006581   -0.824247   0.226653    0.0105847   0.0439867   0.118228
498 1.870858    0.920964    0.571535    0.0123463   0.0428359   0.11598
499 0.724296    0.537296    -0.411965   0.00104044  0.055003    0.118953
Run Code Online (Sandbox Code Playgroud)