Python滚动窗口OLS回归估计

Python滚动窗口OLS回归估计,python,pandas,numpy,scikit-learn,statsmodels,Python,Pandas,Numpy,Scikit Learn,Statsmodels,对于我的评估,我在()中找到了一个数据集,格式如下。数据集中的第三列(Y)是我的真实值——这就是我想要预测(估计)的值 我想运行一个滚动的示例5窗口OLS回归估计,我已经用下面的脚本进行了尝试 # /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.o

对于我的评估,我在()中找到了一个数据集,格式如下。数据集中的第三列(Y)是我的真实值——这就是我想要预测(估计)的值

我想运行一个滚动的示例5窗口
OLS回归估计
,我已经用下面的脚本进行了尝试

# /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---------------------------------
----------------------------回归分析总结-------------------------
公式:Y~+
观察次数:5次
自由度:2
R平方:-inf
调整R平方:-inf
Rmse:0.0000
F-stat(1,3):nan,p值:nan
自由度:模型1,剩余3
-----------------------估计系数摘要------------------------
可变系数标准误差t-stat p值CI 2.5%CI 97.5%
--------------------------------------------------------------------------------
X 0.0000 0.0000 1.97 0.1429 0.0000 0.0000
截距239.0000 0.0000 14567091934632472.00 0.0000 239.0000 239.0000
---------------------------------摘要结束---------------------------------


我想在
t+1
处对
Y
进行反向预测(即根据先前的值预测
Y
的下一个值,即
p(Y)t+1
,包括均方误差(
MSE
)-例如,如果我们看第5行,
X
的值是2,
Y
的值是10。假设预测值(
p(Y)t+1
)是6,因此
mse
将是
(10-6)^2
。我们如何使用
statsmodels
scikit learn
来实现这一点,因为在
Pandas
0.20.0版中删除了
stats.ols.MovingOLS
,因为我找不到任何参考资料?

以下是使用statsmodels进行滚动ols的概要,应该适用于您的数据。只需使用
df=pd.read\csv(“估计的\u 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]


为了帮助您了解如何使用自己的数据,这里是运行滚动回归循环后my 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

评论不用于扩展讨论;本次对话一直是。对这一问题和几个类似问题的回答都是基于每一步都独立地重新格式化和调用sm.OLS。虽然我理解这总比没有好,但这是一种进行滚动回归的低效方法——例如,请参见stats.stackexchange.com/questions/6920/…供参考。使用更新方法(整个Givens轮换)进行此操作非常经济。如果您想要解决一个合适的尺寸问题和窗口,目前这意味着将其发送到R,我认为这可能不适用于您的问题环境。
      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