【CCA(典型相关分析)】符号对照、代码实现 SPSS 语法、Python 完整分析脚本、

附录 A 符号与缩略语对照表

本附录集中收录全书使用的数学符号与英文缩略语,供查阅。数学记号遵循第二章约定:粗体小写表示向量,粗体大写表示矩阵。

A.1 核心符号对照

符号含义首次出现
X\boldsymbol{X}XX 组随机向量(ppp 维)第 1 章
Y\boldsymbol{Y}YY 组随机向量(qqq 维)第 1 章
pppX 组变量个数第 1 章
qqqY 组变量个数第 1 章
m=min⁡(p,q)m=\min(p,q)m=min(p,q)典型变量对数的上限第 2 章
nnn样本量第 2 章
Σ\boldsymbol{\Sigma}Σ联合协方差矩阵第 2 章
ΣXX\boldsymbol{\Sigma}_{XX}ΣXXX 组内协方差矩阵第 2 章
ΣYY\boldsymbol{\Sigma}_{YY}ΣYYY 组内协方差矩阵第 2 章
ΣXY\boldsymbol{\Sigma}_{XY}ΣXY组间协方差矩阵第 2 章
a\boldsymbol{a}aX 侧权重向量第 2 章
b\boldsymbol{b}bY 侧权重向量第 2 章
U=a⊤XU=\boldsymbol{a}^{\top}\boldsymbol{X}U=aXX 侧典型变量第 2 章
V=b⊤YV=\boldsymbol{b}^{\top}\boldsymbol{Y}V=bYY 侧典型变量第 2 章
ρk\rho_kρk / rkr_krkkkk 个(总体/样本)典型相关系数第 2、4 章
λi\lambda_iλi特征值或典型根 ri2/(1−ri2)r_i^2/(1-r_i^2)ri2/(1ri2)(语境区分)第 2、4 章
Λ\LambdaΛWilks’ Lambda 统计量第 4 章
χ2\chi^2χ2Bartlett 近似卡方统计量第 4 章
hiih_{ii}hiiiii 个样本的杠杆值第 9 章
di2d_i^2di2iii 个样本的马氏距离平方第 3 章
VE(X∣Ui)\mathrm{VE}(X\mid U_i)VE(XUi)UiU_iUi 对 X 组方差的平均解释比例第 6 章
Rd(Y∣X)\mathrm{Rd}(Y\mid X)Rd(YX)X 组对 Y 组的冗余指数第 4 章
λX,λY\lambda_X,\lambda_YλX,λY两侧正则化/稀疏惩罚参数第 7 章
κ(⋅,⋅)\kappa(\cdot,\cdot)κ(,)核函数第 7 章
KX,KY\boldsymbol{K}_X,\boldsymbol{K}_YKX,KY两侧核矩阵第 7 章

A.2 英文缩略语对照

缩略语英文全称中文含义备注
CCACanonical Correlation Analysis典型相关分析本书主题
PCAPrincipal Component Analysis主成分分析单组方差结构
CACorrespondence Analysis对应分析列联表分析
MANOVAMultivariate Analysis of Variance多元方差分析检验语系同源
VIFVariance Inflation Factor方差膨胀因子共线诊断
MCDMinimum Covariance Determinant最小协方差行列式稳健协方差估计
MCAR / MAR / MNARMissing Completely At Random 等三种缺失机制第 3 章
SVDSingular Value Decomposition奇异值分解第 2 章
EVDEigenvalue Decomposition特征值分解第 2 章
RKHSReproducing Kernel Hilbert Space再生核希尔伯特空间核方法
RBFRadial Basis Function径向基核核函数
MCCAMultiway / Multiset CCA多路(多组)典型相关第 1、7 章
DCCADeep CCA深度典型相关第 10 章
PMDPenalized Matrix Decomposition惩罚矩阵分解Witten 2009 框架
BICBayesian Information Criterion贝叶斯信息准则调参
RMSERoot Mean Square Error均方根误差预测评估
APAAmerican Psychological Association美国心理学会(格式)报告规范
FPKMFragments Per Kilobase per Million转录组表达单位案例二

A.3 易混概念对照

