📑 查看全课大纲(第 11 / 20 节)

主成分回归与共线性消除

约 58 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · 多元统计分析

在上一节中,我们掌握了主成分分析(PCA)的核心原理与性质,学会了如何从高维数据中提取信息最丰富的少数几个综合变量。本节我们将深入探讨主成分分析在实际应用中的两个关键问题:如何正确处理量纲差异以及如何利用主成分进行综合评价。更重要的是,我们将学习如何将主成分分析与回归分析相结合,形成主成分回归(PCR),以解决多元线性回归中令人头疼的多重共线性问题。学完本节,你将能够独立完成从数据标准化、主成分提取到综合评价排序,再到利用主成分构建稳健回归模型的完整分析流程。

💡 核心导读

  1. 标准化与否的权衡:探讨在主成分分析中,何时应基于协方差矩阵 Σ\Sigma,何时应基于相关系数矩阵 RR,理解标准化对分析结果的实质影响。
  2. 主成分综合评价:学习如何利用主成分得分和方差贡献率,为复杂多指标的评价对象(如企业、地区)计算一个综合得分并进行排序。
  3. 主成分回归原理:理解多重共线性对普通最小二乘(OLS)回归的危害,掌握通过主成分分析提取不相关的综合变量,再对因变量进行回归,最终还原为原始变量关系的方法。
  4. Python实战流程:使用 scikit-learnstatsmodels 库,完整实现主成分分析、综合评价以及主成分回归,并与普通OLS回归结果进行对比。

一、主成分分析应用中的关键问题

1.1 出发点:协方差矩阵还是相关系数矩阵?

在实际数据分析中,我们遇到的变量往往具有不同的量纲(例如,产值以“百万元”计,利税以“万元”计)。回顾主成分的性质2:所有主成分的方差之和等于原始变量的总方差之和,即 i=1pλi=i=1pσii\sum_{i=1}^{p} \lambda_i = \sum_{i=1}^{p} \sigma_{ii}。当量纲不同时,将不同物理含义的方差直接相加,其意义并不明确。

为了消除量纲影响,一个常见的做法是对原始变量进行标准化处理: Xi=XiE(Xi)D(Xi),i=1,2,,pX_i^* = \frac{X_i - E(X_i)}{\sqrt{D(X_i)}}, \quad i=1,2,\dots,p 标准化后,变量 XiX_i^* 的均值为0,方差为1。此时,原始变量的协方差矩阵 Σ\Sigma 就变成了标准化变量的相关系数矩阵 RR

那么,进行主成分分析时,究竟应该使用 Σ\Sigma 还是 RR

这并非一个有确定答案的问题,而是一个需要权衡的决策:

  • 使用协方差矩阵 Σ\Sigma:主成分的提取会优先照顾方差大的变量。如果变量量纲相似(如都是货币单位,只是数量级不同),或者你希望保留变量原始方差所代表的信息量差异,则应使用 Σ\Sigma
  • 使用相关系数矩阵 RR:标准化将所有变量的方差强行调整为1,抹杀了原始变量在信息含量(方差大小)上的差异。这使得所有变量在主成分构成中的初始“权重”变得相等。当变量量纲完全不同(如长度、重量、温度)或数量级悬殊时,使用 RR 是更合理的选择,它使得分析结果不受测量单位的影响。

结论:对于同度量或相似量级的变量,建议使用原始的协方差矩阵 Σ\Sigma 求解主成分。如果各指标数量级相差悬殊或有完全不同的物理量纲,则应使用标准化变量的相关系数矩阵 RR(或等价地,使用标准化变量的协方差矩阵)进行主成分分析。需要强调的是,从 Σ\Sigma 和从 RR 出发求得的主成分通常是不同的,有时差异会很大。

1.2 利用主成分进行综合评价

综合评价的核心是将多个指标综合成一个单一的得分,以便对样本进行排序。例如,评价多个地区的综合发展水平,涉及经济、社会、环境等多个维度的指标。

