OLS滚动回归Python错误 - IndexError:索引越界

时间:2017-07-03 13:23:48

标签: python python-3.x numpy scikit-learn statsmodels

对于我的评估,我想针对this linkhttps://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)

然而,使用statsmodelsscikit-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-learnpd.stats.ols.MovingOLS Pandas,因为我无法找到任何引用?

1 个答案:

答案 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,那么错误就会消失,但是在解释变量中你会有两个线性依赖列,这使得矩阵不可逆,因此回归不会有道理。