概念本书定义要点常见混淆对象
典型变量组内变量的线性合成得分主成分得分(单组方差取向)
典型相关系数一对典型变量的相关单对 Pearson 相关
典型载荷原始变量与同侧典型变量的相关标准化权重(净贡献)
冗余指数相关平方 × 平均载荷平方典型相关平方(共享方差)
典型对应分析生态学排序方法(ter Braak)典型相关分析(缩写同为 CCA)
广义逆奇异矩阵的最小二乘伪逆普通逆(不可逆时不存在)

附录 B 各平台完整代码汇总

本附录给出第 5 章第 5.2—5.3 节流程的完整可运行脚本,全部使用统一的示范数据:16 名运动员的生理指标组(肺活量、最大摄氧量、体脂率)与体测成绩组(百米用时、耐力跑用时)。真实分析请按第三章准则放大样本,本数据仅用于流程演示与跨平台核对。

B.1 SPSS 语法代码

*--------------------------------------------------------------
* SPSS:典型相关分析完整流程(含标准化、检验、载荷导出)
* 数据文件需含 6 个数值变量:肺活量 最大摄氧量 体脂率
*                        百米用时 耐力跑用时
*--------------------------------------------------------------

* 第一步:缺失值报告
MISSING VALUES 肺活量 最大摄氧量 体脂率 百米用时 耐力跑用时 (SYSMIS).
DESCRIPTIVES VARIABLES = 肺活量 最大摄氧量 体脂率 百米用时 耐力跑用时
  /STATISTICS = MEAN STDDEV MIN MAX.

* 第二步:Z-score 标准化(生成 z 前缀新变量)
DESCRIPTIVES VARIABLES = 肺活量 最大摄氧量 体脂率 百米用时 耐力跑用时
  /SAVE
  /STATISTICS = MEAN STDDEV.

* 第三步:典型相关分析(官方宏路径;菜单路径为
*        分析 → 相关 → 典型相关性,集合1/集合2 对应变量入框)
INCLUDE 'C:\SPSS_安装目录\Canonical correlation.sps'.
CANCORR SET1 = Z肺活量 Z最大摄氧量 Z体脂率
        /SET2 = Z百米用时 Z耐力跑用时.

* 第四步:逐级显著性检验的替代路线(MANOVA 近似输出 Wilks)
MANOVA Z百米用时 Z耐力跑用时 WITH Z肺活量 Z最大摄氧量 Z体脂率
  /DISCRIMINANT STAN CORR ALPHA(1)
  /PRINT = SIGNIF (MULTIVAR UNIV).

* 第五步:把关键输出表导出为 Excel(供三线表排版)
OMS SELECT TABLES
  /DESTINATION FORMAT = SAV OUTFILE = 'CCA输出.sav'.
CANCORR SET1 = Z肺活量 Z最大摄氧量 Z体脂率
        /SET2 = Z百米用时 Z耐力跑用时.
OMSEND.

执行说明:菜单路径"分析 → 相关 → 典型相关性"若当前版本缺失,用第三步的宏语法等价替代;第四步 MANOVA 输出中的 Wilks’ Lambda、近似 F 值与显著性对应 4.1.3 节的检验口径。导出环节的 OMS 子系统将输出表转存为 SPSS 数据文件,再粘贴到 Word/WPS 中排版为三线表(6.5.1 节)。

B.2 R 完整分析脚本

#------------------------------------------------------------------
# R:经典 CCA 完整流程(标准化 → 求解 → 逐级检验 → 载荷 → 冗余)
# 依赖:CCA, CCP
#------------------------------------------------------------------
library(CCA); library(CCP)

# 1. 数据读入与预处理
dat  <- read.csv("athletes.csv", fileEncoding = "UTF-8")
Xraw <- dat[, c("肺活量", "最大摄氧量", "体脂率")]
Yraw <- dat[, c("百米用时", "耐力跑用时")]

# 1.1 缺失审计(示意:缺失率与机制描述)
print(colMeans(is.na(dat)))
# 1.2 标准化(第二章不变性:不改变典型相关,只统一权重尺度)
X <- scale(Xraw); Y <- scale(Yraw)

# 1.3 组内共线诊断(3.1.3 节:条件数与 VIF)
eigen(cor(X))$values[1] / tail(eigen(cor(X))$values, 1)   # X 组条件数
library(car); vif(lm(scale(Y[, 1]) ~ X))                  # VIF 示意