主成分分析为此提供了优雅的解决方案:

  1. 降维与信息提取:对 pp 个原始指标进行主成分分析,提取前 mm 个主成分 Y1,Y2,,YmY_1, Y_2, \dots, Y_m,它们互不相关且包含了原始数据的大部分信息。
  2. 计算主成分得分:将第 tt 个样本的(标准化后)观测值 x(t)=(x1(t),,xp(t))\mathbf{x}^{(t)} = (x_{1}^{(t)}, \dots, x_{p}^{(t)})' 代入主成分表达式 Yi=tiXY_i = \mathbf{t}_i' \mathbf{X},得到该样本在第 ii 个主成分上的得分 yi(t)y_i^{(t)}
  3. 确定综合权重:以各主成分的方差贡献率作为其权重是合理的选择。方差贡献率 λi/j=1pλj\lambda_i / \sum_{j=1}^{p} \lambda_j 反映了该主成分所包含的原始信息量大小,信息量越大,在综合评价中的权重也应越大。
  4. 构建综合评价函数:对前 mm 个主成分的得分进行加权求和,得到每个样本的综合得分 ZZZ=w1Y1+w2Y2++wmYmZ = w_1 Y_1 + w_2 Y_2 + \dots + w_m Y_m 其中权重 wiw_i 通常取为前 mm 个主成分的“归一化”方差贡献率: wi=λij=1mλj,i=1,,mw_i = \frac{\lambda_i}{\sum_{j=1}^{m} \lambda_j}, \quad i=1,\dots,m
  5. 排序与评价:根据综合得分 ZZ 对样本进行排序,得分高者综合表现更优。

二、主成分回归:消除多重共线性的利器

2.1 多元线性回归与多重共线性问题

