03 多元线性回归
3.1 简介
多元线性回归是简单线性回归的扩展,允许我们同时研究多个自变量对因变量的影响。多元回归模型可以表示为:
其中,x1,x2,...,xp是 p 个自变量,β0 是截距,β1,β2,...,βp是对应的回归系数,ϵ是误差项。
3.2 估计回归系数
类似于简单线性回归,多元线性回归的系数估计也通常使用最小二乘法。我们选择回归系数,使得实际观测值与模型预测值之间的残差平方和最小。
在Python中,我们可以使用statsmodels
库来拟合多元线性回归模型。下面是一个示例代码:
python
import numpy as np
import pandas as pd
import statsmodels.api as sm
# 生成模拟数据
np.random.seed(0)
X = np.random.rand(100, 2) # 100个样本,每个样本有2个自变量
y = 2 + 3 * X[:, 0] + 5 * X[:, 1] + np.random.randn(100) # 因变量
# 拟合多元线性回归模型
X = sm.add_constant(X) # 添加截距项
model = sm.OLS(y, X).fit()
# 输出回归结果
print(model.summary())
在这个例子中,我们生成了两个自变量,并通过多元线性回归模型来估计它们对因变量的影响。
3.3 模型拟合与解释
多元线性回归的拟合结果包含多个回归系数,每个系数反映了对应自变量对因变量的影响。通过这些系数,我们可以判断每个自变量在控制其他变量的情况下对因变量的边际影响。
例如,如果我们在模型中包含了两个自变量 x1和 x2,我们可以解释回归系数表示在 x2不变的情况下,x1 每增加一个单位,y 增加的量。
3.4 假设检验与模型选择
在多元回归分析中,我们通常会进行假设检验来评估每个自变量的显著性。我们通常检验的假设是 H0:=0,即某个自变量对因变量没有显著影响。
在Python中,statsmodels
的回归结果会自动提供每个回归系数的 t 值和 p 值,这些值可以帮助我们进行假设检验。
此外,我们还可以使用 AIC(Akaike Information Criterion)和 BIC(Bayesian Information Criterion)等信息准则来比较不同模型的拟合效果,从而选择最佳模型。
3.5 多重共线性
多元回归模型的一个潜在问题是多重共线性,即自变量之间存在较高的相关性。这可能导致估计的回归系数不稳定,并且使得模型对数据中的噪声过于敏感。
为了检测多重共线性,我们可以计算方差膨胀因子(Variance Inflation Factor, VIF)。VIF值越高,表明自变量之间的相关性越强,通常VIF大于10被认为是共线性较强的标志。
在Python中,可以使用statsmodels
库的variance_inflation_factor
函数来计算VIF值:
python
from statsmodels.stats.outliers_influence import variance_inflation_factor
# 计算VIF值
vif = pd.DataFrame()
vif["VIF Factor"] = [variance_inflation_factor(X, i) for i in range(X.shape[1])]
vif["features"] = ["const", "x1", "x2"]
print(vif)
通过这个表格,我们可以识别出具有高VIF值的自变量,并考虑是否需要对模型进行调整,例如通过去除变量或使用正则化技术。
3.6 模型诊断
在多元线性回归中,模型诊断与简单线性回归类似,但也存在一些特有的挑战。我们依然需要检查残差的正态性、同方差性和独立性,同时还需要关注多重共线性和异常点的影响。
残差正态性
残差的正态性是最小二乘估计量的一个重要假设。可以通过绘制QQ图来检验残差是否服从正态分布。
python
import matplotlib.pyplot as plt
import scipy.stats as stats
# 绘制QQ图
sm.qqplot(model.resid, line='s')
plt.show()
残差同方差性
同方差性假设要求残差的方差在不同的自变量值上保持恒定。可以通过绘制残差与预测值的散点图来检验这一假设。
python
# 绘制残差与预测值的散点图
plt.scatter(model.fittedvalues, model.resid)
plt.axhline(y=0, color='r', linestyle='-')
plt.xlabel('Fitted values')
plt.ylabel('Residuals')
plt.show()
如果残差图显示出漏斗形状,则可能存在异方差性。
多重共线性
如前所述,多重共线性会导致回归系数的不稳定,影响模型的解释性。除了使用VIF值外,我们还可以通过观察回归系数的变化来识别共线性问题。
异常值与杠杆点
异常值和杠杆点可能会对模型产生过大的影响。可以通过Cook's距离来识别这些点。
python
influence = model.get_influence()
cooks = influence.cooks_distance[0]
plt.stem(np.arange(len(cooks)), cooks, markerfmt=",")
plt.title('Cook\'s Distance')
plt.show()
如果某些点的Cook's距离特别大,则表明它们可能对模型拟合有不成比例的影响。
3.7 高维数据中的回归
在实际应用中,自变量的数量有时可能远多于观测值的数量。这种情况下,传统的最小二乘回归可能不适用,因为模型会出现过拟合问题,预测能力下降。为了解决这一问题,通常采用以下方法:
岭回归
岭回归通过在最小二乘目标函数中添加一个惩罚项来抑制回归系数的大小,从而减小多重共线性问题对模型的影响。这个惩罚项通常是回归系数的平方和的某个倍数。
python
from sklearn.linear_model import Ridge
# 拟合岭回归模型
ridge_model = Ridge(alpha=1.0) # alpha为正则化参数
ridge_model.fit(X[:, 1:], y) # 注意在这里我们不包含截距项
# 输出回归系数
print(ridge_model.coef_)
Lasso回归
Lasso回归(Least Absolute Shrinkage and Selection Operator)也通过增加一个惩罚项来限制回归系数的绝对值,从而可以进行变量选择,即将不重要的变量系数缩为零。
python
from sklearn.linear_model import Lasso
# 拟合Lasso回归模型
lasso_model = Lasso(alpha=0.1)
lasso_model.fit(X[:, 1:], y)
# 输出回归系数
print(lasso_model.coef_)
弹性网回归
弹性网回归结合了岭回归和Lasso回归的惩罚项,适用于特征之间高度相关的情况。
python
from sklearn.linear_model import ElasticNet
# 拟合弹性网回归模型
elastic_net_model = ElasticNet(alpha=0.1, l1_ratio=0.5)
elastic_net_model.fit(X[:, 1:], y)
# 输出回归系数
print(elastic_net_model.coef_)
3.8 示例:犯罪率与社会经济因素
让我们通过一个具体的例子来理解多元线性回归。在这个例子中,我们研究一个数据集,探索城市中的犯罪率与一系列社会经济因素之间的关系。假设我们有以下变量:
- 犯罪率(因变量)
- 城市人口密度
- 城市中的失业率
- 平均收入
我们可以通过以下代码来加载数据并拟合多元线性回归模型:
python
# 假设我们有一个数据框包含以上变量
data = pd.DataFrame({
'crime_rate': np.random.rand(100),
'population_density': np.random.rand(100),
'unemployment_rate': np.random.rand(100),
'average_income': np.random.rand(100)
})
# 定义自变量和因变量
X = data[['population_density', 'unemployment_rate', 'average_income']]
y = data['crime_rate']
# 添加截距项
X = sm.add_constant(X)
# 拟合多元线性回归模型
model = sm.OLS(y, X).fit()
# 输出回归结果
print(model.summary())
这个模型将帮助我们理解不同社会经济因素如何共同影响犯罪率。通过观察回归系数和p值,我们可以识别出哪些因素对犯罪率有显著影响。