文章目录
- 1. 多元回归拟合代码
- 2. 分析结果
- 3. 完整案例
- 参考资料
1. 多元回归拟合代码
首先构造一个任意的dataframe
:
import pandas as pd
import numpy as np
import statsmodels.api as sm
df = pd.DataFrame(data=np.random.randint(0, 20, size=(100, 4)),
columns=['x1', 'x2', 'x3', 'y'])
# 开始切分x与y
X = df.loc[:, 'x1':'x3']
Y = df['y']
构造的dataframe如下:
x1 | x2 | x3 | y | |
---|---|---|---|---|
0 | 12 | 13 | 1 | 10 |
1 | 11 | 10 | 9 | 8 |
2 | 12 | 18 | 18 | 2 |
3 | 18 | 11 | 18 | 12 |
… | … | … | … | … |
然后切分出自变量与因变量:
X = df.loc[:, 'x1':'x3']
Y = df['y']
然后使用statsmodels
拟合数据:
X = sm.add_constant(X) # adding a constant
model = sm.OLS(Y, X).fit()
这样就拟合成功了,预测:
predictions = model.predict(X)
predictions即为模型对原来训练集数据的预测结果,这里可以换成新的测试集数据
2. 分析结果
- 打印全部的结果:
print(model.summary())
得到如下的表格:
==============================================================================
Dep. Variable: y R-squared: 0.032
Model: OLS Adj. R-squared: 0.001
Method: Least Squares F-statistic: 1.046
Date: Fri, 11 Jun 2021 Prob (F-statistic): 0.376
Time: 10:29:28 Log-Likelihood: -316.20
No. Observations: 100 AIC: 640.4
Df Residuals: 96 BIC: 650.8
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 5.8099 1.793 3.241 0.002 2.252 9.368
x1 0.1445 0.094 1.533 0.128 -0.043 0.332
x2 0.0976 0.104 0.936 0.352 -0.109 0.305
x3 0.0169 0.102 0.165 0.869 -0.186 0.220
==============================================================================
Omnibus: 27.225 Durbin-Watson: 1.684
Prob(Omnibus): 0.000 Jarque-Bera (JB): 5.946
Skew: 0.162 Prob(JB): 0.0512
Kurtosis: 1.850 Cond. No. 55.4
==============================================================================
- 得到拟合的结果
coef
为拟合出的系数,使用如下代码可以打印出来:
print(model.params)
其他变量:
- Dep.Variable: 就是因变量,dependent variable,也就是咱们输入的y1,不过这里statsmodels用y来表示模型的结果。
- Model:就是最小二乘模型,这里就是OLS。
- Date/Time:模型生成的日期/时间
- No. Observations:样本量
- Df Residuals:残差自由度(degree of freedom of residuals),其值= No.Observations - Df Model - 1
- Df Model:模型自由度(degree of freedom of model),值等于输入的维度,这里x1,x2,x3是三个维度
- Covariance Type:协方差阵的稳健性
- R-squared:决定系数,计算方法为SSR/SST,SSR是Sum of Squares for Regression,SST是Sum of Squares for Total
- Adj. R-squared:利用奥卡姆剃刀修正后的R-squared值(奥卡姆剃刀是一种理论,认为通用的模型倾向于更简单的参数,正所谓大道至简)
- F-statistic:F检验,这个值越大越能推翻原假设,值越大说明模型是线性模型,原假设是“我们的模型不是线性模型”。
- Prob (F-statistic):为F-statistic的概率,值越小越能拒绝原假设,本例中为1.25e-08,该值非常小了,足以证明我们的模型是线性显著的
- Log likelihood:对数似然
- AIC:赤池信息量,其用来衡量拟合的好坏程度,一般选择AIC较小的模型
- BIC:贝叶斯信息准则
- std err:系数估计的标准误差。
- t:就是我们常用的t统计量,这个值越大越能拒绝原假设。
- P>|t|:统计检验中的P值,这个值越小越能拒绝原假设。
- [0.025, 0.975]:置信度为95%的置信区间的下限和上限。
- Omnibus:基于峰度和偏度进行数据正态性的检验,通常与Jarque-Bera检验共同使用
- Prob(Omnibus):Omnibus检验的概率。
- Durbin-Watson:检验残差中是否存在自相关,其主要通过确定两个相邻误差项的相关性是否为零来检验回归残差是否存在自相关。
- Skewness:偏度
- Kurtosis:峰度
- Jarque-Bera(JB):同样是基于峰度和偏度进行数据正态性的检验,通常与Omnibus检验共同使用
- Prob(JB):JB检验的概率。
- Cond. No.:多重共线性的检验,即检验变量之间是否存在精确相关关系或高度相关关系
3. 完整案例
import pandas as pd
import numpy as np
import statsmodels.api as sm
df = pd.DataFrame(data=np.random.randint(0, 20, size=(100, 4)),
columns=['x1', 'x2', 'x3', 'y'])
# 开始切分x与y
X = df.loc[:, 'x1':'x3']
Y = df['y']
X = sm.add_constant(X) # adding a constant
model = sm.OLS(Y, X).fit()
predictions = model.predict(X)
print_model = model.summary()
print(print_model)
参考资料
- youtube相关教程:https://www.youtube.com/watch?v=L_h7XFUGWAk
- statsmodels.regression.linear_model.OLS 官方文档:https://www.statsmodels.org/stable/generated/statsmodels.regression.linear_model.OLS.html#generated-statsmodels-regression-linear-model-ols–page-root
- Ordinary Least Squares官方文档:https://www.statsmodels.org/dev/examples/notebooks/generated/ols.html#examples-notebooks-generated-ols–page-root