首先,我们回顾多元线性回归模型: y=Xβ+ε\mathbf{y} = \mathbf{X} \boldsymbol{\beta} + \boldsymbol{\varepsilon} 其中 X\mathbf{X}n×pn \times p 的设计矩阵(通常包含一列1以估计截距项),β\boldsymbol{\beta} 是系数向量。其普通最小二乘(OLS)估计为: β^=(XX)1Xy\hat{\boldsymbol{\beta}} = (\mathbf{X}'\mathbf{X})^{-1} \mathbf{X}'\mathbf{y}

OLS估计的一个关键前提是自变量之间不存在严重的多重共线性,即 X\mathbf{X} 的列向量近似线性无关。如果存在多重共线性(例如,两个自变量高度相关),会导致:

  1. (XX)(\mathbf{X}'\mathbf{X}) 接近奇异,其逆矩阵不稳定,使得 β^\hat{\boldsymbol{\beta}} 的估计值方差很大,对数据微小变化异常敏感。
  2. 系数的t检验可能不显著,但模型的整体F检验却显著。
  3. 系数的符号或大小可能与理论预期不符,难以解释。

2.2 主成分回归的原理与步骤

主成分回归巧妙地运用主成分分析来解决多重共线性问题。其核心思想是:将存在共线性的原始自变量 X\mathbf{X},转换为一组互不相关的主成分 Z\mathbf{Z},然后用因变量 y\mathbf{y} 对主成分 Z\mathbf{Z} 进行回归,最后将关系还原到原始自变量空间。

主成分回归三步法

  1. 主成分提取:对自变量 X\mathbf{X}(通常先标准化)进行主成分分析,提取前 kk (kpk \le p) 个主成分 Zn×k=Xn×pTp×k\mathbf{Z}_{n \times k} = \mathbf{X}_{n \times p} \mathbf{T}_{p \times k},其中 T\mathbf{T} 是由前 kk 个特征向量构成的主成分系数矩阵。
  2. 主成分回归:建立 y\mathbf{y}Z\mathbf{Z} 的回归模型: y=Zγ+ε\mathbf{y} = \mathbf{Z} \boldsymbol{\gamma} + \boldsymbol{\varepsilon} 由于 Z\mathbf{Z} 的列是正交的,多重共线性被彻底消除,可以用OLS稳定地估计系数 γ^=(ZZ)1Zy\hat{\boldsymbol{\gamma}} = (\mathbf{Z}'\mathbf{Z})^{-1} \mathbf{Z}'\mathbf{y}
  3. 系数还原:将主成分回归系数 γ^\hat{\boldsymbol{\gamma}} 转换回原始自变量空间。因为 Z=XT\mathbf{Z} = \mathbf{X}\mathbf{T},所以 y=XTγ+ε\mathbf{y} = \mathbf{X}\mathbf{T}\boldsymbol{\gamma} + \boldsymbol{\varepsilon}。对比原始模型 y=Xβ+ε\mathbf{y} = \mathbf{X}\boldsymbol{\beta} + \boldsymbol{\varepsilon},可得原始变量系数估计为: β^PCR=Tγ^\hat{\boldsymbol{\beta}}_{PCR} = \mathbf{T} \hat{\boldsymbol{\gamma}}

通过主成分回归,我们既利用了主成分的正交性消除了共线性,又通过选择保留信息量大的主成分(通常根据累计方差贡献率),实现了降维,有时还能提升模型的预测能力。

2.3 Python实战:主成分回归与OLS对比

下面我们通过一个模拟示例,演示如何用Python实现主成分回归,并与存在多重共线性下的普通OLS回归进行对比。

"""
多元统计分析 5.2 主成分回归与共线性消除
验证主成分回归 (PCR) 消除多重共线性并与普通 OLS 结果对比
"""
import numpy as np
import statsmodels.api as sm
from sklearn.decomposition import PCA

# 1. 生成模拟数据(存在强多重共线性)
np.random.seed(42)
n = 80
# 生成一个潜在公共因子 z
z = np.random.uniform(1, 10, size=n)
# 生成三个高度相关的自变量 x1, x2, x3
x1 = z + np.random.normal(0, 0.2, size=n)          # x1 与 z 强相关
x2 = 2 * z + np.random.normal(0, 0.2, size=n)      # x2 与 z 强相关,且与 x1 共线
x3 = -z + np.random.normal(0, 0.2, size=n)         # x3 与 z 负相关
# 构建设计矩阵 X
X = np.column_stack([x1, x2, x3])
# 生成因变量 y,其真实模型为 y = 1.5*x1 + 2.0*x2 + 0.5*x3 + noise
y = 1.5 * x1 + 2.0 * x2 + 0.5 * x3 + np.random.normal(0, 1.0, size=n)

# 2. 普通最小二乘回归 (OLS)
X_ols = sm.add_constant(X)  # 添加常数项
ols_model = sm.OLS(y, X_ols).fit()

# 3. 主成分回归 (PCR)
# 3.1 主成分分析,选择主成分个数 (这里第一个主成分贡献率已极高,取1个)
pca = PCA(n_components=1)
X_pca = pca.fit_transform(X)  # 注意:此处未标准化,因模拟数据量纲一致。实际应用常先标准化。
# 3.2 用主成分得分进行回归
X_pcr = sm.add_constant(X_pca)  # 添加常数项
pcr_model = sm.OLS(y, X_pcr).fit()

# 4. 计算关键指标进行对比
cond_ols = np.linalg.cond(X_ols)  # OLS设计矩阵条件数
cond_pcr = np.linalg.cond(X_pcr)  # PCR设计矩阵条件数

print("原设计矩阵条件数 (强多重共线性):", round(cond_ols, 2))
print("PCR 设计矩阵条件数 (正交消除):", round(cond_pcr, 2))
print("OLS R-squared:", round(ols_model.rsquared, 4))
print("PCR (1个主成分) R-squared:", round(pcr_model.rsquared, 4))
print("第一主成分方差贡献率:", round(float(pca.explained_variance_ratio_[0]), 4))

运行结果分析

原设计矩阵条件数 (强多重共线性): 76.6
PCR 设计矩阵条件数 (正交消除): 6.67
OLS R-squared: 0.9969
PCR (1个主成分) R-squared: 0.9966
第一主成分方差贡献率: 0.9983

解读

  1. 共线性诊断:OLS回归中设计矩阵的条件数高达76.6,远大于经验阈值(如30),确认存在严重的多重共线性。这会导致OLS系数估计不稳定、方差大。
  2. 主成分提取:PCA显示第一个主成分的方差贡献率高达99.83%,意味着一个主成分就几乎捕获了三个自变量所有的变异信息,这从侧面印证了变量间的高度相关性。
  3. 共线性消除:PCR使用一个主成分进行回归,其设计矩阵的条件数降至6.67,表明多重共线性问题已被成功消除。
  4. 模型效果:尽管PCR只使用了一个综合变量,但其拟合优度(R-squared=0.9966)与使用了三个原始变量的OLS(R-squared=0.9969)几乎相同。这说明PCR在消除共线性的同时,有效保留了预测能力。
  5. 系数稳定性:虽然本例中OLS系数在数值上可能看起来“合理”,但在强共线性下,这些系数对数据微小扰动非常敏感。PCR通过降维得到了一个更稳定、更可解释的模型结构(一个综合因子)。

📝 动手练一练

  1. 综合评价实践:假设你有一份中国各省份的经济社会数据(如GDP、人均收入、教育投入、医疗资源、环境污染指数等10个指标)。请简述你如何利用主成分分析对这些省份进行综合发展水平排序?关键步骤有哪些?你会选择基于协方差矩阵还是相关系数矩阵?为什么?
  2. 主成分回归选择:在主成分回归中,我们选择了第一个主成分(贡献率99.83%)。如果累计贡献率标准设定为85%,而前两个主成分的累计贡献率为70%,第三个达到88%,你会选择几个主成分进行回归?请说明你的理由。

参考答案

  1. 步骤:① 对10个指标数据进行标准化(因量纲和意义不同,建议用相关系数矩阵R)。② 对标准化数据做PCA,根据累计方差贡献率(如>85%)确定主成分个数m。③ 计算各省份在m个主成分上的得分。④ 以各主成分的方差贡献率为权重,计算各省份的综合得分 Z=i=1mwiYiZ = \sum_{i=1}^{m} w_i Y_i。⑤ 按Z值排序。选择R的原因:指标物理意义和量纲差异大,标准化可消除量纲影响,使评价更公平。
  2. 应选择前3个主成分。虽然单独看前两个未达到85%的标准,但主成分回归中选取主成分不仅要看累计贡献率,还要考虑信息提取率,确保没有重要变量信息被遗漏。只取前两个可能丢失第三个主成分所携带的某些独特信息,导致模型有偏。达到88%累计贡献率的前三个主成分能更全面地代表原始变量信息。

本章小结

本节我们深化了对主成分分析应用的理解,并掌握了其与回归分析结合的强大工具——主成分回归。

  • 标准化决策:主成分分析的出发点(Σ\SigmaRR)需根据变量量纲和数据分析目标审慎选择。标准化会抹杀方差信息,但能消除量纲影响。
  • 综合评价:通过计算主成分得分,并以方差贡献率为权重进行加权求和,可以构建综合指标,对多指标样本进行科学排序。
  • 主成分回归:通过将存在多重共线性的自变量转换为正交的主成分,再进行回归,可以有效解决OLS估计中的共线性问题,得到更稳定、可解释的系数估计。其核心步骤是:PCA提取主成分 -> 对主成分回归 -> 系数还原。

行动清单

  1. 数据诊断:在开展任何多元分析前,养成检查变量量纲、计算相关系数矩阵和条件数的习惯。
  2. 流程实践:尝试对一个实际数据集(如sklearn自带的加州房价数据集,用sklearn.datasets.fetch_california_housing()加载;原波士顿房价数据集load_boston已在scikit-learn 1.2中移除)完整走一遍流程:数据标准化 -> PCA -> 根据累计贡献率确定主成分 -> 利用主成分进行综合评价或主成分回归。
  3. 对比分析:对同一组数据,分别用OLS和PCR建模,对比两者的系数估计值、标准误、显著性以及模型条件数,直观感受共线性的影响及PCR的修正效果。

— 小象教研组

配套学习资源与课件
  • 第5章课件:主成分分析
    下载
  • 多元统计分析参考讲义与常用函数(多元分析与主成分常用函数速查)
    下载
  • 课程配套数据集(全课程实战数据包)
    下载
  • 课程全套源代码(课程相关代码汇总)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加顾问免费领取;想学什么,直接告诉顾问
微信二维码:扫码添加课程顾问微信扫码添加顾问