# 2. 典型相关求解
res <- cc(X, Y)
rho <- res$cor                       # 典型相关系数
print(rho)

# 3. 显著性检验:Wilks 逐级序列(4.1—4.2 节)
p_tab <- p.asym(rho, N = nrow(X), p = ncol(X), q = ncol(Y),
                tstat = "Wilks")
print(data.frame(保留前k对 = 1:length(rho), p.value = p_tab$p.value))

# 4. 载荷矩阵与交叉载荷(6.3 节)
load <- comput(res, X, Y)
Lx <- load$corr.X.xscores            # X 变量 × U 载荷
Ly <- load$corr.Y.yscores            # Y 变量 × V 载荷
CLx <- load$corr.X.yscores           # 交叉载荷 corr(X, V)

# 5. 冗余指数(4.3 节,两方向)
rd_XY <- colSums(load$Rdx2 * rho^2)  # X 组典型变量对 Y 组方差解释
rd_YX <- colSums(load$Rdy2 * rho^2)  # Y 组典型变量对 X 组方差解释
cat("Rd(Y|X) 累计 =", cumsum(rd_XY), "\n")
cat("Rd(X|Y) 累计 =", cumsum(rd_YX), "\n")

# 6. Bootstrap 权重稳定性审计(3.2.3 节)
set.seed(1); B <- 500
boot_a <- matrix(NA, B, ncol(X))
for (b in 1:B) {
  idx <- sample(nrow(X), replace = TRUE)
  r   <- cc(X[idx, , drop = FALSE], Y[idx, , drop = FALSE])
  boot_a[b, ] <- r$xcoef[, 1]
  if (cor(boot_a[b, ], res$xcoef[, 1]) < 0) boot_a[b, ] <- -boot_a[b, ]
}
print(apply(boot_a, 2, function(w) sum(w * sign(median(w))) / length(w)))  # 符号一致率示意

# 7. 可视化:U1–V1 双标图
U <- scale(Xraw) %*% res$xcoef
V <- scale(Yraw) %*% res$ycoef
plot(U[, 1], V[, 1], xlab = "U1", ylab = "V1", pch = 19)
abline(lm(V[, 1] ~ U[, 1]), col = "red")

B.3 Python 完整分析脚本

#------------------------------------------------------------------
# Python:经典 CCA 完整流程(scikit-learn + 手工检验/载荷补全)
#------------------------------------------------------------------
import numpy as np
import pandas as pd
from sklearn.cross_decomposition import CCA
from sklearn.preprocessing import StandardScaler
from scipy.stats import chi2

# 1. 数据读入与标准化
dat = pd.read_csv("athletes.csv")
X = dat[["肺活量", "最大摄氧量", "体脂率"]].to_numpy()
Y = dat[["百米用时", "耐力跑用时"]].to_numpy()
scaler = StandardScaler()
Xz, Yz = scaler.fit_transform(X), scaler.fit_transform(Y)

# 2. 典型相关求解(n_components = min(p, q))
model = CCA(n_components=2, scale=True, max_iter=2000)
model.fit(Xz, Yz)
U, V = model.transform(Xz, Yz)     # 同时返回样本 U 得分与 V 得分

# 3. 典型相关系数
rho = [np.corrcoef(U[:, i], V[:, i])[0, 1] for i in range(U.shape[1])]
print("典型相关系数:", np.round(rho, 4))

# 4. Wilks 逐级显著性检验(与 R 版逐行对应)
def wilks_seq(r, n, p, q):
    rows = []
    for k in range(len(r)):
        Lam  = np.prod(1 - np.array(r[k:]) ** 2)
        df   = (p - k) * (q - k)
        chisq = -(n - 1 - (p + q + 1) / 2) * np.log(Lam)
        rows.append([k + 1, Lam, chisq, df, chi2.sf(chisq, df)])
    return pd.DataFrame(rows, columns=["保留前k对", "Lambda", "chisq", "df", "p"])

print(wilks_seq(rho, len(X), X.shape[1], Y.shape[1]))

