Python - 滚动 window OLS 回归估计
Python - Rolling window OLS Regression estimation
为了我的评估,我在 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 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)
回归分析的总结如下所示。
-------------------------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
的下一个值,即 p(Y)t+1
通过包括均方误差 (MSE
) - 例如,如果我们查看第 5 行,X
的值为 2,Y
的值为 10。假设预测值 (p(Y)t+1
) 是 6,因此 mse
将是 (10-6)^2
。我们如何使用 statsmodels
或 scikit-learn
来做到这一点,因为 pd.stats.ols.MovingOLS
在Pandas
版本 0.20.0,因为我找不到任何参考资料?
这是使用 statsmodels 进行滚动 OLS 的概述,应该适用于您的数据。只需使用 df=pd.read_csv('estimated_pred.csv')
而不是我的 运行domly 生成的 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))
但请记住,如果您按顺序 运行 上面的代码,预测值将仅使用最后一个 window 的模型。如果你想使用不同的模型,那么你可以随时保存它们,或者在 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
为了我的评估,我在 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 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)
回归分析的总结如下所示。
-------------------------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
的下一个值,即 p(Y)t+1
通过包括均方误差 (MSE
) - 例如,如果我们查看第 5 行,X
的值为 2,Y
的值为 10。假设预测值 (p(Y)t+1
) 是 6,因此 mse
将是 (10-6)^2
。我们如何使用 statsmodels
或 scikit-learn
来做到这一点,因为 pd.stats.ols.MovingOLS
在Pandas
版本 0.20.0,因为我找不到任何参考资料?
这是使用 statsmodels 进行滚动 OLS 的概述,应该适用于您的数据。只需使用 df=pd.read_csv('estimated_pred.csv')
而不是我的 运行domly 生成的 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))
但请记住,如果您按顺序 运行 上面的代码,预测值将仅使用最后一个 window 的模型。如果你想使用不同的模型,那么你可以随时保存它们,或者在 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