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

典型相关变量数学推导与显著性检验

约 56 分钟

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

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

在多元统计分析中,我们常需研究两组变量的整体线性相关性,典型相关分析(Canonical Correlation Analysis, CCA)正是解决这类问题的核心工具。本节将讲解CCA的基本思想、核心推导、显著性检验及Python实现,帮你快速掌握其原理与应用方法。

💡 核心导读

  • 问题场景:研究两组多变量之间的整体线性相关关系
  • 核心思想:提取两组变量的线性组合(典型变量),最大化其相关系数
  • 数学本质:方差约束下的最大化问题,转化为矩阵特征值求解
  • 检验方法:Bartlett似然比检验判断典型相关系数的统计显著性
  • 实战工具:基于sklearn.cross_decomposition.CCA完成完整分析

典型相关分析的基本思想

单变量分析中,我们用皮尔逊相关系数衡量两个变量的线性相关程度,但实际场景中常需研究两组变量的整体关联,例如:财政政策指标与宏观经济指标的关系、生理指标与运动训练指标的关系。

CCA的核心逻辑是:从两组变量中分别构造线性组合(称为典型变量),使得这对线性组合的相关系数达到最大。

设第一组变量为 X(1)=(X1(1),X2(1),,Xp(1))RpX^{(1)} = (X_1^{(1)}, X_2^{(1)}, \ldots, X_p^{(1)})' \in \mathbb{R}^p,第二组变量为 X(2)=(X1(2),X2(2),,Xq(2))RqX^{(2)} = (X_1^{(2)}, X_2^{(2)}, \ldots, X_q^{(2)})' \in \mathbb{R}^q。我们构造线性组合: U=aX(1),V=bX(2)U = a'X^{(1)}, \quad V = b'X^{(2)} 其中 aRpa \in \mathbb{R}^pbRqb \in \mathbb{R}^q 为待求的系数向量。

由于相关系数对系数的缩放具有不变性(同时将a,ba,b乘以常数cc,相关系数不变),为保证解的唯一性,我们施加方差约束: Var(U)=aΣ11a=1,Var(V)=bΣ22b=1\text{Var}(U) = a'\Sigma_{11}a = 1, \quad \text{Var}(V) = b'\Sigma_{22}b = 1 其中 Σ11=Cov(X(1))\Sigma_{11} = \text{Cov}(X^{(1)})Σ22=Cov(X(2))\Sigma_{22} = \text{Cov}(X^{(2)}) 分别为两组变量的协方差矩阵。

核心数学推导

两组变量的联合协方差矩阵可表示为: Σ=Cov(X(1)X(2))=(Σ11Σ12Σ21Σ22)\Sigma = \text{Cov}\begin{pmatrix} X^{(1)} \\ X^{(2)} \end{pmatrix} = \begin{pmatrix} \Sigma_{11} & \Sigma_{12} \\ \Sigma_{21} & \Sigma_{22} \end{pmatrix} 其中 Σ12=Cov(X(1),X(2))\Sigma_{12} = \text{Cov}(X^{(1)}, X^{(2)}) 为两组变量的交叉协方差矩阵,且 Σ21=Σ12\Sigma_{21} = \Sigma_{12}'

在方差约束下,典型变量UUVV的相关系数可简化为 ρ(U,V)=aΣ12b\rho(U,V) = a'\Sigma_{12}b。我们的优化目标是最大化该值,引入拉格朗日乘子构造目标函数,对a,ba,b分别求偏导并令其为零,最终可推导出特征值方程: Σ111Σ12Σ221Σ21a=λ2a\Sigma_{11}^{-1}\Sigma_{12}\Sigma_{22}^{-1}\Sigma_{21}a = \lambda^2 a Σ221Σ21Σ111Σ12b=λ2b\Sigma_{22}^{-1}\Sigma_{21}\Sigma_{11}^{-1}\Sigma_{12}b = \lambda^2 b

定义矩阵 A=Σ111Σ12Σ221Σ21A = \Sigma_{11}^{-1}\Sigma_{12}\Sigma_{22}^{-1}\Sigma_{21}B=Σ221Σ21Σ111Σ12B = \Sigma_{22}^{-1}\Sigma_{21}\Sigma_{11}^{-1}\Sigma_{12},则 λ2\lambda^2 是矩阵AABB的非零特征值,a,ba,b为对应特征向量,λ\lambda即为典型相关系数

r=min(p,q)r = \min(p, q),则存在rr个非零特征值 λ12λ22λr2>0\lambda_1^2 \geq \lambda_2^2 \geq \cdots \geq \lambda_r^2 > 0,对应rr对典型变量,满足:组内典型变量不相关、组间仅同序号典型变量相关,相关系数为对应λk\lambda_k

实际应用中,我们用样本协方差矩阵估计总体参数,得到样本典型相关系数 λ^k\hat{\lambda}_k

典型相关系数的显著性检验

得到典型相关系数后,需通过统计检验判断其显著性,常用方法为Bartlett似然比检验。

整体相关性检验

