原文链接:https://www.joinquant.com/view/community/detail/ab2a6ecda285c5415de0e1a43db68914
Statsmodels 是 Python 中一个强大的统计分析包,包含了回归分析、时间序列分析、假设检
验等等的功能。Statsmodels 在计量的简便性上是远远不及 Stata 等软件的,但它的优点在于可以与 Python 的其他的任务(如 NumPy、Pandas)有效结合,提高工作效率。在本文中,我们重点介绍最回归分析中最常用的 OLS(ordinary least square)功能。
当你需要在 Python 中进行回归分析时……
import statsmodels.api as sm!!!
在一切开始之前
上帝导入了 NumPy(大家都叫它囊派?我叫它囊辟),
import numpy as np
便有了时间。
上帝导入了 matplotlib,
import matplotlib.pyplot as plt
便有了空间。
上帝导入了 Statsmodels,
import statsmodels.api as sm
世界开始了。
假设我们有回归模型
Y=β0+β1X1+⋯+βnXn+ε,
并且有 k 组数据 。OLS 回归用于计算回归系数 βi 的估值 b0,b1,…,bn,使误差平方
最小化。
statsmodels.OLS 的输入有 (endog, exog, missing, hasconst) 四个,我们现在只考虑前两个。第一个输入 endog 是回归中的反应变量(也称因变量),是上面模型中的 y(t), 输入是一个长度为 k 的 array。第二个输入 exog 则是回归变量(也称自变量)的值,即模型中的x1(t),…,xn(t)。但是要注意,statsmodels.OLS 不会假设回归模型有常数项,所以我们应该假设模型是
并且在数据中,对于所有 t=1,…,k,设置 x0(t)=1。因此,exog的输入是一个 k×(n+1) 的 array,其中最左一列的数值全为 1。往往输入的数据中,没有专门的数值全为1的一列,Statmodels 有直接解决这个问题的函数:sm.add_constant()。它会在一个 array 左侧加上一列 1。(本文中所有输入 array 的情况也可以使用同等的 list、pd.Series 或 pd.DataFrame。)
确切地说,statsmodels.OLS 是 statsmodels.regression.linear_model 里的一个函数(从这个命名也能看出,statsmodel 有很多很多功能,其中的一项叫回归)。它的输出结果是一个 statsmodels.regression.linear_model.OLS,只是一个类,并没有进行任何运算。在 OLS 的模型之上调用拟合函数 fit(),才进行回归运算,并且得到 statsmodels.regression.linear_model.RegressionResultsWrapper,它包含了这组数据进行回归拟合的结果摘要。调用 params 可以查看计算出的回归系数 b0,b1,…,bn。
简单的线性回归
上面的介绍绕了一个大圈圈,现在我们来看一个例子,假设回归公式是:
我们从最简单的一元模型开始,虚构一组数据。首先设定数据量,也就是上面的 k 值。
nsample = 100
然后创建一个 array,是上面的 x1 的数据。这里,我们想要 x1 的值从 0 到 10 等差排列。
x = np.linspace(0, 10, nsample)
使用 sm.add_constant() 在 array 上加入一列常项1。
X = sm.add_constant(x)
然后设置模型里的 β0,β1,这里要设置成 1,10。
beta = np.array([1, 10])
然后还要在数据中加上误差项,所以生成一个长度为k的正态分布样本。
e = np.random.normal(size=nsample)
由此,我们生成反应项 y(t)。
y = np.dot(X, beta) + e
好嘞,在反应变量和回归变量上使用 OLS() 函数。
model = sm.OLS(y,X)
然后获取拟合结果。
results = model.fit()
再调取计算出的回归系数。
print(results.params)
得到
[ 1.04510666, 9.97239799]
和实际的回归系数非常接近。
当然,也可以将回归拟合的摘要全部打印出来。
print(results.summary())
得到
Adj. R-squared:俗称 R平方。反映了模型的拟合。R平方值的范围从 0 到 1,其中较高的值通常表示更好的拟合,假设满足某些条件; const coef:这个系数是你的 Y 截距。这意味着如果 Interest_Rate 和 Unemployment_Rate 系数都为零,则预期输出(即 Y)将等于 const 系数; Interest_Rate:表示由于利率中一个单位的而变化导致的输出 Y 的变化(其他一切保持不变); Unemployment_Rate:表示由于失业率中一个单位的变化导致的产出 Y 的变化(其他一切保持不变); std err:反映了系数的准确度,它越低,准确度越高; P>|t|:这是 p 值,p 值小于 0.05 被认为是统计学上显著的; Confidence Interval:这是置信区间,表示我们的系数可能下降的范围(可能性为 95%);