# 5. 载荷矩阵与交叉载荷
def loadings(A, S):
    A = (A - A.mean(0)) / A.std(0)
    S = (S - S.mean(0)) / S.std(0)
    R = np.corrcoef(A.T, S.T)[:A.shape[1], A.shape[1]:]
    return R

Lx, Ly = loadings(X, U), loadings(Y, V)     # 本组载荷
CLx    = loadings(X, V)                     # 交叉载荷

# 6. 冗余指数(4.3 节)
ve_x = (Lx ** 2).mean(axis=0)               # U 对 X 组方差解释
rd_XY = ve_x * np.array(rho) ** 2
print("冗余指数 Rd(Y|U_i):", np.round(rd_XY, 4),
      "累计:", np.round(np.cumsum(rd_XY), 4))

# 7. 可视化:U1–V1 散点与载荷热图
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 2, figsize=(11, 4))
ax[0].scatter(U[:, 0], V[:, 0]); ax[0].set(xlabel="U1", ylabel="V1")
im = ax[1].imshow(Lx, cmap="RdBu_r", vmin=-1, vmax=1, aspect="auto")
ax[1].set_xticks(range(2)); ax[1].set_yticks(range(3))
ax[1].set_xticklabels(["U1", "U2"])
ax[1].set_yticklabels(["肺活量", "最大摄氧量", "体脂率"])
plt.colorbar(im, ax=ax[1]); plt.tight_layout(); plt.show()

B.4 PyTorch 最小 Deep CCA 骨架(第十章)

#------------------------------------------------------------------
# Deep CCA 最小骨架:两路 MLP 后接 CCA 目标(负典型相关为损失)
# 目标函数细节见 10.2.1 节;工程级实现请参考论文附带代码
#------------------------------------------------------------------
import torch, torch.nn as nn
from torch.utils.data import DataLoader

class ViewEncoder(nn.Module):
    def __init__(self, d_in, d_out=32):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(d_in, 128), nn.ReLU(),
            nn.Linear(128, d_out))
    def forward(self, x):
        return self.net(x)

def total_correlation_loss(fx, fy, r=1e-3):
    # fx, fy: (B, d) 已中心化输出;r 为岭惩罚(7.1.2 节思想)
    fx = fx - fx.mean(0); fy = fy - fy.mean(0)
    n = fx.size(0)
    cxx = fx.T @ fx / (n - 1) + r * torch.eye(fx.size(1))
    cyy = fy.T @ fy / (n - 1) + r * torch.eye(fy.size(1))
    cxy = fx.T @ fy / (n - 1)
    # 广义特征问题解:负对数行列式给出"对齐度"损失
    return -0.5 * torch.logdet(
        torch.eye(fx.size(1)) - torch.linalg.solve(cxx, cxy @ torch.linalg.solve(cyy, cxy.T))
    ).clamp(min=-20)

encX, encY = ViewEncoder(3), ViewEncoder(2)
opt = torch.optim.Adam(list(encX.parameters()) + list(encY.parameters()), lr=1e-3)

for epoch in range(300):                       # 训练循环(对应图 10-4)
    opt.zero_grad()
    fx, fy = encX(torch.tensor(Xz, dtype=torch.float32)), \
             encY(torch.tensor(Yz, dtype=torch.float32))
    loss = total_correlation_loss(fx, fy)
    loss.backward()
    opt.step()
    if epoch % 50 == 0:
        print(epoch, loss.item())

执行说明:骨架中的 total_correlation_loss 通过岭正则化后的协方差行列式近似总相关,损失下降等价于视图表征对齐度上升;输出维度 ddd 与岭惩罚 rrr 是仅有的两个超参数,按 10.2.1 节的交叉验证惯例选择。

附录 C 典型相关分析检查清单

本附录把全书的纪律浓缩为三张检查清单,建议打印或置为桌面便签:分析开始前过 C.1,模型拟合后过 C.2,报告发布前过 C.3。每一条都可追溯到正文对应章节。

C.1 数据准备检查清单(对应第三章)

分组设计

  • 分组依据来自理论、先导文献或"不依赖组间相关结构"的探索(3.1.1)
  • 没有把同一构念的量表劈成两组制造双 Y 混淆(9.2.1)
  • 每侧变量数在合理范围,min⁡(p,q)\min(p,q)min(p,q) 对应的"故事容量"与预期一致(3.1.2)
  • 组内共线已排查:相关 > 0.9 的变量对已裁决去留(3.1.3)
  • 组内相关矩阵条件数与 VIF 无严重病态(3.1.3)