首先检验两组变量是否整体相关:

  • 原假设 H0:Σ12=0H_0: \Sigma_{12} = 0(两组变量无相关关系,等价于所有典型相关系数均为0)
  • 检验统计量: Q0=[n1p+q+12]lni=1r(1λ^i2)Q_0 = - \left[ n - 1 - \frac{p+q+1}{2} \right] \ln \prod_{i=1}^r (1-\hat{\lambda}_i^2) 近似服从自由度为 f=p×qf = p \times qχ2\chi^2 分布。
  • 若检验的 p 值(P-value,注意勿与表示第一组变量维数的 pp 混淆)小于 0.05,则拒绝原假设,说明两组变量整体存在显著相关。

逐对典型相关检验

整体显著后,需逐次联合检验确定保留的典型变量对数:

  • kk步原假设 H0(k):λk+1==λr=0H_0^{(k)}: \lambda_{k+1} = \cdots = \lambda_r = 0(第k+1k+1对及以后的典型相关系数均为0),其中 r=min(p,q)r = \min(p, q)
  • kk步检验统计量(类比整体检验的 Q0Q_0,对剩余 rkr-k 个典型相关系数构造似然比): Qk=[n1p+q+12]i=k+1rln(1λ^i2)Q_k = -\left[n-1-\frac{p+q+1}{2}\right] \sum_{i=k+1}^{r} \ln(1-\hat{\lambda}_i^2) QkQ_k 近似服从自由度为 fk=(pk)(qk)f_k = (p-k)(q-k)χ2\chi^2 分布
  • 若接受原假设则停止检验,保留前kk对典型变量

Python实战:典型相关分析

下面通过Python演示CCA的完整流程,包括数据生成、模型拟合与显著性检验:

import numpy as np
from scipy.stats import chi2

np.random.seed(42)
n = 150
u = np.random.normal(0, 1, size=n)
v = np.random.normal(0, 1, size=n)

x1 = 0.8 * u + np.random.normal(0, 0.4, size=n)
x2 = 0.6 * u + np.random.normal(0, 0.5, size=n)
x3 = np.random.normal(0, 1, size=n)

y1 = 0.75 * u + 0.3 * v + np.random.normal(0, 0.4, size=n)
y2 = 0.5 * v + np.random.normal(0, 0.6, size=n)

X = np.column_stack([x1, x2, x3])
Y = np.column_stack([y1, y2])

Sxx = np.cov(X, rowvar=False)
Syy = np.cov(Y, rowvar=False)
Sxy = np.cov(X, Y, rowvar=False)[:3, 3:]
Syx = Sxy.T

inv_Sxx = np.linalg.inv(Sxx)
inv_Syy = np.linalg.inv(Syy)

M1 = inv_Sxx @ Sxy @ inv_Syy @ Syx
eigenvals = np.linalg.eigvals(M1)
canonical_corrs = np.sqrt(np.sort(np.real(eigenvals))[::-1][:2])

p, q = 3, 2
stat = -(n - 1 - (p + q + 1) / 2.0) * np.sum(np.log(1.0 - canonical_corrs**2))
dof = p * q
p_val = 1.0 - chi2.cdf(stat, df=dof)

print("第一典型相关系数 r1:", round(float(canonical_corrs[0]), 4))
print("第二典型相关系数 r2:", round(float(canonical_corrs[1]), 4))
print("Bartlett 似然比检验统计量:", round(float(stat), 4))
print("自由度:", dof, "p 值:", round(float(p_val), 6))
print("两组变量整体极显著相关:", bool(p_val < 0.001))

运行结果:

第一典型相关系数 r1: 0.7984
第二典型相关系数 r2: 0.1333
Bartlett 似然比检验统计量: 150.7753
自由度: 6 p 值: 0.0
两组变量整体极显著相关: True

📝 动手练一练

  1. 思考题:典型相关分析中,为什么要对典型变量施加方差为1的约束?如果不加约束会出现什么问题?
  2. 实操题:修改实战代码中变量与潜在因子的相关系数(如将第一组变量对uu的系数调低),观察典型相关系数和显著性结果的变化。

参考答案

  1. 相关系数具有尺度不变性:若将系数向量a,ba,b同时乘以任意非零常数ccUUVV的相关系数不会改变。不加方差约束会导致解不唯一(有无穷多组成比例的系数),施加Var(U)=Var(V)=1\text{Var}(U)=\text{Var}(V)=1的约束可固定系数尺度,得到唯一的典型变量。

本章小结

典型相关分析是研究两组多变量整体相关性的核心方法,核心要点回顾:

  1. 基本思想:通过构造两组变量的线性组合(典型变量),最大化其相关系数,刻画两组变量的整体关联。
  2. 数学本质:方差约束下的相关系数最大化问题,可转化为矩阵特征值求解问题,特征值的平方根即为典型相关系数。
  3. 显著性检验:通过Bartlett似然比检验先判断整体相关性,再逐次联合检验确定保留的典型变量对数。
  4. 实现工具:可通过sklearn的CCA模块快速完成建模,结合scipy的卡方分布实现显著性检验。

实际应用中,除了关注统计显著性,还需结合领域知识解释典型变量的实际含义,才能充分发挥CCA的价值。

— 小象教研组

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

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

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

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