首页 > 解决方案 > Python:为简单的 OLS 循环变量

问题描述

我正在寻找在 Python 中构建一个函数,它使用以下等式创建一个简单的 OLS 回归:

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

换句话说,Y_Lag = alpha + beta(X_Lag) + Error term

目前,我有以下数据集(这是一个简短的版本)

注意: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 变量进行回归。

我也很欣赏如何输出 model.X 的知识,其中 X 是数组的第 X 次迭代,用于变量的动态命名。

标签: pythonpandasnumpyfor-loopregression

解决方案


您很接近,我认为您只是将变量与循环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
==============================================================================

推荐阅读