对于我的评估,我想针对this link(https://drive.google.com/drive/folders/0B2Iv8dfU4fTUMVFyYTEtWXlzYkk)中找到的数据集运行滚动,例如3个窗口OLS regression estimation
,如下面的格式。我的数据集中的第三列(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
使用简单的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=3, 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)
然而,使用statsmodels
或scikit-learn
似乎是简单回归之外的好选择。我已尝试使用statsmodels
使以下脚本正常工作,但使用attached数据集的更高子集(例如,对于数据集的1000多行)撤回IndexError: index out of bounds
。
# /usr/bin/python -tt
import pandas as pd
import numpy as np
import statsmodels.api as sm
df=pd.read_csv('estimated_pred.csv')
df=df.dropna() # to drop nans in case there are any
window = 3
#print(df.index) # to print index
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 us 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']
print(df['predicted'])
#print(df['b2'])
#print(RollOLS.predict(sm.add_constant(predict_x)))
print(temp)
最后,我想对Y
进行预测(即根据Y
之前的3个滚动值预测X
的当前值。我们怎样才能使用在statsmodels
版本0.20.0中删除了scikit-learn
或pd.stats.ols.MovingOLS
Pandas
,因为我无法找到任何引用?
答案 0 :(得分:1)
我想我找到了你的问题:
在sm.add_constant
的{{3}}中,有一个名为has_constant
的参数需要设置为add
(默认值为skip
)。
has_constant:str {'raise','add','skip'} 如果“数据”已经有一个常量的行为。默认将返回 数据没有添加另一个常量。如果'加注',将会提高 如果存在常量则出错。使用'add'将复制 如果有的话,不变的。对结构化或者没有影响 recarrays。在这种情况下,没有检查常数。
基本上对于循环的迭代,变量time
在子集中是常量,因此函数没有添加常量,因此RollOLS.params只有2个条目。
temp
Out[12]:
time X Y a b1 b2
541 0.16182 13 20.0 19.49 3.15289 -1.26116e-05
542 0.16182 14 20.0 20 0 7.10543e-15
543 0.16182 15 20.0 20 -7.45058e-09 0
sm.add_constant(temp.loc[:,['time','X']])
Out[13]:
time X
541 0.16182 13
542 0.16182 14
543 0.16182 15
sm.add_constant(temp.loc[:,['time','X']], has_constant = 'add')
Out[14]:
const time X
541 1 0.16182 13
542 1 0.16182 14
543 1 0.16182 15
如果你在has_constant = 'add'
函数中有sm.add_constant
,那么错误就会消失,但是在解释变量中你会有两个线性依赖列,这使得矩阵不可逆,因此回归不会有道理。