Python – estimación de la regresión OLS ventana de balanceo

Para mi evaluación, tengo un conjunto de datos que se encuentra en este enlace ( https://drive.google.com/drive/folders/0B2Iv8dfU4fTUMVFyYTEtWXlzYkk ) como se muestra en el siguiente formato. La tercera columna (Y) en mi conjunto de datos es mi verdadero valor, eso es lo que quería predecir (estimar).

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

Quiero ejecutar un balanceo de, por ejemplo, la OLS regression estimation 5 ventanas, y lo he intentado con el siguiente script.

 # /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) 

El resumen del análisis de regresión se muestra a continuación.

  -------------------------Summary of Regression Analysis------------------------- Formula: Y ~  +  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--------------------------------- 

introduzca la descripción de la imagen aquí

Quiero hacer una predicción hacia atrás de Y en t+1 (es decir, predecir el siguiente valor de Y según el valor anterior, es decir, p(Y)t+1 incluyendo el error de la media al cuadrado ( MSE ), por ejemplo, si observamos en la fila 5, el valor de X es 2 y el valor de Y es 10. Digamos que el valor de predicción ( p(Y)t+1 ) es 6 y, por lo tanto, mse será (10-6)^2 ¿Cómo puede hacemos esto usando statsmodels o scikit-learn para pd.stats.ols.MovingOLS se eliminó en Pandas versión 0.20.0 y, ¿no puedo encontrar ninguna referencia?

Aquí hay un resumen de cómo hacer OLS rodantes con modelos de estadísticas y debería funcionar para sus datos. simplemente use df=pd.read_csv('estimated_pred.csv') lugar de mi df generado aleatoriamente:

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

Almaceno la constante y las betas, pero hay varias formas de aproximarse a la predicción … puede usar su objeto modelo ajustado. El mío es RollOLS y el método .predict() , o lo multiplica usted mismo, lo que hice en la línea final ( Es más fácil hacerlo de esta manera en este caso porque la cantidad de variables es fija y conocida y puede hacer operaciones matemáticas simples de una sola vez.

para hacer predicciones con sm, a medida que avanzas se vería así:

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

pero tenga en cuenta que si ejecuta el código anterior en secuencia, los valores pronosticados usarán el modelo de la última ventana solamente. Si desea utilizar un modelo diferente, puede guardarlos a medida que avanza o predecir valores dentro del bucle for. Tenga en cuenta que también puede obtener valores ajustados con RollOLS.fittedvalues , por lo que si está suavizando la extracción de datos y guarde RollOLS.fittedvalues[-1] para cada iteración en el bucle.


Para ayudar a ver cómo usar sus propios datos, aquí está la cola de mi df después de que se ejecuta el ciclo de regresión móvil:

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