python - 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 次迭代,用于变量的动态命名。
解决方案
您很接近,我认为您只是将变量与循环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
==============================================================================
推荐阅读
- debian - Apache2 sites-enabled/deafault.conf 重定向不正确?
- identityserver4 - 在 AddSigningCredential() 中传递 SSL 证书,获取 X509 证书没有私钥。我该如何解决这个问题?
- python - 如何使用并行处理多次调用同一个函数?
- ubuntu - 如何将gitlab从旧版本迁移到新版本?
- laravel - 存储:链接在托管 cPanel 上不起作用
- javascript - 性能:常规 vs 箭头函数
- python - 能够清除文本框但不能发送新文本
- sql-server - 复制条件表时是否考虑了身份增量?
- ios - iOS 应用 Spotlight 搜索不会出现在应用程序上
- wordpress - 我如何在 wordpress 用户部分添加“subsubsub”快速链接