Python: зациклить переменную для простого OLS - PullRequest
0 голосов
/ 27 сентября 2018

Я хочу построить в Python функцию, которая создает простую регрессию OLS со следующим уравнением:

 Y_i - Y_i-1 = A + B(X_i - X_i-1) + E

Другими словами, Y_Lag = альфа + бета (X_Lag) + термин ошибки

В настоящее время у меня есть следующий набор данных (это короткая версия)

Примечание: Y = Historic_Rate

df = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 5)), columns=['Historic_Rate', 'Overnight', '1M', '3M', '6M'])

Итак, я пытаюсь построить то, что я итеративно берупеременная X и поместить ее в простую линейную регрессию, код, который я до сих пор строил, выглядит следующим образом:

#Start the iteration process for the regression to in turn fit 1 parameter

#Import required packages 

import pandas as pd
import numpy as np
import statsmodels.formula.api as sm

#Import dataset

df = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 5)), columns=['Historic_Rate', 'Overnight', '1M', '3M', '6M'])
#Y_Lag is always 1 time period only

df['Y_Lag'] = df['Historic_Rate'].shift(1)

#Begin the process with 1 lag, taking one x variable in turn

array = df[0:0]
array.drop(array.columns[[0,5]], axis=1, inplace=True)
for X in array:
    df['X_Lag'] = df['X'].shift(1)
    Model = df[df.columns[4:5]]
    Y = Model['Y_Lag']
    X = Model['X_Lag']

    Reg_model = sm.OLS(Y,X).fit()
    predictions = model.predict(X) 
    # make the predictions by the model

    # Print out the statistics
    model.summary()

Итак, в сущности, я хочу создать список заголовков столбцов,который, в свою очередь, будет систематически проходить через мой цикл, и каждая переменная будет отставать, а затем регрессировать против отставшей переменной Y.

Буду также признателен за знание того, как вывести модель. X, где X - X-я итерация массива, для динамического именования переменных.

1 Ответ

0 голосов
/ 27 сентября 2018

Вы близки, я думаю, вы просто путаете свою переменную X со строкой 'X' в вашем цикле.Я также думаю, что вы не рассчитываете Y_i - Y_i-1, а вместо этого просто регрессируете Y_i-1 против X_i-1.

Вот как вы бы проходили регрессии.Мы также будем использовать словарь для хранения результатов регрессии с ключами в качестве имен столбцов.

import pandas as pd
import numpy as np
import statsmodels.api as sm

df = pd.DataFrame(np.random.randint(low=0, high=10, size=(5, 5)), 
                  columns=['Historic_Rate', 'Overnight', '1M', '3M', '6M'])

fit_d = {}  # This will hold all of the fit results and summaries
for col in [x for x in df.columns if x != 'Historic_Rate']:
    Y = df['Historic_Rate'] - df['Historic_Rate'].shift(1)
    # Need to remove the NaN for fit
    Y = Y[Y.notnull()]

    X = df[col] - df[col].shift(1)
    X = X[X.notnull()]

    X = sm.add_constant(X)  # Add a constant to the fit

    fit_d[col] = sm.OLS(Y,X).fit()

Теперь, если вы хотите сделать некоторые прогнозы, скажем, для вашей последней модели, вы можете просто сделать:

fit_d['6M'].predict(sm.add_constant(df['6M']-df['6M'].shift(1)))
#0    NaN
#1    0.5
#2   -2.0
#3   -1.0
#4   -0.5
#dtype: float64

И вы можете получить резюме: fit_d['6M'].summary()

                            OLS Regression Results                            
==============================================================================
Dep. Variable:          Historic_Rate   R-squared:                       0.101
Model:                            OLS   Adj. R-squared:                 -0.348
Method:                 Least Squares   F-statistic:                    0.2254
Date:                Thu, 27 Sep 2018   Prob (F-statistic):              0.682
Time:                        11:27:33   Log-Likelihood:                -9.6826
No. Observations:                   4   AIC:                             23.37
Df Residuals:                       2   BIC:                             22.14
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         -0.4332      1.931     -0.224      0.843      -8.740       7.873
6M            -0.2674      0.563     -0.475      0.682      -2.691       2.156
==============================================================================
Omnibus:                          nan   Durbin-Watson:                   2.301
Prob(Omnibus):                    nan   Jarque-Bera (JB):                0.254
Skew:                          -0.099   Prob(JB):                        0.881
Kurtosis:                       1.781   Cond. No.                         3.44
==============================================================================
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...