📑 查看全课大纲(第 11 / 20 节)
- 1.多元统计分析概述与多元正态分布
- 2.多元数据矩阵与向量化运算
- 3.统计数据探索与高维数据清洗
- 4.样品与变量相似性度量(距离与相似系数)
- 5.系统聚类与K均值聚类算法原理
- 6.聚类分析代码实战与谱系图绘制
- 7.距离判别法理论推导与应用
- 8.贝叶斯判别与Fisher线性判别
- 9.判别分析代码实战与误判率评估
- 10.主成分分析推导、几何意义与统计性质
- 11.主成分回归与共线性消除
- 12.主成分分析代码实战与降维可视化
- 13.因子分析正交模型与因子载荷求解
- 14.因子正交旋转(方差最大化)与因子得分计算
- 15.因子分析代码实战与行业综合评价
- 16.列联表分析与卡方独立性检验
- 17.对应分析理论推导与过渡图原理
- 18.对应分析代码实战与双标图解读
- 19.典型相关变量数学推导与显著性检验
- 20.典型相关系数阵计算与代码实战
主成分回归与共线性消除
约 58 分钟
小象实战讲义 · 多元统计分析
在上一节中,我们掌握了主成分分析(PCA)的核心原理与性质,学会了如何从高维数据中提取信息最丰富的少数几个综合变量。本节我们将深入探讨主成分分析在实际应用中的两个关键问题:如何正确处理量纲差异以及如何利用主成分进行综合评价。更重要的是,我们将学习如何将主成分分析与回归分析相结合,形成主成分回归(PCR),以解决多元线性回归中令人头疼的多重共线性问题。学完本节,你将能够独立完成从数据标准化、主成分提取到综合评价排序,再到利用主成分构建稳健回归模型的完整分析流程。
💡 核心导读
- 标准化与否的权衡:探讨在主成分分析中,何时应基于协方差矩阵 ,何时应基于相关系数矩阵 ,理解标准化对分析结果的实质影响。
- 主成分综合评价:学习如何利用主成分得分和方差贡献率,为复杂多指标的评价对象(如企业、地区)计算一个综合得分并进行排序。
- 主成分回归原理:理解多重共线性对普通最小二乘(OLS)回归的危害,掌握通过主成分分析提取不相关的综合变量,再对因变量进行回归,最终还原为原始变量关系的方法。
- Python实战流程:使用
scikit-learn和statsmodels库,完整实现主成分分析、综合评价以及主成分回归,并与普通OLS回归结果进行对比。
一、主成分分析应用中的关键问题
1.1 出发点:协方差矩阵还是相关系数矩阵?
在实际数据分析中,我们遇到的变量往往具有不同的量纲(例如,产值以“百万元”计,利税以“万元”计)。回顾主成分的性质2:所有主成分的方差之和等于原始变量的总方差之和,即 。当量纲不同时,将不同物理含义的方差直接相加,其意义并不明确。
为了消除量纲影响,一个常见的做法是对原始变量进行标准化处理: 标准化后,变量 的均值为0,方差为1。此时,原始变量的协方差矩阵 就变成了标准化变量的相关系数矩阵 。
那么,进行主成分分析时,究竟应该使用 还是 ?
这并非一个有确定答案的问题,而是一个需要权衡的决策:
- 使用协方差矩阵 :主成分的提取会优先照顾方差大的变量。如果变量量纲相似(如都是货币单位,只是数量级不同),或者你希望保留变量原始方差所代表的信息量差异,则应使用 。
- 使用相关系数矩阵 :标准化将所有变量的方差强行调整为1,抹杀了原始变量在信息含量(方差大小)上的差异。这使得所有变量在主成分构成中的初始“权重”变得相等。当变量量纲完全不同(如长度、重量、温度)或数量级悬殊时,使用 是更合理的选择,它使得分析结果不受测量单位的影响。
结论:对于同度量或相似量级的变量,建议使用原始的协方差矩阵 求解主成分。如果各指标数量级相差悬殊或有完全不同的物理量纲,则应使用标准化变量的相关系数矩阵 (或等价地,使用标准化变量的协方差矩阵)进行主成分分析。需要强调的是,从 和从 出发求得的主成分通常是不同的,有时差异会很大。
1.2 利用主成分进行综合评价
综合评价的核心是将多个指标综合成一个单一的得分,以便对样本进行排序。例如,评价多个地区的综合发展水平,涉及经济、社会、环境等多个维度的指标。
主成分分析为此提供了优雅的解决方案:
- 降维与信息提取:对 个原始指标进行主成分分析,提取前 个主成分 ,它们互不相关且包含了原始数据的大部分信息。
- 计算主成分得分:将第 个样本的(标准化后)观测值 代入主成分表达式 ,得到该样本在第 个主成分上的得分 。
- 确定综合权重:以各主成分的方差贡献率作为其权重是合理的选择。方差贡献率 反映了该主成分所包含的原始信息量大小,信息量越大,在综合评价中的权重也应越大。
- 构建综合评价函数:对前 个主成分的得分进行加权求和,得到每个样本的综合得分 : 其中权重 通常取为前 个主成分的“归一化”方差贡献率:
- 排序与评价:根据综合得分 对样本进行排序,得分高者综合表现更优。
二、主成分回归:消除多重共线性的利器
2.1 多元线性回归与多重共线性问题
首先,我们回顾多元线性回归模型: 其中 是 的设计矩阵(通常包含一列1以估计截距项), 是系数向量。其普通最小二乘(OLS)估计为:
OLS估计的一个关键前提是自变量之间不存在严重的多重共线性,即 的列向量近似线性无关。如果存在多重共线性(例如,两个自变量高度相关),会导致:
- 接近奇异,其逆矩阵不稳定,使得 的估计值方差很大,对数据微小变化异常敏感。
- 系数的t检验可能不显著,但模型的整体F检验却显著。
- 系数的符号或大小可能与理论预期不符,难以解释。
2.2 主成分回归的原理与步骤
主成分回归巧妙地运用主成分分析来解决多重共线性问题。其核心思想是:将存在共线性的原始自变量 ,转换为一组互不相关的主成分 ,然后用因变量 对主成分 进行回归,最后将关系还原到原始自变量空间。
主成分回归三步法:
- 主成分提取:对自变量 (通常先标准化)进行主成分分析,提取前 () 个主成分 ,其中 是由前 个特征向量构成的主成分系数矩阵。
- 主成分回归:建立 对 的回归模型: 由于 的列是正交的,多重共线性被彻底消除,可以用OLS稳定地估计系数 。
- 系数还原:将主成分回归系数 转换回原始自变量空间。因为 ,所以 。对比原始模型 ,可得原始变量系数估计为:
通过主成分回归,我们既利用了主成分的正交性消除了共线性,又通过选择保留信息量大的主成分(通常根据累计方差贡献率),实现了降维,有时还能提升模型的预测能力。
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解读:
- 共线性诊断:OLS回归中设计矩阵的条件数高达76.6,远大于经验阈值(如30),确认存在严重的多重共线性。这会导致OLS系数估计不稳定、方差大。
- 主成分提取:PCA显示第一个主成分的方差贡献率高达99.83%,意味着一个主成分就几乎捕获了三个自变量所有的变异信息,这从侧面印证了变量间的高度相关性。
- 共线性消除:PCR使用一个主成分进行回归,其设计矩阵的条件数降至6.67,表明多重共线性问题已被成功消除。
- 模型效果:尽管PCR只使用了一个综合变量,但其拟合优度(R-squared=0.9966)与使用了三个原始变量的OLS(R-squared=0.9969)几乎相同。这说明PCR在消除共线性的同时,有效保留了预测能力。
- 系数稳定性:虽然本例中OLS系数在数值上可能看起来“合理”,但在强共线性下,这些系数对数据微小扰动非常敏感。PCR通过降维得到了一个更稳定、更可解释的模型结构(一个综合因子)。
📝 动手练一练
- 综合评价实践:假设你有一份中国各省份的经济社会数据(如GDP、人均收入、教育投入、医疗资源、环境污染指数等10个指标)。请简述你如何利用主成分分析对这些省份进行综合发展水平排序?关键步骤有哪些?你会选择基于协方差矩阵还是相关系数矩阵?为什么?
- 主成分回归选择:在主成分回归中,我们选择了第一个主成分(贡献率99.83%)。如果累计贡献率标准设定为85%,而前两个主成分的累计贡献率为70%,第三个达到88%,你会选择几个主成分进行回归?请说明你的理由。
参考答案:
- 步骤:① 对10个指标数据进行标准化(因量纲和意义不同,建议用相关系数矩阵R)。② 对标准化数据做PCA,根据累计方差贡献率(如>85%)确定主成分个数m。③ 计算各省份在m个主成分上的得分。④ 以各主成分的方差贡献率为权重,计算各省份的综合得分 。⑤ 按Z值排序。选择R的原因:指标物理意义和量纲差异大,标准化可消除量纲影响,使评价更公平。
- 应选择前3个主成分。虽然单独看前两个未达到85%的标准,但主成分回归中选取主成分不仅要看累计贡献率,还要考虑信息提取率,确保没有重要变量信息被遗漏。只取前两个可能丢失第三个主成分所携带的某些独特信息,导致模型有偏。达到88%累计贡献率的前三个主成分能更全面地代表原始变量信息。
本章小结
本节我们深化了对主成分分析应用的理解,并掌握了其与回归分析结合的强大工具——主成分回归。
- 标准化决策:主成分分析的出发点( 或 )需根据变量量纲和数据分析目标审慎选择。标准化会抹杀方差信息,但能消除量纲影响。
- 综合评价:通过计算主成分得分,并以方差贡献率为权重进行加权求和,可以构建综合指标,对多指标样本进行科学排序。
- 主成分回归:通过将存在多重共线性的自变量转换为正交的主成分,再进行回归,可以有效解决OLS估计中的共线性问题,得到更稳定、可解释的系数估计。其核心步骤是:PCA提取主成分 -> 对主成分回归 -> 系数还原。
行动清单
- 数据诊断:在开展任何多元分析前,养成检查变量量纲、计算相关系数矩阵和条件数的习惯。
- 流程实践:尝试对一个实际数据集(如
sklearn自带的加州房价数据集,用sklearn.datasets.fetch_california_housing()加载;原波士顿房价数据集load_boston已在scikit-learn 1.2中移除)完整走一遍流程:数据标准化 -> PCA -> 根据累计贡献率确定主成分 -> 利用主成分进行综合评价或主成分回归。 - 对比分析:对同一组数据,分别用OLS和PCR建模,对比两者的系数估计值、标准误、显著性以及模型条件数,直观感受共线性的影响及PCR的修正效果。
— 小象教研组
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加顾问免费领取;想学什么,直接告诉顾问
微信扫码添加顾问