样本与缺失

  • n≥10×(p+q)n\ge 10\times(p+q)n10×(p+q) 或已明确记录偏离与理由(3.2.1)
  • 小样本场景的退路(降维 / 正则化)已预先写入分析方案(3.2.2)
  • 缺失率矩阵已产出,缺失机制(MCAR/MAR/MNAR)有判断记录(3.3.1)
  • 缺失率 > 20% 的变量已进入剔除候选并裁决(3.3.1)

异常与离群

  • 单变量极端值(Z-score/箱线图)与多元离群(马氏距离)均已检查(3.3.2)
  • 马氏距离使用或核对过稳健估计,遮蔽效应已被考虑(3.3.2)
  • 删除敏感性的"剔前/剔后"结果对比已备好(3.3.3)

变换与分布

  • 偏斜变量的形状变换(对数/Box-Cox)已执行且记录参数(3.4.2)
  • 变换前后典型相关对比已看过(升降皆需解释)(3.4.2)
  • Z-score 标准化决策有记录(经典 = 解读约定;正则化 = 数学必需)(3.4.3)
  • 单变量正态:Q-Q 图 + Shapiro-Wilk 结果存档(3.5.1)
  • 多元正态:Mardia 偏度/峰度检验结果存档(3.5.2)
  • 偏离情形对应的退路(直接分析 / 变换 / 置换 / 换方法)已决策(3.5.3)

C.2 模型拟合与检验检查清单(对应第四、五章)

  • 平台选择明确,分析脚本/语法已存档(菜单操作已粘贴为语法)(5.1.4)
  • 三平台同时跑数时,系数一致、符号按约定对齐(5.4)
  • 整体显著性检验(Wilks’ Lambda 或等价统计量)已执行并记录 χ2\chi^2χ2dfdfdf(4.1)
  • 保留对数由"逐级检验 + 碎石图 + 交叉验证"合议确定,决策有记录(4.2)
  • 载荷矩阵(本组载荷 + 交叉载荷)已导出(6.3)
  • 冗余指数(两方向)已计算(4.3)
  • 若使用正则化/稀疏方法:惩罚参数选择路径(交叉验证/BIC)已记录(7.1.3、7.2.4)
  • 若使用核方法:线性 vs 核的样本外对比已执行(7.3.4)
  • 交叉验证的样本分裂种子已固定,结果可复现(9.1.3)

C.3 结果解读与报告发布检查清单(对应第六、九章)

解读纪律

  • 显著性不达标的典型对没有被解读(6.1.1)
  • 效应量已放进领域语境(小/中/大参照或领域基准)(6.1.2)
  • 正文没有因果动词(驱动/导致/影响)描述典型相关(9.3.3)
  • 载荷与权重没有混用,"净贡献 vs 总占有"已在文中交代(6.2.2)
  • 载荷命名满足"6~8 个字能命名"纪律,无法命名的对未强行入报(9.2.5)
  • 共享方差、组内解释、冗余指数三类口径没有混报(6.4.3、表 6-1)
  • 冗余度报告带方向箭头(X→YX\to YXYY→XY\to XYX 分清)(4.3.2)

稳健性

  • 四道诊断工序(残差/杠杆/交叉验证/跨样本)执行或显式跳过并说明(9.1)
  • Bootstrap 权重稳定性摘要(变号率)已生成(6.2.3)
  • 置信区间(Fisher Z 或 Bootstrap)已报告(4.4)
  • 局限段落覆盖:样本量、分布偏离、单群组、交叉验证缺失(9.3.3)

格式合规

  • 三线表规范(顶线/栏目线/底线,无竖线)已检查(6.5.1)
  • ppp 值精度统一(小于 0.001 写 p<0.001p<0.001p<0.001,不出现 0.000)(6.5.1)
  • 表内数字与正文叙述一致(无版本错位)(9.3.2)
  • APA 或中文规范按目标期刊要求择一执行(6.5.2、6.5.3)
  • 方法部分五要素齐全:分组、样本、清洗、检验、稳健性(9.3.1)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VectorShift

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值