【问题标题】:Python - Rolling window OLS Regression estimationPython - 滚动窗口 OLS 回归估计
【发布时间】:2017-11-29 06:28:04
【问题描述】:

对于我的评估,我在this link (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

我想运行例如 5 个窗口 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)

回归分析总结如下。

   -------------------------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---------------------------------

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

【问题讨论】:

    标签: python pandas numpy scikit-learn statsmodels


    【解决方案1】:

    这是使用 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']
    

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

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

    predict_x=np.random.normal(size=(20,2))
    RollOLS.predict(sm.add_constant(predict_x))
    

    但请记住,如果您按顺序运行上述代码,则预测值将仅使用最后一个窗口的模型。如果您想使用不同的模型,那么您可以随时保存它们,或者在 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
    

    【讨论】:

    • 评论不用于扩展讨论;这个对话是moved to chat
    • 这个问题和几个类似问题的答案是基于重新制定和独立调用 sm.OLS 每个步骤。虽然我很欣赏这总比没有好,但这是一种低效的滚动回归方式——例如,请参阅 stats.stackexchange.com/questions/6920/... 以获取参考。使用更新方法(整个 Givens 轮换)这样做有很大的经济性。如果你想在一个体面的大小问题和窗口上交钥匙,暂时这意味着将它运送到 R,我很欣赏这可能不适用于你的问题环境。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 2017-09-16
    • 2013-07-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多