03 线性回归 (Linear Regression)
核心问题:如何量化变量之间的线性关系?
线性回归是统计学习中最基础、最重要的监督学习方法
- 拥有 200+ 年历史,但至今仍活跃于学术与工业界前沿
- 可解释性强:每个系数都有明确的经济含义
- 理论完备:拥有高斯-马尔可夫定理等坚实理论基础
- 计算高效:闭合解析解,无需迭代优化
本章目标:从 \(Y = \beta_0 + \beta_1 X + \epsilon\) 出发,构建完整的多元回归分析框架
线性回归的历史地位:从高斯到机器学习
线性回归的历史横跨 200 多年,是整个定量科学的基石
| 1805 |
最小二乘法首次应用于天文学 |
勒让德 (Legendre) |
| 1809 |
证明最小二乘法的最优性(高斯-马尔可夫) |
高斯 (Gauss) |
| 1886 |
引入’回归’概念(身高回归均值) |
高尔顿 (Galton) |
| 1960s |
计量经济学革命,Cowles 委员会 |
Haavelmo, Klein |
| 2020s |
作为深度学习最后一层,仍不可替代 |
— |
核心洞察:线性回归之所以历久弥新,是因为它在可解释性与预测效率之间取得了最佳平衡
为什么线性回归是’万法之母’?
几乎所有高级统计学习方法都可以看作对线性回归某些假设的放松或推广:
| 岭回归 / Lasso |
放松”无约束”假设 → 加入正则化 |
| 广义线性模型 (GLM) |
放松”正态分布”假设 → 连接函数 |
| 广义可加模型 (GAM) |
放松”线性关系”假设 → 非参数光滑 |
| 树模型 / 随机森林 |
放松”全局线性”假设 → 局部分段常数 |
| 神经网络 |
放松几乎所有假设 → 通用函数逼近 |
学好线性回归 = 掌握了理解所有高级方法的统一框架
线性回归的历史地位:从高斯到机器学习
线性回归的历史横跨 200 多年,是整个定量科学的基石
| 1805 |
最小二乘法首次应用于天文学 |
勒让德 (Legendre) |
| 1809 |
证明最小二乘法的最优性(高斯-马尔可夫) |
高斯 (Gauss) |
| 1886 |
引入’回归’概念(身高回归均值) |
高尔顿 (Galton) |
| 1960s |
计量经济学革命,Cowles 委员会 |
Haavelmo, Klein |
| 2020s |
作为深度学习最后一层,仍不可替代 |
— |
核心洞察:线性回归之所以历久弥新,是因为它在可解释性与预测效率之间取得了最佳平衡
为什么线性回归是’万法之母’?
几乎所有高级统计学习方法都可以看作对线性回归某些假设的放松或推广:
| 岭回归 / Lasso |
放松”无约束”假设 → 加入正则化 |
| 广义线性模型 (GLM) |
放松”正态分布”假设 → 连接函数 |
| 广义可加模型 (GAM) |
放松”线性关系”假设 → 非参数光滑 |
| 树模型 / 随机森林 |
放松”全局线性”假设 → 局部分段常数 |
| 神经网络 |
放松几乎所有假设 → 通用函数逼近 |
学好线性回归 = 掌握了理解所有高级方法的统一框架
线性回归在金融领域的四大核心应用
| 资产定价 |
CAPM / Fama-French 三因子 |
\(R_i - R_f = \alpha + \beta(R_m - R_f)\) |
| 宏观经济预测 |
泰勒规则 |
利率 ~ GDP增速 + 通胀率 |
| 公司财务分析 |
Altman Z-Score |
违约概率 ~ 财务指标组合 |
| 房地产估值 |
特征价格模型 |
房价 ~ 面积 + 区位 + 学区 |
核心本质:线性回归不仅是统计工具,更是理解经济金融运行规律的思维框架
假设违反时会怎样?——后果与对策
| 非线性 |
估计有偏 |
收益递减效应 |
多项式/对数变换 |
| \(E(\epsilon|X) \neq 0\) |
遗漏变量偏差 |
遗漏关键因素 |
工具变量/面板数据 |
| 异方差 |
SE不正确 → 推断失效 |
大小公司方差不同 |
稳健标准误/WLS |
| 自相关 |
SE偏小 → 假显著 |
时间序列数据 |
Newey-West SE |
| 完全共线性 |
\(\mathbf{X}^T\mathbf{X}\) 不可逆 |
虚拟变量陷阱 |
剔除/正则化 |
在中国 A 股数据中,异方差和遗漏变量偏差是最常遇到的两个问题
假设违反时会怎样?——后果与对策
| 非线性 |
估计有偏 |
收益递减效应 |
多项式/对数变换 |
| \(E(\epsilon|X) \neq 0\) |
遗漏变量偏差 |
遗漏关键因素 |
工具变量/面板数据 |
| 异方差 |
SE不正确 → 推断失效 |
大小公司方差不同 |
稳健标准误/WLS |
| 自相关 |
SE偏小 → 假显著 |
时间序列数据 |
Newey-West SE |
| 完全共线性 |
\(\mathbf{X}^T\mathbf{X}\) 不可逆 |
虚拟变量陷阱 |
剔除/正则化 |
在中国 A 股数据中,异方差和遗漏变量偏差是最常遇到的两个问题
线性模型的数学框架
\[ \large{Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_p X_p + \epsilon} \]
各符号的经济含义:
- \(Y\):响应变量(如营业收入、股票收益率)
- \(X_1, \ldots, X_p\):预测变量(如研发投入、宏观指标)
- \(\beta_0\):截距项,所有 \(X = 0\) 时 \(Y\) 的基准值
- \(\beta_j\):回归系数,\(X_j\) 每增加 1 单位时 \(Y\) 的平均变化量
- \(\epsilon\):误差项,捕捉所有未纳入模型的随机因素
简单线性回归:一元模型
\[ \large{Y = \beta_0 + \beta_1 X + \epsilon} \]
几何直觉:OLS 最小化的是’垂直距离’
OLS 与其他拟合准则的区别:
| OLS(最常用) |
垂直距离平方和 |
每个点到直线的纵向距离 |
| 正交回归 (TLS) |
垂直距离平方和 |
每个点到直线的垂直距离 |
| LAD(最小绝对偏差) |
垂直距离绝对值和 |
对异常值更稳健 |
为什么选择 OLS?
- 对应于条件期望的最优近似:\(E(Y|X) = \beta_0 + \beta_1 X\)
- 有闭合解析解,计算效率最高
- 在正态误差下等价于最大似然估计 (MLE)
几何直觉:OLS 最小化的是’垂直距离’
OLS 与其他拟合准则的区别:
| OLS(最常用) |
垂直距离平方和 |
每个点到直线的纵向距离 |
| 正交回归 (TLS) |
垂直距离平方和 |
每个点到直线的垂直距离 |
| LAD(最小绝对偏差) |
垂直距离绝对值和 |
对异常值更稳健 |
为什么选择 OLS?
- 对应于条件期望的最优近似:\(E(Y|X) = \beta_0 + \beta_1 X\)
- 有闭合解析解,计算效率最高
- 在正态误差下等价于最大似然估计 (MLE)
OLS 解析解:斜率与截距的闭合公式
由一阶条件推导得到:
截距估计:
\[ \large{\hat{\beta}_0 = \bar{y} - \hat{\beta}_1 \bar{x}} \]
斜率估计:
\[ \large{\hat{\beta}_1 = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sum_{i=1}^{n}(x_i - \bar{x})^2}} \]
关键性质:
- 回归线一定经过样本中心点 \((\bar{x}, \bar{y})\)
- 斜率 = 协方差 / 方差,与相关系数直接相关
补充推导:从一阶条件到 OLS 闭合解
第一步:从 \(\frac{\partial \text{RSS}}{\partial \beta_0} = 0\) 出发
\[-2\sum(y_i - \beta_0 - \beta_1 x_i) = 0 \implies n\beta_0 = \sum y_i - \beta_1 \sum x_i\]
\[ \large{\hat{\beta}_0 = \bar{y} - \hat{\beta}_1 \bar{x}} \]
第二步:将 \(\hat{\beta}_0\) 代入 \(\frac{\partial \text{RSS}}{\partial \beta_1} = 0\)
\[\sum(y_i - \bar{y} + \hat{\beta}_1\bar{x} - \hat{\beta}_1 x_i)x_i = 0\]
\[\sum(y_i - \bar{y})x_i = \hat{\beta}_1 \sum(x_i - \bar{x})x_i\]
利用 \(\sum(x_i - \bar{x})x_i = \sum(x_i - \bar{x})^2\),即得 \(\hat{\beta}_1\) 的公式
补充推导:从一阶条件到 OLS 闭合解
第一步:从 \(\frac{\partial \text{RSS}}{\partial \beta_0} = 0\) 出发
\[-2\sum(y_i - \beta_0 - \beta_1 x_i) = 0 \implies n\beta_0 = \sum y_i - \beta_1 \sum x_i\]
\[ \large{\hat{\beta}_0 = \bar{y} - \hat{\beta}_1 \bar{x}} \]
第二步:将 \(\hat{\beta}_0\) 代入 \(\frac{\partial \text{RSS}}{\partial \beta_1} = 0\)
\[\sum(y_i - \bar{y} + \hat{\beta}_1\bar{x} - \hat{\beta}_1 x_i)x_i = 0\]
\[\sum(y_i - \bar{y})x_i = \hat{\beta}_1 \sum(x_i - \bar{x})x_i\]
利用 \(\sum(x_i - \bar{x})x_i = \sum(x_i - \bar{x})^2\),即得 \(\hat{\beta}_1\) 的公式
实证:A 股上市公司销售费用对营收的影响
import numpy as np # 导入numpy用于数值计算
import pandas as pd # 导入pandas用于数据框操作
import matplotlib.pyplot as plt # 导入matplotlib用于绑图
import statsmodels.api as sm # 导入statsmodels用于OLS回归
import os # 导入os模块用于跨平台路径处理
# 配置中文字体与负号显示
plt.rcParams['font.sans-serif'] = ['Source Han Serif SC', 'SimHei', 'Arial Unicode MS'] # 中文字体优先级
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示为方块的问题
# 自动选择本地数据路径(Windows或Linux)
local_data_path = r'C:\qiufei\data\stock\financial_statement.h5' # Windows默认路径
if not os.path.exists(local_data_path): # 若不存在则切换Linux路径
local_data_path = '/home/ubuntu/r2_data_mount/qiufei/data/stock/financial_statement.h5'
df_financial_raw = pd.read_hdf(local_data_path) # 读取A股上市公司财务报表数据
df_2023_annual = df_financial_raw[df_financial_raw['quarter'] == '2023q4'].copy() # 筛选2023年年报
target_columns = ['revenue', 'selling_expense'] # 目标字段:营业收入和销售费用
df_analysis = df_2023_annual[target_columns].dropna() # 剔除缺失值
# 过滤极端小值以保证对数变换有效
df_analysis = df_analysis[(df_analysis['revenue'] > 1e7) & (df_analysis['selling_expense'] > 1e6)]
df_analysis['log_revenue'] = np.log10(df_analysis['revenue']) # 对营业收入取常用对数
df_analysis['log_selling_expense'] = np.log10(df_analysis['selling_expense']) # 对销售费用取常用对数
双对数 OLS 回归:弹性系数的经济含义
Code
# 如果样本量过大,抽样以保持图表清晰
if len(df_analysis) > 250: # 样本量超过可视化阈值
df_plot = df_analysis.sample(250, random_state=42) # 固定种子抽样
else:
df_plot = df_analysis # 全量使用
x_selling = df_plot['log_selling_expense'] # 自变量:对数销售费用
y_revenue = df_plot['log_revenue'] # 因变量:对数营业收入
X_with_const = sm.add_constant(x_selling) # 添加截距列
ols_result = sm.OLS(y_revenue, X_with_const).fit() # OLS拟合
fig, ax = plt.subplots(figsize=(10, 6)) # 创建画布
ax.scatter(x_selling, y_revenue, alpha=0.5, s=50, color='#34495e', edgecolors='white') # 散点图
x_line = np.linspace(x_selling.min(), x_selling.max(), 100) # 拟合线X坐标
y_line = ols_result.predict(sm.add_constant(x_line)) # 预测值
ax.plot(x_line, y_line, color='#e74c3c', linewidth=3, # 红色拟合线
label=f'OLS: β₁={ols_result.params.iloc[1]:.3f}, R²={ols_result.rsquared:.3f}')
ax.set_xlabel('Log₁₀(销售费用)', fontsize=12) # X轴标签
ax.set_ylabel('Log₁₀(营业收入)', fontsize=12) # Y轴标签
ax.set_title('A股制造企业:销售费用→营业收入 (双对数OLS)', fontsize=14, fontweight='bold')
ax.legend(fontsize=11) # 图例
ax.grid(True, linestyle='--', alpha=0.5) # 网格
plt.tight_layout() # 调整布局
plt.show() # 显示
经济解读:双对数模型下,\(\hat{\beta}_1\) 直接代表弹性——销售费用每增加 1%,营收平均增加 \(\hat{\beta}_1\)%
AIC 与 BIC:信息准则简介
除了调整 \(R^2\),还有两种更常用的模型比较工具:
赤池信息准则 (AIC):
\[ \large{\text{AIC} = n \ln(\text{RSS}/n) + 2p} \]
贝叶斯信息准则 (BIC):
\[ \large{\text{BIC} = n \ln(\text{RSS}/n) + p \ln(n)} \]
| AIC |
较轻(\(2p\)) |
预测最优模型 |
| BIC |
较重(\(p\ln n\)) |
更简约的模型 |
使用原则:当 \(n > 7\)(几乎总是),BIC 的惩罚更强 → 选出更小的模型
AIC 与 BIC:信息准则简介
除了调整 \(R^2\),还有两种更常用的模型比较工具:
赤池信息准则 (AIC):
\[ \large{\text{AIC} = n \ln(\text{RSS}/n) + 2p} \]
贝叶斯信息准则 (BIC):
\[ \large{\text{BIC} = n \ln(\text{RSS}/n) + p \ln(n)} \]
| AIC |
较轻(\(2p\)) |
预测最优模型 |
| BIC |
较重(\(p\ln n\)) |
更简约的模型 |
使用原则:当 \(n > 7\)(几乎总是),BIC 的惩罚更强 → 选出更小的模型
系数估计的准确性:标准误与抽样分布
OLS 估计量的方差与标准误:
\[ \large{\text{SE}(\hat{\beta}_1) = \sqrt{\frac{\sigma^2}{\sum_{i=1}^{n}(x_i - \bar{x})^2}}} \]
\[ \large{\text{SE}(\hat{\beta}_0) = \sqrt{\sigma^2\left[\frac{1}{n} + \frac{\bar{x}^2}{\sum(x_i - \bar{x})^2}\right]}} \]
其中 \(\sigma^2\) 用残差标准误 (RSE) 估计:
\[ \large{\hat{\sigma}^2 = \frac{\text{RSS}}{n - 2}} \]
为什么除以 \(n-2\)? 因为估计了 2 个参数 (\(\beta_0, \beta_1\)),消耗了 2 个自由度(贝塞尔校正)
直觉理解:什么因素决定估计的精确度?
从标准误公式 \(\text{SE}(\hat{\beta}_1) = \frac{\sigma}{\sqrt{\sum(x_i - \bar{x})^2}}\) 可知:
| 噪声 \(\sigma\) 减小 |
SE ↓ 更精确 |
数据质量越高,估计越准 |
| 样本量 \(n\) 增大 |
SE ↓ 更精确 |
更多数据带来更多信息 |
| X 的离散度增大 |
SE ↓ 更精确 |
自变量变化范围越大,越容易识别斜率 |
实验设计启示:
- 实验中应选择跨度大的自变量水平
- 增加样本量是提高精度的最直接手段
- 控制无关噪声(如行业固定效应)可有效降低 \(\sigma\)
直觉理解:什么因素决定估计的精确度?
从标准误公式 \(\text{SE}(\hat{\beta}_1) = \frac{\sigma}{\sqrt{\sum(x_i - \bar{x})^2}}\) 可知:
| 噪声 \(\sigma\) 减小 |
SE ↓ 更精确 |
数据质量越高,估计越准 |
| 样本量 \(n\) 增大 |
SE ↓ 更精确 |
更多数据带来更多信息 |
| X 的离散度增大 |
SE ↓ 更精确 |
自变量变化范围越大,越容易识别斜率 |
实验设计启示:
- 实验中应选择跨度大的自变量水平
- 增加样本量是提高精度的最直接手段
- 控制无关噪声(如行业固定效应)可有效降低 \(\sigma\)
假设检验与置信区间
t 检验:检验 \(\beta_1\) 是否显著不为零
\[ \large{t = \frac{\hat{\beta}_1}{\text{SE}(\hat{\beta}_1)} \sim t_{n-2}} \]
- \(H_0: \beta_1 = 0\)(X 与 Y 无线性关系)
- \(H_a: \beta_1 \neq 0\)(X 与 Y 存在线性关系)
- 当 \(|t|\) 足够大(p值 < 0.05),拒绝 \(H_0\)
95% 置信区间:
\[ \large{\hat{\beta}_1 \pm t_{0.025,\, n-2} \cdot \text{SE}(\hat{\beta}_1)} \]
置信区间包含了”如果我们重复无数次抽样,95% 的区间会覆盖真实参数”的含义
p 值的正确理解与常见误区
p 值的严格定义:在原假设为真的前提下,观察到与现有数据一样极端或更极端的结果的概率
| ❌ ‘p = 0.03 说明 H₀ 为真的概率是 3%’ |
✅ p 值不是 H₀ 的后验概率 |
| ❌ ‘p < 0.05 就意味着经济上重要’ |
✅ 统计显著 ≠ 经济显著(效应量才重要) |
| ❌ ‘p > 0.05 就证明 X 没有影响’ |
✅ 不拒绝 H₀ ≠ 接受 H₀(可能样本不够) |
| ❌ ‘p 值越小,效应越大’ |
✅ p 值受样本量影响(n → ∞ 时一切都显著) |
金融研究中的 p-hacking 问题:反复尝试不同变量组合直到 p < 0.05
p 值的正确理解与常见误区
p 值的严格定义:在原假设为真的前提下,观察到与现有数据一样极端或更极端的结果的概率
| ❌ ‘p = 0.03 说明 H₀ 为真的概率是 3%’ |
✅ p 值不是 H₀ 的后验概率 |
| ❌ ‘p < 0.05 就意味着经济上重要’ |
✅ 统计显著 ≠ 经济显著(效应量才重要) |
| ❌ ‘p > 0.05 就证明 X 没有影响’ |
✅ 不拒绝 H₀ ≠ 接受 H₀(可能样本不够) |
| ❌ ‘p 值越小,效应越大’ |
✅ p 值受样本量影响(n → ∞ 时一切都显著) |
金融研究中的 p-hacking 问题:反复尝试不同变量组合直到 p < 0.05
模型拟合优度:\(R^2\) 与 RSE
\(R^2\) 衡量预测变量解释了响应变量多大比例的变异:
\[ \large{R^2 = 1 - \frac{\text{RSS}}{\text{TSS}} = 1 - \frac{\sum(y_i - \hat{y}_i)^2}{\sum(y_i - \bar{y})^2}} \]
| \(R^2 = 1\) |
模型完美拟合 |
\([0, 1]\) |
| \(R^2 = 0\) |
模型无解释力(等同于均值预测) |
|
| RSE |
观测值围绕拟合线的平均偏离程度 |
\([0, +\infty)\) |
重要提醒:\(R^2\) 随变量增加只增不减 → 需要调整 \(R^2\) 惩罚模型复杂度
\(R^2\) 的四大陷阱:高 \(R^2\) 不等于好模型
| 虚假回归 |
两个趋势变量回归 \(R^2\) 极高 |
GDP ~ 手机用户数 (\(R^2 > 0.99\)) |
| 过拟合 |
变量越多 \(R^2\) 越高 |
加入250个无关变量 \(R^2 \to 1\) |
| 遗漏变量 |
\(R^2\) 高但系数有偏 |
冰淇淋销量 ~ 溺水人数 |
| 非因果 |
高 \(R^2\) 不代表因果关系 |
尼古拉斯·凯奇电影数 ~ 泳池溺水 |
正确使用 \(R^2\) 的原则:
- 比较同一数据集上不同模型的解释力
- 始终配合调整 \(R^2\) 或信息准则
- 结合理论先验判断模型是否合理
\(R^2\) 的四大陷阱:高 \(R^2\) 不等于好模型
| 虚假回归 |
两个趋势变量回归 \(R^2\) 极高 |
GDP ~ 手机用户数 (\(R^2 > 0.99\)) |
| 过拟合 |
变量越多 \(R^2\) 越高 |
加入250个无关变量 \(R^2 \to 1\) |
| 遗漏变量 |
\(R^2\) 高但系数有偏 |
冰淇淋销量 ~ 溺水人数 |
| 非因果 |
高 \(R^2\) 不代表因果关系 |
尼古拉斯·凯奇电影数 ~ 泳池溺水 |
正确使用 \(R^2\) 的原则:
- 比较同一数据集上不同模型的解释力
- 始终配合调整 \(R^2\) 或信息准则
- 结合理论先验判断模型是否合理
从一元到多元:多元线性回归
当有 \(p\) 个预测变量时:
\[ \large{Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_p X_p + \epsilon} \]
矩阵形式更简洁:
\[ \large{\mathbf{Y} = \mathbf{X}\boldsymbol{\beta} + \boldsymbol{\epsilon}} \]
其中:
- \(\mathbf{Y}\):\(n \times 1\) 响应向量
- \(\mathbf{X}\):\(n \times (p+1)\) 设计矩阵(含截距列)
- \(\boldsymbol{\beta}\):\((p+1) \times 1\) 系数向量
- \(\boldsymbol{\epsilon}\):\(n \times 1\) 误差向量
正规方程:OLS 的矩阵解析解
最小化 RSS 的矩阵推导:
\[ \text{RSS} = (\mathbf{Y} - \mathbf{X}\boldsymbol{\beta})^T(\mathbf{Y} - \mathbf{X}\boldsymbol{\beta}) \]
对 \(\boldsymbol{\beta}\) 求梯度并令其为零:
\[ \nabla_{\boldsymbol{\beta}} \text{RSS} = -2\mathbf{X}^T\mathbf{Y} + 2\mathbf{X}^T\mathbf{X}\boldsymbol{\beta} = \mathbf{0} \]
得到正规方程 (Normal Equations):
\[ \large{\mathbf{X}^T\mathbf{X}\hat{\boldsymbol{\beta}} = \mathbf{X}^T\mathbf{Y}} \]
OLS 的矩阵闭合解:
\[ \large{\hat{\boldsymbol{\beta}} = (\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T\mathbf{Y}} \]
前提:\(\mathbf{X}^T\mathbf{X}\) 必须可逆 → 否则存在完全多重共线性
矩阵推导的逐步细化
展开 RSS 的矩阵形式:
\[\text{RSS} = (\mathbf{Y} - \mathbf{X}\boldsymbol{\beta})^T(\mathbf{Y} - \mathbf{X}\boldsymbol{\beta})\]
\[= \mathbf{Y}^T\mathbf{Y} - 2\boldsymbol{\beta}^T\mathbf{X}^T\mathbf{Y} + \boldsymbol{\beta}^T\mathbf{X}^T\mathbf{X}\boldsymbol{\beta}\]
对 \(\boldsymbol{\beta}\) 求梯度(利用矩阵微分法则):
\[\nabla_{\boldsymbol{\beta}}(\boldsymbol{\beta}^T\mathbf{A}\boldsymbol{\beta}) = 2\mathbf{A}\boldsymbol{\beta}, \quad \nabla_{\boldsymbol{\beta}}(\boldsymbol{\beta}^T\mathbf{b}) = \mathbf{b}\]
\[\nabla_{\boldsymbol{\beta}} \text{RSS} = -2\mathbf{X}^T\mathbf{Y} + 2\mathbf{X}^T\mathbf{X}\boldsymbol{\beta} = \mathbf{0}\]
\[\implies \hat{\boldsymbol{\beta}} = (\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T\mathbf{Y}\]
前提:需要 \(\mathbf{X}^T\mathbf{X}\) 为正定矩阵 → 即 \(\text{rank}(\mathbf{X}) = p + 1\)
当 \(\mathbf{X}^T\mathbf{X}\) 不可逆时怎么办?
\(\mathbf{X}^T\mathbf{X}\) 不可逆(奇异)的两种常见情况:
| 完全共线性 |
某个 \(X_j\) 是其他变量的线性组合 |
OLS 无唯一解 |
| 高维问题 |
\(p > n\)(变量数 > 样本数) |
无穷多个完美拟合的解 |
解决方案预览(后续章节详解):
- 岭回归 (Ridge):\((\mathbf{X}^T\mathbf{X} + \lambda\mathbf{I})^{-1}\mathbf{X}^T\mathbf{Y}\) → 加入 \(\lambda\mathbf{I}\) 保证可逆
- Lasso:\(L_1\) 惩罚 → 自动变量选择
- 主成分回归 (PCR):先降维再回归
这些方法将在第6章线性模型选择与正则化中详细讨论
矩阵推导的逐步细化
展开 RSS 的矩阵形式:
\[\text{RSS} = (\mathbf{Y} - \mathbf{X}\boldsymbol{\beta})^T(\mathbf{Y} - \mathbf{X}\boldsymbol{\beta})\]
\[= \mathbf{Y}^T\mathbf{Y} - 2\boldsymbol{\beta}^T\mathbf{X}^T\mathbf{Y} + \boldsymbol{\beta}^T\mathbf{X}^T\mathbf{X}\boldsymbol{\beta}\]
对 \(\boldsymbol{\beta}\) 求梯度(利用矩阵微分法则):
\[\nabla_{\boldsymbol{\beta}}(\boldsymbol{\beta}^T\mathbf{A}\boldsymbol{\beta}) = 2\mathbf{A}\boldsymbol{\beta}, \quad \nabla_{\boldsymbol{\beta}}(\boldsymbol{\beta}^T\mathbf{b}) = \mathbf{b}\]
\[\nabla_{\boldsymbol{\beta}} \text{RSS} = -2\mathbf{X}^T\mathbf{Y} + 2\mathbf{X}^T\mathbf{X}\boldsymbol{\beta} = \mathbf{0}\]
\[\implies \hat{\boldsymbol{\beta}} = (\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T\mathbf{Y}\]
前提:需要 \(\mathbf{X}^T\mathbf{X}\) 为正定矩阵 → 即 \(\text{rank}(\mathbf{X}) = p + 1\)
当 \(\mathbf{X}^T\mathbf{X}\) 不可逆时怎么办?
\(\mathbf{X}^T\mathbf{X}\) 不可逆(奇异)的两种常见情况:
| 完全共线性 |
某个 \(X_j\) 是其他变量的线性组合 |
OLS 无唯一解 |
| 高维问题 |
\(p > n\)(变量数 > 样本数) |
无穷多个完美拟合的解 |
解决方案预览(后续章节详解):
- 岭回归 (Ridge):\((\mathbf{X}^T\mathbf{X} + \lambda\mathbf{I})^{-1}\mathbf{X}^T\mathbf{Y}\) → 加入 \(\lambda\mathbf{I}\) 保证可逆
- Lasso:\(L_1\) 惩罚 → 自动变量选择
- 主成分回归 (PCR):先降维再回归
这些方法将在第6章线性模型选择与正则化中详细讨论
多元回归实证:三种费用对营收的综合贡献
import numpy as np # 导入numpy用于数值运算
import pandas as pd # 导入pandas用于数据框操作
import matplotlib.pyplot as plt # 导入matplotlib用于绑图
from sklearn.linear_model import LinearRegression # 导入线性回归
from sklearn.preprocessing import StandardScaler # 导入标准化工具
np.random.seed(42) # 设置随机种子
n_firms = 250 # 模拟250家企业
# 模拟三种费用(万元)
rd_expense = np.random.uniform(100, 1000, n_firms) # 研发费用
sales_expense = np.random.uniform(80, 800, n_firms) # 销售费用
admin_expense = np.random.uniform(50, 500, n_firms) # 管理费用
# DGP: Revenue = 200 + 1.5*RD + 2.2*Sales + 0.8*Admin + ε
revenue_observed = (200 + 1.5 * rd_expense + 2.2 * sales_expense + # 真实线性关系
0.8 * admin_expense + np.random.normal(0, 150, n_firms)) # 加入噪声
df_multi = pd.DataFrame({ # 构建数据框
'研发费用': rd_expense, '销售费用': sales_expense, # 三种费用列
'管理费用': admin_expense, '营业收入': revenue_observed # 响应变量
})
feature_names = ['研发费用', '销售费用', '管理费用'] # 特征名列表
X_raw = df_multi[feature_names] # 提取特征矩阵
y_target = df_multi['营业收入'] # 提取目标向量
scaler = StandardScaler() # 实例化标准化器
X_scaled = scaler.fit_transform(X_raw) # 标准化(均值0标准差1)
model_multi = LinearRegression().fit(X_scaled, y_target) # 拟合多元回归模型
print(f'截距: {model_multi.intercept_:.2f}') # 输出截距
for name, coef in zip(feature_names, model_multi.coef_): # 遍历输出标准化系数
print(f'{name} 标准化系数: {coef:.2f}') # 标准化后系数可直接比较重要性
print(f'R² = {model_multi.score(X_scaled, y_target):.4f}') # 输出拟合优度
截距: 2212.06
研发费用 标准化系数: 399.39
销售费用 标准化系数: 476.76
管理费用 标准化系数: 98.41
R² = 0.9460
标准化系数直接反映各变量的相对重要性(消除了量纲差异)
三维可视化:回归超平面
Code
from mpl_toolkits.mplot3d import Axes3D # 导入3D绑图引擎
fig = plt.figure(figsize=(12, 8)) # 创建画布
ax = fig.add_subplot(111, projection='3d') # 添加3D子图
# 绘制散点
scatter = ax.scatter(X_scaled[:, 0], X_scaled[:, 1], y_target, # 研发(X)、销售(Y)、营收(Z)
c=y_target, cmap='viridis', s=40, alpha=0.6) # 颜色映射营收高低
# 构建网格用于绘制回归平面
x_grid = np.linspace(X_scaled[:, 0].min(), X_scaled[:, 0].max(), 20) # 研发维度网格
y_grid = np.linspace(X_scaled[:, 1].min(), X_scaled[:, 1].max(), 20) # 销售维度网格
X_mesh, Y_mesh = np.meshgrid(x_grid, y_grid) # 二维网格矩阵
Z_mesh = (model_multi.intercept_ + model_multi.coef_[0] * X_mesh + # 预测超平面
model_multi.coef_[1] * Y_mesh + model_multi.coef_[2] * 0) # 管理费用=0(均值)
ax.plot_surface(X_mesh, Y_mesh, Z_mesh, alpha=0.2, color='red') # 半透明红色回归平面
ax.set_xlabel('研发费用(标准化)', fontsize=11) # X轴
ax.set_ylabel('销售费用(标准化)', fontsize=11) # Y轴
ax.set_zlabel('营业收入(万元)', fontsize=11) # Z轴
ax.set_title('多元回归超平面', fontsize=14, fontweight='bold') # 标题
plt.tight_layout() # 调整布局
plt.show() # 显示
多元回归系数的’偏效应’含义
核心问题:多元回归中 \(\hat{\beta}_j\) 与简单回归中 \(\hat{\beta}_j\) 有何不同?
| 简单回归 \(Y \sim X_j\) |
\(X_j\) 变化1单位对 \(Y\) 的总效应(包含混淆) |
| 多元回归 \(Y \sim X_1 + \cdots + X_p\) |
控制其他变量后,\(X_j\) 变化1单位对 \(Y\) 的净效应 |
为什么系数会改变?
- 如果 \(X_j\) 与其他 \(X\) 相关,简单回归的系数包含了间接效应
- 多元回归’净化’了这些混淆,给出 ceteris paribus 效应
- 这就是计量经济学强调’控制变量’的核心原因
多元回归系数的’偏效应’含义
核心问题:多元回归中 \(\hat{\beta}_j\) 与简单回归中 \(\hat{\beta}_j\) 有何不同?
| 简单回归 \(Y \sim X_j\) |
\(X_j\) 变化1单位对 \(Y\) 的总效应(包含混淆) |
| 多元回归 \(Y \sim X_1 + \cdots + X_p\) |
控制其他变量后,\(X_j\) 变化1单位对 \(Y\) 的净效应 |
为什么系数会改变?
- 如果 \(X_j\) 与其他 \(X\) 相关,简单回归的系数包含了间接效应
- 多元回归’净化’了这些混淆,给出 ceteris paribus 效应
- 这就是计量经济学强调’控制变量’的核心原因
F 检验:整体模型的联合显著性
检验所有预测变量是否都与 \(Y\) 无关:
- \(H_0: \beta_1 = \beta_2 = \cdots = \beta_p = 0\)
- \(H_a:\) 至少有一个 \(\beta_j \neq 0\)
\[ \large{F = \frac{(\text{TSS} - \text{RSS}) / p}{\text{RSS} / (n - p - 1)} \sim F_{p,\, n-p-1}} \]
| 分子 |
模型解释的平均变异(每个自由度) |
| 分母 |
残差的平均变异(每个自由度) |
| F 值大 |
模型整体解释力显著 |
| p值 < 0.05 |
拒绝 \(H_0\),至少一个变量有用 |
F 检验与 t 检验的关系
当只有一个预测变量时 (\(p = 1\)):
\[ F = t^2 \]
F 检验与 t 检验完全等价!
当有多个变量时,F 检验回答的问题不同于 t 检验:
| t 检验 |
\(H_0: \beta_j = 0\) |
这个变量单独有没有用? |
| F 检验 |
\(H_0: \beta_1 = \cdots = \beta_p = 0\) |
这组变量作为整体有没有用? |
悖论情形:每个 t 检验都不显著,但 F 检验显著
→ 说明变量联合解释力强,但因多重共线性导致个体被掩盖
F 检验与 t 检验的关系
当只有一个预测变量时 (\(p = 1\)):
\[ F = t^2 \]
F 检验与 t 检验完全等价!
当有多个变量时,F 检验回答的问题不同于 t 检验:
| t 检验 |
\(H_0: \beta_j = 0\) |
这个变量单独有没有用? |
| F 检验 |
\(H_0: \beta_1 = \cdots = \beta_p = 0\) |
这组变量作为整体有没有用? |
悖论情形:每个 t 检验都不显著,但 F 检验显著
→ 说明变量联合解释力强,但因多重共线性导致个体被掩盖
变量选择与多重共线性诊断
单变量显著性:对每个 \(\beta_j\) 做 t 检验
多重共线性:预测变量间高度相关时的危害:
- 系数估计不稳定,方向可能反转
- 标准误膨胀,本应显著的变量变得不显著
- 解释力被”瓜分”
方差膨胀因子 (VIF) 诊断:
\[ \large{\text{VIF}(\hat{\beta}_j) = \frac{1}{1 - R_j^2}} \]
| 1 ~ 5 |
可接受 |
| 5 ~ 10 |
中度共线性,需关注 |
| > 10 |
严重共线性,必须处理 |
处理方法:剔除冗余变量、PCA 降维、岭回归 / Lasso
中国上市公司数据中的共线性典型案例
场景:用多个财务指标预测 ROE
| 总资产 |
企业规模 |
与营收、利润高度相关 |
| 营业收入 |
销售规模 |
与总资产相关 (VIF > 15) |
| 营业利润 |
盈利规模 |
几乎是营收的固定比例 |
| 所有者权益 |
净资产 |
与总资产高度相关 |
诊断结果:营收与总资产的 VIF 往往超过 10,甚至达到 50+
实践策略:
- 只保留总资产作为规模代理变量
- 或者用总资产周转率 = 营收/总资产,将两个变量合并为一个比率
- 规模效应可用对数变换缓解
中国上市公司数据中的共线性典型案例
场景:用多个财务指标预测 ROE
| 总资产 |
企业规模 |
与营收、利润高度相关 |
| 营业收入 |
销售规模 |
与总资产相关 (VIF > 15) |
| 营业利润 |
盈利规模 |
几乎是营收的固定比例 |
| 所有者权益 |
净资产 |
与总资产高度相关 |
诊断结果:营收与总资产的 VIF 往往超过 10,甚至达到 50+
实践策略:
- 只保留总资产作为规模代理变量
- 或者用总资产周转率 = 营收/总资产,将两个变量合并为一个比率
- 规模效应可用对数变换缓解
定性预测变量:虚拟变量编码
对于分类变量(如企业性质),引入虚拟变量 (Dummy Variable):
\[ D_i = \begin{cases} 1 & \text{国有企业} \\ 0 & \text{民营企业} \end{cases} \]
模型:\(Y_i = \beta_0 + \beta_1 D_i + \epsilon_i\)
系数的经济含义:
- \(\beta_0\):民营企业的平均值(基准组)
- \(\beta_0 + \beta_1\):国有企业的平均值
- \(\beta_1\):两组之间的平均差异
多分类变量(如行业)需要 \(k-1\) 个虚拟变量编码 \(k\) 个类别
线性模型的扩展:交互效应
可加性假设的放松:变量之间可能存在协同效应
\[ \large{Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3(X_1 \times X_2) + \epsilon} \]
交互项 \(\beta_3\) 的含义:
- \(\beta_3 > 0\):两个变量有正向协同效应
- \(\beta_3 < 0\):两个变量有负向协同效应
- \(\beta_3 = 0\):无交互,退化为标准可加模型
金融案例:研发投入在低竞争行业中的产出比是否高于高竞争行业?
\[ \text{Revenue} = \beta_0 + \beta_1 X_{RD} + \beta_2 X_{HHI} + \beta_3(X_{RD} \times X_{HHI}) + \epsilon \]
交互项的经济直觉:协同与替代
\(Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3(X_1 \times X_2) + \epsilon\)
\(X_1\) 对 Y 的边际效应不再是常数:
\[ \frac{\partial Y}{\partial X_1} = \beta_1 + \beta_3 X_2 \]
即 \(X_1\) 的效应取决于 \(X_2\) 的水平!
| \(> 0\) |
互补/协同 |
研发投入在知识产权保护强的地区回报更高 |
| \(< 0\) |
替代 |
线上广告减弱了线下广告的边际效果 |
| \(= 0\) |
可加 |
两因素独立作用,无协同 |
层级原则:如果模型包含交互项 \(X_1 \times X_2\),则必须同时包含 \(X_1\) 和 \(X_2\) 的主效应
交互项的经济直觉:协同与替代
\(Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3(X_1 \times X_2) + \epsilon\)
\(X_1\) 对 Y 的边际效应不再是常数:
\[ \frac{\partial Y}{\partial X_1} = \beta_1 + \beta_3 X_2 \]
即 \(X_1\) 的效应取决于 \(X_2\) 的水平!
| \(> 0\) |
互补/协同 |
研发投入在知识产权保护强的地区回报更高 |
| \(< 0\) |
替代 |
线上广告减弱了线下广告的边际效果 |
| \(= 0\) |
可加 |
两因素独立作用,无协同 |
层级原则:如果模型包含交互项 \(X_1 \times X_2\),则必须同时包含 \(X_1\) 和 \(X_2\) 的主效应
非线性关系:多项式回归
线性假设的放松:真实关系可能呈 U 型或倒 U 型
\[ \large{Y = \beta_0 + \beta_1 X + \beta_2 X^2 + \epsilon} \]
经典案例——熊彼特假设:公司规模与创新效率的倒 U 型关系
- \(\beta_2 < 0\):存在最优规模,超过后边际效益转负
- 最优规模点:\(X^* = -\frac{\beta_1}{2\beta_2}\)
from sklearn.preprocessing import PolynomialFeatures # 导入多项式特征生成器
from sklearn.pipeline import Pipeline # 导入管道工具
np.random.seed(42) # 固定随机种子
n_obs = 200 # 200个观测
x_budget = np.random.uniform(0, 300, n_obs) # 广告预算
# 二次关系:边际收益递减
y_sales = 5 + 0.06 * x_budget - 0.0001 * x_budget**2 + np.random.normal(0, 2, n_obs)
模型复杂度对比:欠拟合 vs 适度拟合 vs 过拟合
Code
from sklearn.metrics import r2_score # 导入R²评分
fig, axes = plt.subplots(1, 3, figsize=(18, 5)) # 1行3列
degrees = [1, 2, 10] # 三种阶数
colors = ['steelblue', 'darkgreen', 'crimson'] # 对应颜色
titles = ['线性(欠拟合)', '二次(适度)', '10次(过拟合)'] # 标题
for i, (deg, clr, ttl) in enumerate(zip(degrees, colors, titles)): # 遍历
pipe = Pipeline([('poly', PolynomialFeatures(deg)), ('lr', LinearRegression())]) # 管道
pipe.fit(x_budget.reshape(-1, 1), y_sales) # 拟合
x_grid = np.linspace(0, 300, 300).reshape(-1, 1) # 网格
y_pred = pipe.predict(x_grid) # 预测
r2 = r2_score(y_sales, pipe.predict(x_budget.reshape(-1, 1))) # R²
axes[i].scatter(x_budget, y_sales, alpha=0.4, color='gray', s=40) # 散点
axes[i].plot(x_grid, y_pred, color=clr, linewidth=2.5) # 拟合线
axes[i].set_title(f'{ttl}\nR²={r2:.4f}', fontsize=13, fontweight='bold') # 标题
axes[i].set_xlabel('广告预算(万元)', fontsize=11) # X轴
axes[i].set_ylabel('销售量(千件)', fontsize=11) # Y轴
axes[i].grid(True, alpha=0.3) # 网格
plt.tight_layout() # 调整
plt.show() # 显示
第2章的偏差-方差权衡在此完美体现:复杂度太低偏差大,太高方差大
残差图实战:如何’读’残差图
将残差 \(e_i = y_i - \hat{y}_i\) 对 \(\hat{y}_i\) 绑图,不同模式的含义:
| 随机散布(无模式) |
✅ 假设满足 |
无需调整 |
| U 型或倒 U 型 |
❌ 非线性 |
加多项式项/变换 |
| 喇叭形(越来越宽) |
❌ 异方差 |
对数变换/WLS |
| 锯齿形/周期性 |
❌ 自相关 |
差分/滞后项 |
| 个别极端点 |
⚠️ 异常值 |
检查 Cook 距离 |
最佳实践:拟合任何回归模型后的第一步就是画残差图
中国金融数据中最常见的假设违反
异方差——几乎在所有截面数据中存在
- 大公司和小公司的残差方差差异巨大
- 解决:使用 White 稳健标准误 或 HC3 标准误
- Python:
model.get_robustcov_results(cov_type='HC3')
遗漏变量 / 内生性——因果推断的最大障碍
- 管理层能力、公司文化等不可观测因素
- 解决:面板固定效应、工具变量 (IV)、DID
自相关——在时间序列回归中普遍存在
- 股票收益率存在短期动量和长期反转
- 解决:Newey-West 标准误、ARMA 模型
实际操作原则:始终报告稳健标准误,不要依赖默认标准误
残差图实战:如何’读’残差图
将残差 \(e_i = y_i - \hat{y}_i\) 对 \(\hat{y}_i\) 绑图,不同模式的含义:
| 随机散布(无模式) |
✅ 假设满足 |
无需调整 |
| U 型或倒 U 型 |
❌ 非线性 |
加多项式项/变换 |
| 喇叭形(越来越宽) |
❌ 异方差 |
对数变换/WLS |
| 锯齿形/周期性 |
❌ 自相关 |
差分/滞后项 |
| 个别极端点 |
⚠️ 异常值 |
检查 Cook 距离 |
最佳实践:拟合任何回归模型后的第一步就是画残差图
中国金融数据中最常见的假设违反
异方差——几乎在所有截面数据中存在
- 大公司和小公司的残差方差差异巨大
- 解决:使用 White 稳健标准误 或 HC3 标准误
- Python:
model.get_robustcov_results(cov_type='HC3')
遗漏变量 / 内生性——因果推断的最大障碍
- 管理层能力、公司文化等不可观测因素
- 解决:面板固定效应、工具变量 (IV)、DID
自相关——在时间序列回归中普遍存在
- 股票收益率存在短期动量和长期反转
- 解决:Newey-West 标准误、ARMA 模型
实际操作原则:始终报告稳健标准误,不要依赖默认标准误
调整 \(R^2\):惩罚模型复杂度
\(R^2\) 随变量增加只增不减 → 不适合比较不同复杂度的模型
\[ \large{\text{Adjusted } R^2 = 1 - \frac{\text{RSS}/(n - p - 1)}{\text{TSS}/(n - 1)}} \]
对比:
| \(R^2\) |
只增不减 |
固定变量数的模型评估 |
| 调整 \(R^2\) |
增加无用变量时会下降 |
不同变量数的模型比较 |
| AIC / BIC |
信息准则,惩罚更严 |
模型选择 |
经验法则:优先参考调整 \(R^2\),辅以 AIC/BIC
回归分析的完整工作流程
| 1. 理论建模 |
基于经济理论选择变量 |
有理论支撑吗? |
| 2. 数据准备 |
清洗、变换、标准化 |
有缺失值/异常值吗? |
| 3. 模型拟合 |
OLS 回归 |
系数符号合理吗? |
| 4. 统计推断 |
t/F检验、置信区间 |
显著性与经济意义一致吗? |
| 5. 模型诊断 |
残差图、VIF、DW检验 |
假设满足吗? |
| 6. 稳健性检验 |
换变量、换样本、换方法 |
结果稳定吗? |
| 7. 结果解读 |
经济含义、政策启示 |
因果还是相关? |
“没有诊断的回归是不完整的回归”
回归分析的完整工作流程
| 1. 理论建模 |
基于经济理论选择变量 |
有理论支撑吗? |
| 2. 数据准备 |
清洗、变换、标准化 |
有缺失值/异常值吗? |
| 3. 模型拟合 |
OLS 回归 |
系数符号合理吗? |
| 4. 统计推断 |
t/F检验、置信区间 |
显著性与经济意义一致吗? |
| 5. 模型诊断 |
残差图、VIF、DW检验 |
假设满足吗? |
| 6. 稳健性检验 |
换变量、换样本、换方法 |
结果稳定吗? |
| 7. 结果解读 |
经济含义、政策启示 |
因果还是相关? |
“没有诊断的回归是不完整的回归”