Post

PCA, Factor Analysis and Varimax

本文由 Claude Code 生成。目标读者:只有最基础的数学(知道平均数、会一点点向量与矩阵就够)。我们从“词汇假说”这个心理学问题出发,一步步把主成分分析(PCA)、因子分析(factor analysis)与 Varimax 旋转讲清楚:不只给公式,更解释每一步的原理与直觉,看看人们究竟是怎么从一堆人格形容词里“找出”大五这样的人格维度的。

我们到底想干什么

人格特质研究有一条古老的直觉,叫词汇假说(lexical hypothesis):人类生活中真正重要的个体差异,迟早会被编码进日常语言,沉淀成一个个形容词。Galton 最早提出这一想法,Allport 与 Odbert(1936)从英语词典里清点出约 18,000 个描述人的词(参见本博客的 Personality Traits 一篇)。

问题随之而来。这么多词,彼此其实高度重叠:“外向、健谈、合群、热情、爱社交”几乎在说同一件事。如果让很多人按这些词逐一给自己打分(比如 1 到 7 分),便会发现这些词的分数总是一起高、一起低。这提示我们:表面上有几百个词,背后真正起作用的“维度”也许只有少数几个。

于是整件事变成一个数据压缩问题:

核心目标. 给定一张“人 × 词”的大评分表,里面很多列在重复地说同一件事,我们想找出少数几个互不重复的“超级维度”,既能尽量保住原表里的信息,又能被人读懂、命名(于是有了大五 OCEAN)。

完成这件事的主力工具有两个:PCA(主成分分析)和因子分析,外加一个让结果变得可解释的收尾动作:Varimax 旋转。下面从最基础的直觉开始,把它们一件件讲透。

第一步:把直觉打好(方差、相关、“方向”)

先看原始数据长什么样. 把问卷结果摆成一张表(数据矩阵)$X$:有 $n$ 个人、$p$ 个词,就是一个 $n\times p$ 的矩阵,每一行是一个人,每一列是一个词:

\[X=\begin{array}{c|cccc} & \text{词}_1 & \text{词}_2 & \cdots & \text{词}_p\\ \hline \text{人}_1 & x_{11} & x_{12} & \cdots & x_{1p}\\ \text{人}_2 & x_{21} & x_{22} & \cdots & x_{2p}\\ \vdots & \vdots & \vdots & \ddots & \vdots\\ \text{人}_n & x_{n1} & x_{n2} & \cdots & x_{np} \end{array}\]
  • 一行(横着看)= 某个人在所有 $p$ 个词上的打分,是这个人的完整画像。
  • 一列(竖着看)= 所有 $n$ 个人在同一个词上的打分;后面讲的“一列分数”“两列一起动”,说的都是这里的

方差 = 散开的程度. 一列分数(比如所有人在“外向”上的打分),它的方差(variance)衡量这些分数散得有多开。都挤在平均值附近,方差小;有人很高有人很低,方差大。直觉上,方差大的地方信息多:如果一个问题所有人答得一模一样,它就区分不出人;只有大家答得不一样,它才“有用”。

相关 = 两列是否一起动. 两列分数之间的协方差(covariance)/相关(correlation)衡量它们是不是一起涨落。“外向”高的人“健谈”也高 → 正相关;“外向”高的人“内省”反而低 → 负相关;两者毫无关系 → 相关约为 $0$。相关就是词汇假说能落地的关键:正因为很多词彼此强相关,我们才有“压缩”的空间。

直觉. 把每个人想成一个点。如果只看“外向”和“健谈”两列,每个人就是平面上的一个点 $(x,y)$。这些点不会乱铺一地,而是会沿一条斜线挤成一个斜椭圆形的点云(因为两者正相关)。点云越“瘦长”,两列越相关,真正独立的信息就越少。

先标准化. 不同词的打分尺度可能不同(有的词 1 到 5 分、有的 1 到 7 分,有的天生答得分散、有的天生集中)。若直接比协方差,单纯因为量纲大、方差大的词就会显得“更重要”,这并非我们想要的。所以通常先把每一列标准化(z-score):中心化(减去该列均值,让均值为 $0$),再除以该列标准差(让方差为 $1$)。

设某一列(某个词在 $n$ 个人上的打分)为 $x=(x_1,\dots,x_n)$,它的均值、标准差,以及标准化后的值分别为

\[\bar x=\frac1n\sum_{i=1}^n x_i,\qquad \sigma_x=\sqrt{\frac1n\sum_{i=1}^n (x_i-\bar x)^2},\qquad z_i=\frac{x_i-\bar x}{\sigma_x}.\]

(方差、协方差这里都用 $1/n$;若改用样本版的 $1/(n-1)$,下面的结论不变,因为这个常数会在分子与分母里同时出现、约掉。)新列 $z$ 确实均值为 $0$、方差为 $1$

\[\frac1n\sum_{i=1}^n z_i=\frac{1}{\sigma_x}\cdot\frac1n\sum_{i=1}^n (x_i-\bar x)=0, \qquad \frac1n\sum_{i=1}^n z_i^2=\frac{1}{\sigma_x^2}\cdot\frac1n\sum_{i=1}^n (x_i-\bar x)^2=\frac{\sigma_x^2}{\sigma_x^2}=1.\]

为什么标准化后“协方差 = 相关系数”. 先回忆两列 $x,y$ 的协方差与(皮尔逊)相关系数:

\[\operatorname{Cov}(x,y)=\frac1n\sum_{i=1}^n (x_i-\bar x)(y_i-\bar y),\qquad \operatorname{Corr}(x,y)=\frac{\operatorname{Cov}(x,y)}{\sigma_x\,\sigma_y}.\]

相关系数就是“协方差再除掉两列各自的散度 $\sigma_x\sigma_y$”,因而无量纲、恒落在 $[-1,1]$。现在把两列都按上式标准化成 $z_i^{x}$、$z_i^{y}$,再求它们的协方差。由于标准化后均值已是 $0$,协方差就是乘积的直接平均:

\[\operatorname{Cov}(z^{x},z^{y}) =\frac1n\sum_{i=1}^n z_i^{x}\,z_i^{y} =\frac1n\sum_{i=1}^n \frac{x_i-\bar x}{\sigma_x}\cdot\frac{y_i-\bar y}{\sigma_y} =\frac{1}{\sigma_x\sigma_y}\cdot\frac1n\sum_{i=1}^n (x_i-\bar x)(y_i-\bar y) =\frac{\operatorname{Cov}(x,y)}{\sigma_x\sigma_y} =\operatorname{Corr}(x,y).\]

关键就是把两个常数 $\frac{1}{\sigma_x}$、$\frac{1}{\sigma_y}$ 提到求和号外面:标准化时“除以标准差”这一步,正好补上了相关系数定义里的分母 $\sigma_x\sigma_y$。

所以对标准化后的数据,整张协方差矩阵就等于原始数据的相关矩阵:对角线是每列自身的方差($=1$),非对角线是两两的相关系数。人格研究几乎总是从这张相关矩阵出发:它把所有词放到同一把尺子上,PCA 找到的方向才反映“谁和谁一起动”的结构,而不是“谁的量纲碰巧更大”。

协方差矩阵长什么样. 把所有词两两之间的协方差摆成一张表,就是协方差矩阵 $S$。它和上面的数据矩阵不一样:它的行和列都是“词”,是一个 $p\times p$ 的对称方阵:

\[S=\begin{array}{c|cccc} & \text{词}_1 & \text{词}_2 & \cdots & \text{词}_p\\ \hline \text{词}_1 & s_{11} & s_{12} & \cdots & s_{1p}\\ \text{词}_2 & s_{21} & s_{22} & \cdots & s_{2p}\\ \vdots & \vdots & \vdots & \ddots & \vdots\\ \text{词}_p & s_{p1} & s_{p2} & \cdots & s_{pp} \end{array}\]
  • 对角线 $s_{ii}=\operatorname{Var}(\text{词}_i)$ 是每个词自己的方差(前面说的“一列散得多开”)。
  • 非对角线 $s_{ij}$ 是第 $i$ 个词与第 $j$ 个词的协方差(前面说的“两列是否一起动”),且 $s_{ij}=s_{ji}$,所以矩阵对称。
  • 标准化之后,对角线全变成 $1$、非对角线变成相关系数,这张表就成了相关矩阵,也就是 PCA 真正吃进去的那张表。

几何图景(全文的总纲). 把每个人看成一个高维空间里的点:有 $p$ 个词,就是 $p$ 维空间里的一个点。$n$ 个人就是一大团点云。由于很多维高度相关,这团点云并不是各方向均匀的圆球,而是一个被压扁、拉长的椭球:它在某些方向上拉得很长(那里人和人差异大),在另一些方向上薄得几乎是一片(那里大家几乎一样)。PCA 要做的,就是找出这个椭球被拉得最长的几个方向。 抓住这几个方向,就抓住了人群中绝大部分的差异。

第二步:找“方差最大的方向”

先把“方向”这个词说清楚。在我们这里,一个方向就是一套给原始变量配的权重 $w=(w_1,\dots,w_p)$,它把 $p$ 个词的分数线性地揉成一个新分数:

\[\text{新分数}=w_1\cdot(\text{词}_1\text{的分})+\cdots+w_p\cdot(\text{词}_p\text{的分}).\]

比如 $w$ 在“外向、健谈、合群”上权重大、别处接近 $0$,那么这个新分数就近似是一个“社交性”综合分。为了让不同方向公平可比,我们要求权重向量长度为 $1$,即 $w_1^2+\cdots+w_p^2=1$(记作 $w^\top w=1$)。

需要分清的是,方向 $w$ 并不是从数据里现成算出来的:它既不来自数据矩阵 $X$,也不来自协方差矩阵 $S$,而是有待求解的未知量,可以把它想成一束能任意转动的“探照灯”。要做的事,是在所有长度为 $1$ 的方向 $w$ 里挑出最好的那一个;数据矩阵 $X$ 与协方差矩阵 $S$ 只用来给每个候选方向打分,好坏由下面那个数 $w^\top S w$ 决定。直到第三步把最优的 $w$ 解出来,才会看到它恰好是协方差矩阵 $S$ 的特征向量。

用矩阵一次算出所有人的新分数. 上面的式子只是一个人的新分数。把方向写成一个列向量 $w$(长度 $p$,每个词配一个权重),拿第一步那张数据矩阵 $X$ 左乘它,就一次得到所有 $n$ 个人的新分数 $z=Xw$:

\[\underbrace{ \begin{bmatrix} x_{11} & \cdots & x_{1p}\\ \vdots & & \vdots\\ x_{n1} & \cdots & x_{np} \end{bmatrix}}_{X:\ n\times p\ (\text{行=人, 列=词})} \underbrace{ \begin{bmatrix} w_1\\ \vdots\\ w_p \end{bmatrix}}_{w:\ p\times 1} = \underbrace{ \begin{bmatrix} z_1\\ \vdots\\ z_n \end{bmatrix}}_{z:\ n\times 1}\]

维度必须对上:$(n\times p)(p\times 1)=(n\times 1)$。其中

  • $w$ 的长度是 $p$,对应 $X$ 的(每个词配一个权重);
  • 结果 $z$ 的长度是 $n$,对应 $X$ 的(每个人得到一个新分数 $z_i$):第 $i$ 个人的新分数,就是拿他自己那一行的打分、按权重 $w$ 加权求和。

把每个人的数据沿方向 $w$ 揉成一个新分数,在几何上就是把每个点投影到方向 $w$ 上(取它在这条轴上的“影子”)。现在的核心问题是:

该挑哪个方向?让这些新分数最散开的方向,也就是投影方差最大的方向。因为前面说过,方差越大,这个综合维度越能把人和人区分开,保住的信息越多。

把新分数 $z$ 的方差写成公式. 要最大化的,是新分数 $z$ 的方差 $\operatorname{Var}(z)$。把它逐步展开,可以化成一个只跟方向 $w$ 与协方差矩阵 $S$ 有关的式子。

先约定记号:

  • 第 $j$ 个词的打分列记作 $X_j$(即数据矩阵 $X$ 的第 $j$ 列,已标准化:均值 $0$、方差 $1$)。
  • 配给第 $j$ 个词的权重记作 $w_j$。
  • 新分数记作 $z$,定义为各打分列的加权和 $z=w_1X_1+\cdots+w_pX_p$。
  • 协方差矩阵记作 $S$:它第 $i$ 行第 $j$ 列的元素 $S_{ij}=\operatorname{Cov}(X_i,X_j)$ 是第 $i$ 个词 $X_i$ 与第 $j$ 个词 $X_j$ 的协方差;对角线元素 $S_{jj}=\operatorname{Var}(X_j)$ 是第 $j$ 个词 $X_j$ 自己的方差

先看最简单的情形:只有两个词($p=2$). 此时新分数是 $z=w_1X_1+w_2X_2$。先摆出方差的基本展开公式:对任意两个随机变量 $A$、$B$ 与常数 $a$、$b$,

\[\operatorname{Var}(aA+bB)=a^2\operatorname{Var}(A)+b^2\operatorname{Var}(B)+2ab\operatorname{Cov}(A,B).\]

把 $a=w_1,\ A=X_1,\ b=w_2,\ B=X_2$ 代进去,就得到新分数 $z$ 的方差:

\[\operatorname{Var}(z) =\operatorname{Var}(w_1X_1+w_2X_2) =w_1^2\operatorname{Var}(X_1)+w_2^2\operatorname{Var}(X_2)+2w_1w_2\operatorname{Cov}(X_1,X_2).\]

再把每一块换成协方差矩阵 $S$ 的元素(第 $1$ 个词的方差 $\operatorname{Var}(X_1)=S_{11}$、第 $2$ 个词的方差 $\operatorname{Var}(X_2)=S_{22}$、两词的协方差 $\operatorname{Cov}(X_1,X_2)=S_{12}$):

\[\operatorname{Var}(z)=w_1^2 S_{11}+w_2^2 S_{22}+2w_1w_2 S_{12}.\]

再把 $w^\top S w$ 按矩阵乘法展开. 先写清三个量(协方差矩阵 $S$ 对称,故 $S_{12}=S_{21}$):

\[w=\begin{bmatrix}w_1\\ w_2\end{bmatrix},\qquad w^\top=\begin{bmatrix}w_1 & w_2\end{bmatrix},\qquad S=\begin{bmatrix}S_{11} & S_{12}\\ S_{21} & S_{22}\end{bmatrix}.\]

第一步,先算 $S$ 乘列向量 $w$(矩阵乘列向量,结果还是一个列向量):

\[S\,w= \begin{bmatrix} S_{11} & S_{12}\\ S_{21} & S_{22}\end{bmatrix} \begin{bmatrix} w_1\\ w_2\end{bmatrix} =\begin{bmatrix} S_{11}w_1+S_{12}w_2\\ S_{21}w_1+S_{22}w_2\end{bmatrix}.\]

第二步,再用行向量 $w^\top$ 左乘这个结果(行向量乘列向量,结果是一个数):

\[w^\top S w =\begin{bmatrix} w_1 & w_2\end{bmatrix} \begin{bmatrix} S_{11}w_1+S_{12}w_2\\ S_{21}w_1+S_{22}w_2\end{bmatrix} =w_1\,(S_{11}w_1+S_{12}w_2)+w_2\,(S_{21}w_1+S_{22}w_2).\]

第三步,展开并合并同类项(用上 $S_{12}=S_{21}$):

\[w^\top S w =w_1^2 S_{11}+w_2^2 S_{22}+(S_{12}+S_{21})\,w_1w_2 =w_1^2 S_{11}+w_2^2 S_{22}+2S_{12}\,w_1w_2.\]

这跟上面 $\operatorname{Var}(z)$ 的展开逐项一模一样,所以确实有 $\operatorname{Var}(z)=w^\top S w$。

词数 $p$ 再多,也是同一回事. 新分数仍是各列的加权和 $z=w_1X_1+\cdots+w_pX_p$,它的方差就是把所有两两配对的协方差按权重加总:

\[\operatorname{Var}(z) =\sum_{i=1}^{p}\sum_{j=1}^{p} w_i\,w_j\,\operatorname{Cov}(X_i,X_j) =\sum_{i=1}^{p}\sum_{j=1}^{p} w_i\,w_j\,S_{ij} =w^\top S w.\]

其中 $i=j$ 的项是第 $i$ 个词自己的方差(贡献 $w_i^2 S_{ii}$),$i\ne j$ 的项是第 $i$、第 $j$ 个词的协方差(贡献 $w_iw_j S_{ij}$)。一句话:新分数 $z$ 的方差 $\operatorname{Var}(z)$,不管有多少个词,都等于这一个紧凑式子 $w^\top S w$,它只跟我们挑的方向 $w$ 与数据的协方差矩阵 $S$ 有关。

于是问题被干净地写成一个带约束的最大化:

\[\max_{w}\ w^\top S w\qquad \text{约束 } w^\top w=1.\]

第三步:这个方向是谁?特征向量登场

要解上面的最大化,先认识两个词:特征向量(eigenvector)与特征值(eigenvalue)。它们听起来吓人,直觉其实很朴素。

直觉:矩阵是“作用”,特征向量是不被转弯的方向. 矩阵 $S$ 可以“作用”在一个向量上,把 $v$ 变成 $Sv$。对大多数方向,$Sv$ 会既被拉伸又被转向(指向变了)。但有一些特殊方向,$S$ 作用上去只把它拉长(或缩短),方向不变,即 $Sv=\lambda v$;这样的 $v$ 就是特征向量,拉伸倍数 $\lambda$ 就是特征值。对协方差矩阵来说,这些特殊方向恰恰就是那团点云椭球的主轴,而对应的特征值 $\lambda$ 就是点云沿这条主轴的方差(散度)

有了这个图景,答案几乎呼之欲出:点云被拉得最长的方向,就是最大特征值对应的特征向量。下面把它严格地推出来,顺便看清为什么。

用 Lagrange 乘子(温柔版). 我们要在“单位长度”这个约束下最大化 $w^\top S w$。Lagrange 乘子法的思路是:把约束用一个待定数 $\lambda$ 挂进目标,构造

\[\mathcal{L}(w,\lambda)=w^\top S w-\lambda\,(w^\top w-1),\]

然后在它的“平地”(对 $w$ 的梯度为零)处找解。对 $w$ 求梯度并令其为零:

\[\nabla_w\mathcal{L}=2Sw-2\lambda w=0\ \Longrightarrow\ Sw=\lambda w.\]

这一步的直觉. 设想在单位球面上爬山,要爬到 $w^\top S w$ 最高的点。$w^\top S w$ 的“上坡方向”是 $2Sw$。如果在某点,这个上坡方向还有沿球面的分量,就还能再往上走、说明没到顶。所以到顶时,上坡方向必须完全垂直于球面,也就是沿着 $w$ 本身的方向 → $Sw$ 与 $w$ 平行 → $Sw=\lambda w$。一句话:约束最优点处,目标的梯度只能径向指出去。 这正好逼出特征向量方程。

把 $Sw=\lambda w$ 代回目标,得 $w^\top S w=w^\top(\lambda w)=\lambda\,(w^\top w)=\lambda$。也就是说:

关键结论. 候选的最优方向都是 $S$ 的特征向量;而沿某个特征向量的投影方差恰好等于它的特征值 $\lambda$。要让方差最大,就取最大特征值对应的特征向量。这个方向就是第一主成分(first principal component, PC1)。

第四步:后续主成分、保留几个、解释了多少

第二、第三主成分. 抓住 PC1 后,人群在这个方向上的差异就“解释掉了”。我们接着在与 PC1 垂直的所有方向里,再找方差最大的那个,就得到 PC2;再垂直于前两者找 PC3,以此类推。数学上,这等价于把 $S$ 做特征分解,把全部特征向量按特征值从大到小排好:

\[S=\sum_{k=1}^p\lambda_k\,w_k w_k^\top,\qquad \lambda_1\ge\lambda_2\ge\cdots\ge\lambda_p\ge 0.\]

每个主成分给每个人算出一个得分 $z_k=Xw_k$(把数据投影到第 $k$ 个方向),不同主成分的得分互不相关,这正是我们要的“互不重复的维度”。

每个主成分解释了多少方差. 所有特征值之和等于总方差($\lambda_1+\cdots+\lambda_p=\operatorname{tr}(S)$,即各变量方差之和)。所以第 $k$ 个主成分解释的方差比例

\[\frac{\lambda_k}{\sum_{j=1}^p\lambda_j}=\frac{\lambda_k}{\operatorname{tr}(S)}.\]

直觉. 特征值就是“这个方向上有多少信息”的度量。前几个特征值往往很大、迅速变小,意味着少数几个方向就装下了大部分差异,这正是词汇假说所预言的:几百个词背后只有少数几个维度。

该保留几个主成分? 几条常用经验法则:

  • Kaiser 准则:保留特征值大于 $1$ 的成分。直觉:用的是相关矩阵时,一个原始变量的方差正好是 $1$;一个主成分若连“一个变量那么多信息”都装不下($\lambda\lt 1$),就不值得单列。
  • 碎石图(scree plot):把特征值从大到小画出来,曲线常常先陡降、再变平;在那个“肘部”截断,平台之后的多半是噪声。
  • 平行分析(parallel analysis):把真实特征值和“纯随机数据”产生的特征值比,只保留明显高于随机水平的成分,最稳健。

在人格数据上,这些准则常常一致地指向约 5 个维度。

和 SVD 的关系(计算备注). 实际算的时候,常不直接对 $S$ 做特征分解,而是对(中心化的)数据矩阵 $X$ 做奇异值分解(SVD)$X=U\Sigma V^\top$。可以验证 $X^\top X=V\Sigma^2 V^\top$,所以主成分方向就是右奇异向量 $w_k=v_k$,特征值 $\lambda_k=\sigma_k^2/(n-1)$,主成分得分就是 $XV=U\Sigma$。这只是数值上更稳的同一件事,不影响理解。

一个完整的数值例子:从头算一遍 PCA

光有公式还不够。我们拿一组很小的数据,把上面 PCA 的每一步都实际算出来,看清每一步的输入与输出,矩阵都用表格示意。

输入:5 个人,2 个词的打分。 让 5 个人给“外向”和“健谈”两个词打分(为方便取整数),数据矩阵 $X$ 是 $5\times 2$ 的:

外向 $x_1$健谈 $x_2$
P121
P245
P365
P489
P555

这两列显然正相关(打分高的人两项都高)。PCA 的目标:把这两列压成一个能抓住大部分差异的“社交性”综合维度。

第 1 步:中心化(减去列均值)。 两列均值都是 $\bar x_1=\bar x_2=5$。每个数减去本列均值,得到中心化矩阵 $X_c$:

$x_1-\bar x_1$$x_2-\bar x_2$
P1-3-4
P2-10
P310
P434
P500

第 2 步:算协方差矩阵 $S$。 用 $S=\frac{1}{n-1}X_c^\top X_c$(这里 $n=5$,故除以 $4$)。例如方差 $S_{11}=\frac{(-3)^2+(-1)^2+1^2+3^2+0^2}{4}=\frac{20}{4}=5$,协方差 $S_{12}=\frac{(-3)(-4)+(-1)\cdot 0+1\cdot 0+3\cdot 4+0}{4}=\frac{24}{4}=6$。得到 $2\times 2$ 对称矩阵:

$S$外向健谈
外向56
健谈68

第 3 步:特征分解。 解特征方程 $\det(S-\lambda I)=0$,即

\[(5-\lambda)(8-\lambda)-6^2=\lambda^2-13\lambda+4=0,\]

得两个特征值 $\lambda_1=\frac{13+\sqrt{153}}{2}\approx 12.685$ 与 $\lambda_2=\frac{13-\sqrt{153}}{2}\approx 0.315$(注意 $\lambda_1+\lambda_2=13$,恰等于 $S$ 的迹 $5+8$)。对应的单位特征向量(主成分方向)为:

分量$w_1$(PC1)$w_2$(PC2)
外向0.6150.788
健谈0.788-0.615

第一主成分 $w_1\approx(0.615,\ 0.788)$ 几乎是“两项都加正权重”的方向,正对应“社交性”这个综合维度。

第 4 步:每个主成分解释了多少方差。 解释比例就是特征值占比:

\[\frac{\lambda_1}{\lambda_1+\lambda_2}=\frac{12.685}{13}\approx 97.6\%, \qquad \frac{\lambda_2}{\lambda_1+\lambda_2}\approx 2.4\%.\]

也就是说,PC1 一个方向就抓住了全部差异的 97.6%,PC2 几乎可以扔掉。这正是“两列高度相关、其实只有一个维度”的数值体现。

第 5 步:投影到 PC1,得到压缩后的得分。 每个人的 PC1 得分 $z_1=X_c\,w_1$(中心化坐标与 $w_1$ 做点乘):

原始 $(x_1,x_2)$中心化PC1 得分 $z_1$
P1(2, 1)(-3, -4)-5.00
P2(4, 5)(-1, 0)-0.62
P3(6, 5)(1, 0)0.62
P4(8, 9)(3, 4)5.00
P5(5, 5)(0, 0)0.00

于是每个人原来的两个数 $(x_1,x_2)$,被压成了一个数 $z_1$,只丢掉 2.4% 的信息。$z_1$ 越大越“社交”:P4 最高($+5.0$)、P1 最低($-5.0$)、P5 恰在平均水平($0$)。可以验证这些得分的样本方差正好是 $\lambda_1\approx 12.685$,且 PC1 与 PC2 的得分不相关。

这个小例子说明了什么。 两个相关的词,被 PCA 找到的一个方向(“社交性”)几乎完全替代了。若把同一套方法用到几百个彼此相关的人格形容词上,同样的事会发生,只不过最后剩下的不是 1 个、而是约 5 个互不重复的维度,这就是后面要讲的大五的雏形。

第五步:PCA 还不够诚实,因子分析

到这里,我们已经能把几百个词压成几个主成分(principal components)了。但主成分分析(PCA)有一个立场上的小问题:它把每个词里的全部变异(variance,既包括这个词和别的词共享的部分,也包括只属于这个词自己的怪癖,还有测量时的随机误差)统统塞进主成分,不加区分。而人格研究真正想问的,是另一件更挑剔的事:

更诚实的问法. 是不是存在少数几个看不见的“公共因子”(common factors,比如某种“外向性”),它们在背后同时牵动着一大批词?如果是,那每个词的分数就能拆成两块:一块由这些公共因子共同造成(这一块在很多词之间是共享的),另一块只属于这个词自己(它特有的含义,再加上测量误差)。

把这个想法写成数学模型,就是公共因子模型(common factor model)。下面一项一项把它搭起来。

先盯住一个人。他在 $p$ 个词上的打分排成一个长度为 $p$ 的列向量 $x=(x_1,\dots,x_p)^\top$,其中 $x_i$ 是他在第 $i$ 个词上的分。模型说,这个 $x$ 由三部分相加而成。

第一部分,各词的平均分 $\mu$. $\mu=(\mu_1,\dots,\mu_p)^\top$ 也是长度为 $p$ 的向量,$\mu_i$ 是第 $i$ 个词在所有人身上的平均分。它只负责把每个词的“基准线”摆正,和这个人是谁无关。

第二部分,公共因子的贡献 $\Lambda f$. 设有 $m$ 个公共因子(common factors),个数 $m$ 远小于词数 $p$。把这个人在这 $m$ 个因子上的“隐藏水平”排成一个长度为 $m$ 的向量 $f=(f_1,\dots,f_m)^\top$,例如 $f_1$ 是他的“外向程度”、$f_2$ 是“尽责程度”。因子是看不见的(只看得到词的打分,看不到“外向程度”本身),所以约定把它们标准化:均值为 $0$、方差为 $1$,且彼此互不相关,写成协方差矩阵 $\operatorname{Cov}(f)=I_m$($m\times m$ 的单位矩阵,identity matrix)。每个词被各因子影响的强弱,记在一个 $p\times m$ 的因子载荷矩阵(factor loadings)$\Lambda$ 里:它第 $i$ 行第 $j$ 列的元素 $\lambda_{ij}$ 表示第 $j$ 个因子对第 $i$ 个词的影响有多大;于是 $\Lambda$ 的第 $i$ 行 $(\lambda_{i1},\dots,\lambda_{im})$ 就是“第 $i$ 个词的配方”。矩阵 $\Lambda$ 乘上因子向量 $f$,得到长度为 $p$ 的向量 $\Lambda f$,它第 $i$ 个分量

\[(\Lambda f)_i=\lambda_{i1}f_1+\lambda_{i2}f_2+\cdots+\lambda_{im}f_m\]

就是“这个人的各因子水平,按第 $i$ 个词的配方加权求和”,即公共因子在第 $i$ 个词上留下的那部分分数。

把整张因子载荷矩阵 $\Lambda$ 摊开,它是 $p$ 行(每行一个词)、$m$ 列(每列一个因子)的一张表:

\[\Lambda=\begin{array}{c|ccc} & \text{因子}_1 & \cdots & \text{因子}_m\\ \hline \text{词}_1 & \lambda_{11} & \cdots & \lambda_{1m}\\ \text{词}_2 & \lambda_{21} & \cdots & \lambda_{2m}\\ \vdots & \vdots & \ddots & \vdots\\ \text{词}_p & \lambda_{p1} & \cdots & \lambda_{pm} \end{array}\]

横着看第 $i$ 行 $(\lambda_{i1},\dots,\lambda_{im})$,是第 $i$ 个词的“配方”(它由各因子按什么比例混成);竖着看第 $j$ 列 $(\lambda_{1j},\dots,\lambda_{pj})$,是第 $j$ 个因子在所有词上的“足迹”(它把哪些词牵动得厉害)。

第三部分,每个词自己的成分 $\varepsilon$. $\varepsilon=(\varepsilon_1,\dots,\varepsilon_p)^\top$ 也是长度为 $p$ 的向量,$\varepsilon_i$ 叫第 $i$ 个词的独特因子(unique factor):它装的是这个词特有的含义加上测量误差,是公共因子解释不到的那部分。约定它均值为 $0$,且各词的独特因子互不相关,所以它的协方差矩阵 $\Psi=\operatorname{Cov}(\varepsilon)$ 是一个对角矩阵(diagonal matrix):对角线上第 $i$ 个元素 $\psi_i$ 是第 $i$ 个词独特成分的方差,对角线以外全是 $0$(不同词的怪癖之间没有关联)。

三部分相加,就是公共因子模型的核心方程。先看一个词的标量形式(最直观):

\[x_i=\mu_i+\underbrace{\lambda_{i1}f_1+\cdots+\lambda_{im}f_m}_{\text{公共因子的贡献}}+\underbrace{\varepsilon_i}_{\text{这个词自己的成分}}.\]

把全部 $p$ 个词叠成向量,就是紧凑形式 $x=\mu+\Lambda f+\varepsilon$。

模型对“词与词之间的相关”作了什么预测? 这正是它和数据对接的地方。词的打分围绕各自均值上下波动,刻画这种波动与共动的,是 $x$ 的协方差矩阵(covariance matrix)$\Sigma$($p\times p$,也就是前面那张词×词矩阵 $S$ 在模型里的名字)。在模型下把它算出来:均值 $\mu$ 是常数、不影响波动,可以丢掉,于是 $\Sigma=\operatorname{Cov}(x)=\operatorname{Cov}(\Lambda f+\varepsilon)$。公共因子 $f$ 与独特因子 $\varepsilon$ 互不相关,交叉项为 $0$,协方差可以拆开:再用线性变换的协方差法则(对常数矩阵 $A$ 有 $\operatorname{Cov}(Af)=A\,\operatorname{Cov}(f)\,A^\top$),并代入 $\operatorname{Cov}(f)=I_m$、$\operatorname{Cov}(\varepsilon)=\Psi$:

\[\Sigma=\operatorname{Cov}(\Lambda f)+\operatorname{Cov}(\varepsilon) =\Lambda\,\operatorname{Cov}(f)\,\Lambda^\top+\Psi =\Lambda I_m\Lambda^\top+\Psi =\Lambda\Lambda^\top+\Psi.\]

这条 $\Sigma=\Lambda\Lambda^\top+\Psi$ 是整个因子分析的支点。它说:词与词之间之所以相关,全部来自它们共享的公共因子(这部分写在 $\Lambda\Lambda^\top$ 里);各词自己的怪癖 $\Psi$ 只待在对角线上,只抬高每个词自己的方差,不在任何两个不同的词之间制造相关。也就是说,$\Sigma$ 的非对角线(两个不同词的协方差)完全由 $\Lambda\Lambda^\top$ 决定。因子分析做的事正好反过来:已知词与词的相关矩阵,去把那个能复现这些相关的载荷矩阵 $\Lambda$ 找出来。

把 $\Lambda\Lambda^\top$ 这张矩阵也摊开. $\Lambda$ 是 $p\times m$,它的转置 $\Lambda^\top$ 是 $m\times p$;两者相乘 $\Lambda\Lambda^\top$ 是一个 $p\times p$ 的方阵(行和列都是词,正好和 $\Sigma$ 同形)。它第 $i$ 行第 $k$ 列的元素,是 $\Lambda$ 的第 $i$ 行第 $k$ 行做点积:

\[(\Lambda\Lambda^\top)_{ik} =\lambda_{i1}\lambda_{k1}+\lambda_{i2}\lambda_{k2}+\cdots+\lambda_{im}\lambda_{km} =\sum_{j=1}^m\lambda_{ij}\lambda_{kj}.\]

整张写出来就是

\[\Lambda\Lambda^\top= \begin{pmatrix} \sum_j\lambda_{1j}^2 & \sum_j\lambda_{1j}\lambda_{2j} & \cdots & \sum_j\lambda_{1j}\lambda_{pj}\\ \sum_j\lambda_{2j}\lambda_{1j} & \sum_j\lambda_{2j}^2 & \cdots & \sum_j\lambda_{2j}\lambda_{pj}\\ \vdots & \vdots & \ddots & \vdots\\ \sum_j\lambda_{pj}\lambda_{1j} & \sum_j\lambda_{pj}\lambda_{2j} & \cdots & \sum_j\lambda_{pj}^2 \end{pmatrix}.\]

有两条读法:

  • 对角线上第 $i$ 个元素 $(\Lambda\Lambda^\top)_{ii}=\sum_j\lambda_{ij}^2$,正是第 $i$ 个词的共同度 $h_i^2$,即它被公共因子解释掉的那部分方差。
  • 非对角线上 $(\Lambda\Lambda^\top)_{ik}=\sum_j\lambda_{ij}\lambda_{kj}$($i\ne k$),是模型预测的第 $i$ 个词与第 $k$ 个词的协方差:只要两个词在同一个因子上都载荷不小(乘积为正),就会被算出正相关。它们之所以相关,正是因为共享了这些因子。

再叠加 $\Psi$。$\Psi$ 是对角矩阵,只往对角线上各加一个独特度 $\psi_i$,非对角线分文不动,于是

\[\Sigma_{ii}=\underbrace{\textstyle\sum_{j}\lambda_{ij}^2}_{h_i^2}+\psi_i, \qquad \Sigma_{ik}=\sum_{j}\lambda_{ij}\lambda_{kj}\quad(i\ne k).\]

也就是说,$\Sigma$ 的对角线被抬成“共同度 + 独特度”,而非对角线一字未改,完全由 $\Lambda\Lambda^\top$ 决定。这就坐实了上一段那句话:词与词之间的相关,全部来自共享的公共因子。

一个小例子($p=3$ 个词、$m=2$ 个因子). 设载荷矩阵为

\[\Lambda=\begin{pmatrix}0.8 & 0.1\\ 0.7 & 0.2\\ 0.1 & 0.9\end{pmatrix}\]

(词 1、词 2 主要载在因子 1 上,词 3 主要载在因子 2 上)。它乘上自己的转置:

\[\Lambda\Lambda^\top =\begin{pmatrix}0.8 & 0.1\\ 0.7 & 0.2\\ 0.1 & 0.9\end{pmatrix} \begin{pmatrix}0.8 & 0.7 & 0.1\\ 0.1 & 0.2 & 0.9\end{pmatrix} =\begin{pmatrix}0.65 & 0.58 & 0.17\\ 0.58 & 0.53 & 0.25\\ 0.17 & 0.25 & 0.82\end{pmatrix}.\]

逐个验证:$(1,2)$ 元 $=0.8\times0.7+0.1\times0.2=0.56+0.02=0.58$,词 1 与词 2 都重载于因子 1,模型于是预测它们强相关;$(1,3)$ 元 $=0.8\times0.1+0.1\times0.9=0.08+0.09=0.17$ 很小,词 1 与词 3 几乎不共享因子,模型就预测它们关系很弱;对角线 $(1,1)=0.8^2+0.1^2=0.65$ 正是词 1 的共同度。整张 $\Lambda\Lambda^\top$,就是这套载荷所“预言”的那张词×词协方差结构。

PCA 与因子分析的根本区别(务必记住). PCA 解释全部方差,不区分“共享的”与“独有的”;因子分析(factor analysis)把共同变异($\Lambda\Lambda^\top$)与独特变异($\Psi$,含误差)分开,只用公共因子去解释“词之间为什么相关”。人格维度严格说应当是公共因子,PCA 只是它的一个常用近似。

每个词的方差怎么被瓜分:共同度与独特度. 把上面那条标量方程两边求方差,就能看清一个词的方差是如何分配的。第 $i$ 个词的方差 $\sigma_{ii}=\operatorname{Var}(x_i)$;由于各因子两两不相关、方差都是 $1$,独特因子又和它们无关,方差直接相加:

\[\sigma_{ii}=\underbrace{\lambda_{i1}^2+\lambda_{i2}^2+\cdots+\lambda_{im}^2}_{\text{被公共因子解释的部分}}+\underbrace{\psi_i}_{\text{独特部分}}.\]

前一块,即第 $i$ 个词的载荷平方和,叫这个词的共同度(communality):

\[h_i^2=\sum_{j=1}^m\lambda_{ij}^2,\]

它是第 $i$ 个词的方差中被公共因子解释掉的那一部分;剩下的 $\psi_i$ 叫独特度(uniqueness)。于是 $\sigma_{ii}=h_i^2+\psi_i$。如果一开始就把每个词标准化成方差为 $1$(第一步做过这件事),那么 $h_i^2+\psi_i=1$,共同度 $h_i^2$ 就是一个落在 $0$ 到 $1$ 之间的比例:越接近 $1$,这个词越是被几个公共因子“说清楚”了;越接近 $0$,这个词越像个自说自话的孤词。

最后留意载荷本身的含义:在这套(词已标准化、因子又互不相关的)设定下,可以证明载荷 $\lambda_{ij}$ 恰好等于第 $i$ 个词与第 $j$ 个因子之间的相关系数(correlation),它度量“这个词有多像这个因子”。整张载荷矩阵 $\Lambda$,正是最后要盯着看、并给各列命名(比如把高载荷集中在社交类词上的那一列命名为“外向性”)的那张表。

第六步:为什么因子不唯一,以及“旋转”

因子分析有一个让初学者意外、却恰恰关键的性质:能复现同一张相关矩阵的因子载荷不止一套,也就是 $\Lambda$ 并不唯一。

要看清这点,先认识正交矩阵(orthogonal matrix)。一个 $m\times m$ 的矩阵 $R$ 若满足 $R^\top R=I_m$(它的转置乘它自己等于单位矩阵),就叫正交矩阵;几何上它代表对 $m$ 维空间的一次纯旋转或翻转,既不拉伸也不压扁,保持所有向量的长度和夹角不变。由 $R^\top R=I_m$ 也立即得到 $RR^\top=I_m$。

现在拿任意一个正交矩阵 $R$,用它把载荷转一下,得到新载荷 $\Lambda^\ast=\Lambda R$,算它对相关矩阵的那一项贡献:

\[\Lambda^\ast\Lambda^{\ast\top} =(\Lambda R)(\Lambda R)^\top =\Lambda R\,R^\top\Lambda^\top =\Lambda (RR^\top)\Lambda^\top =\Lambda I_m\Lambda^\top =\Lambda\Lambda^\top.\]

中间用到了转置规则 $(\Lambda R)^\top=R^\top\Lambda^\top$ 和 $RR^\top=I_m$。结论是:旋转后的载荷给出的 $\Lambda^\ast\Lambda^{\ast\top}$ 和原来一模一样,因此 $\Sigma=\Lambda^\ast\Lambda^{\ast\top}+\Psi$ 也分毫不差。(同时把因子也转成 $f^\ast=R^\top f$,可以验证它仍然均值 $0$、方差 $1$、互不相关,模型照样成立。)两套不同的载荷,把数据拟合得一样好。

直觉. 公共因子就像给点云架的几根坐标轴。把这几根轴整体转一个角度,每个点的实际位置没变、它们之间的关系(相关)也没变,变的只是“每个点在新轴上的坐标读数”。既然怎么转都同样合身,那就主动挑一个最好解释的转法。这就是“旋转”的全部动机:把多出来的自由度用在可解释性上。

既然怎么转都同样合身,这份“转的自由”就成了一张可用的牌:主动挑一个最好解释的转法。这就是旋转(rotation)的全部动机。

该往哪转?简单结构. Thurstone 提出一个判断“载荷表好不好解释”的标准,叫简单结构(simple structure):最理想的载荷表是,每个词只在少数(最好是一个)因子上载荷很高,在其余因子上都接近零;反过来看,每个因子也只被一簇特定的词以高载荷“指认”出来。这样每个因子的含义就一目了然:看哪一簇词在它那一列上亮起来,就知道它是什么。

画面. 把每个词画成“载荷平面”上的一个点(横坐标是它在因子 1 上的载荷,纵坐标是因子 2 上的)。简单结构,就是希望这些点尽量贴着坐标轴分布(要么靠横轴、要么靠纵轴),而不是斜飘在中间。旋转坐标轴,就是为了把这些点尽量“对齐”到轴上。

第七步:Varimax,把载荷推向“非高即零”

Varimax(Kaiser, 1958)是最常用的一种正交旋转。第六步说过,旋转(rotation)不改变模型对数据的拟合,只重新分配载荷;Varimax 就是把“挑一个最好解释的转法”这件事,变成一个能精确最大化的数值目标。下面先把“转一对因子”彻底算清楚,再说它到底要最大化什么,最后讲怎么一步步转。

先把“旋转”算清楚:一对因子转 $\theta$ 角,载荷怎么变. 为了看得见,先只看两个因子($m=2$)的情形。把每个词画成载荷平面(loading plane)上的一个点:第 $i$ 个词的坐标,就是它在两个因子上的载荷 $(\lambda_{i1},\lambda_{i2})$,横轴是因子 1、纵轴是因子 2。所谓“旋转因子”,在这张图上就是把两根坐标轴整体转一个角度 $\theta$。第六步那个正交矩阵 $R$,在二维就是标准的旋转矩阵

\[R=\begin{pmatrix}\cos\theta&-\sin\theta\\\sin\theta&\cos\theta\end{pmatrix}.\]

把它代入 $\Lambda^\ast=\Lambda R$,逐行乘出来,就得到第 $i$ 个词在新因子上的两个载荷:

\[\lambda^\ast_{i1}=\lambda_{i1}\cos\theta+\lambda_{i2}\sin\theta,\qquad \lambda^\ast_{i2}=-\lambda_{i1}\sin\theta+\lambda_{i2}\cos\theta.\]

这两条式子是关键:选一个旋转,就是选一个角度 $\theta$;一旦定了 $\theta$,全表的载荷就按上式一起变。但有一样东西不变:每个点到原点的距离 $\sqrt{\lambda_{i1}^2+\lambda_{i2}^2}$(它正是这个词的共同度 $h_i$,见第五步)在旋转下保持不变,旋转只是把这段长度在两个因子之间重新分配。于是问题被收成一个一维搜索:转到哪个角度 $\theta$,这张载荷表最干净?

Varimax 要最大化的:每一列载荷平方的方差. 什么叫“干净”?简单结构(simple structure)希望每个点尽量贴着某一根坐标轴:靠横轴意味着 $\lambda_{i1}$ 大、$\lambda_{i2}$ 近 $0$,靠纵轴则反过来;最怕的是点斜飘在 $45$ 度线附近(两个载荷一样不大不小)。换句话说,希望每一列(每个因子)的载荷,要么大、要么接近零,少有中间值

度量“一列数有没有走向两极”的现成工具,正是方差。Varimax 盯住的,就是每个因子(载荷矩阵 $\Lambda$ 的每一列)里,载荷平方 $\lambda_{ij}^2$ 这组数的方差,并要它尽量大。用平方 $\lambda_{ij}^2$ 而不是载荷本身,是因为只在意载荷的大小、不在意正负(正负只表示这个词与因子是同向还是反向)。

一个小例子能立刻看清“为什么方差大就等于结构清晰”。设某个因子那一列有 $4$ 个词,比较两种情形(为公平,两种情形的载荷平方之和相同,即这个因子解释掉的总方差一样多):

第 $j$ 列的载荷平方 $\lambda_{ij}^2$平均这列平方载荷的方差
$0.5,\ 0.5,\ 0.5,\ 0.5$(全是中间值)$0.5$$0.5-0.5^2=0$
$1,\ 1,\ 0,\ 0$(两极分化)$0.5$$\tfrac{1+1+0+0}{4}-0.5^2=0.25$

两列的“总量”一样(平均都是 $0.5$),但下面那种两极分化的方差是 $0.25$,上面那种中不溜的方差是 $0$。Varimax 要把方差顶到最大,于是天然偏爱下面那种:每个词要么明确属于这个因子($\lambda_{ij}^2$ 接近 $1$)、要么明确不属于(接近 $0$)。这正是简单结构。

为了写成公式,先给“平方载荷”起个名字。把载荷矩阵 $\Lambda$ 的每个元素逐个平方,得到一个同样 $p\times m$ 大小的矩阵,称它为平方载荷矩阵,它第 $i$ 行第 $j$ 列的元素就是 $\lambda_{ij}^2$。Varimax 要算方差的,正是这张平方载荷矩阵的每一列:它的第 $j$ 列是一组 $p$ 个数 $\lambda_{1j}^2,\lambda_{2j}^2,\dots,\lambda_{pj}^2$(第 $j$ 个因子在所有 $p$ 个词上的平方载荷),我们要的是这一列的方差

按方差的定义,一组数要先求平均,再求“每个数与平均之差的平方”的平均。第 $j$ 列的平均记作

\[\bar q_j=\frac1p\sum_{i=1}^p \lambda_{ij}^2\]

(它就是第 $j$ 个因子的平均平方载荷),于是第 $j$ 列的方差按定义是

\[\operatorname{Var}_j=\frac1p\sum_{i=1}^p\big(\lambda_{ij}^2-\bar q_j\big)^2.\]

把括号里的平方展开,可以化成更好算的“平方的平均 $-$ 平均的平方”形式。这一步逐行写出来:

\[\begin{aligned} \operatorname{Var}_j &=\frac1p\sum_{i=1}^p\big(\lambda_{ij}^2-\bar q_j\big)^2 =\frac1p\sum_{i=1}^p\Big(\lambda_{ij}^4-2\bar q_j\,\lambda_{ij}^2+\bar q_j^2\Big)\\[2pt] &=\frac1p\sum_{i=1}^p\lambda_{ij}^4 \;-\;2\bar q_j\cdot\underbrace{\frac1p\sum_{i=1}^p\lambda_{ij}^2}_{=\,\bar q_j} \;+\;\underbrace{\frac1p\sum_{i=1}^p\bar q_j^2}_{=\,\bar q_j^2}\\[2pt] &=\frac1p\sum_{i=1}^p\lambda_{ij}^4-2\bar q_j^2+\bar q_j^2 =\frac1p\sum_{i=1}^p\lambda_{ij}^4-\bar q_j^2. \end{aligned}\]

中间用到两点:$\frac1p\sum_i\lambda_{ij}^2$ 恰是平均 $\bar q_j$;而 $\bar q_j$ 是个常数,对 $i$ 求平均不变,所以 $\frac1p\sum_i\bar q_j^2=\bar q_j^2$。再把 $\bar q_j=\frac1p\sum_i\lambda_{ij}^2$ 代回 $\bar q_j^2$,第 $j$ 列的方差就是

\[\operatorname{Var}_j=\frac{1}{p}\sum_{i=1}^p \lambda_{ij}^4-\left(\frac{1}{p}\sum_{i=1}^p \lambda_{ij}^2\right)^2.\]

Varimax 把平方载荷矩阵全部 $m$ 列的方差加起来,作为它要最大化的目标函数 $V$:

\[V=\sum_{j=1}^m\operatorname{Var}_j =\sum_{j=1}^m\left[\frac{1}{p}\sum_{i=1}^p \lambda_{ij}^4-\left(\frac{1}{p}\sum_{i=1}^p \lambda_{ij}^2\right)^2\right].\]

它衡量的是“整张平方载荷矩阵里,每一列分得有多两极”。$V$ 越大,各列越是非高即零,简单结构越好。

Kaiser 归一化(Kaiser normalization). 上面这个 $V$ 有点偏心:共同度大的词(载荷整体偏大)在方差里占的话语权更大,会把旋转往自己这边拉。为抵消这点,实践中常先把载荷矩阵的每一行除以该行的共同度 $h_i$(把每个词的那段长度都拉到 $1$,让大词小词同等出力),用归一化后的载荷去转,转完再把每行乘回 $h_i$ 还原。

旋转只重新分配载荷,不改变拟合. 因为只在正交旋转里挑($\Lambda^\ast=\Lambda R$),前面已证 $\Lambda^\ast\Lambda^{\ast\top}=\Lambda\Lambda^\top$,所以模型对相关矩阵的拟合一点没变;而且每个词的共同度也不变,正交旋转保持每一行的长度,即 $h_i^{\ast 2}=\lVert R^\top \lambda_{i\cdot}\rVert^2=\lVert \lambda_{i\cdot}\rVert^2=h_i^2$(这里 $\lambda_{i\cdot}$ 表示 $\Lambda$ 的第 $i$ 行)。变的只是“这个词那点共同方差,在各因子之间怎么分”。Varimax 把它尽量集中到一个因子上。

怎么真的转(算法). 只有两个因子时,$V$ 就是角度 $\theta$ 的一元函数,直接求极值即可。因子多于两个时,没有“一口气把所有轴转好”的闭式解,但有一个好用的办法:一次只转一对因子

任取两个因子(载荷矩阵里的两列),把别的列按住不动,只在这两列张成的平面里转角度 $\theta$。这时 $V$ 只随这一个 $\theta$ 变,于是可以求极值:把上面的 $\lambda^\ast(\theta)$ 代入 $V$,令导数 $\dfrac{dV}{d\theta}=0$,再用倍角公式化简。由于载荷在 $V$ 里是四次方、而旋转又带 $\cos\theta$、$\sin\theta$,化简后得到的是一个关于 $4\theta$ 的方程。为把它写紧凑,对这一对(归一化后的)载荷记 $x_i=\lambda_{i1}$、$y_i=\lambda_{i2}$,并引入两个倍角量

\[u_i=x_i^2-y_i^2,\qquad v_i=2x_iy_i\]

(它们正是点 $(x_i,y_i)$ 换成“两倍角”坐标后的横、纵分量)。这时最优角 $\theta$ 满足 Kaiser 给出的闭式公式

\[\tan(4\theta)=\frac{2\big[\,p\sum_i u_iv_i-(\sum_i u_i)(\sum_i v_i)\,\big]}{p\sum_i (u_i^2-v_i^2)-\big[(\sum_i u_i)^2-(\sum_i v_i)^2\big]}.\]

这个公式不必记,它只是“令导数为零”解出来的最优角度;$\tan(4\theta)$ 在一圈里给出几个候选 $\theta$,取其中让 $V$ 最大(而非最小)的那个。对应的旋转矩阵仍是上面那个 $R$。

把这套“转一对”反复用起来,就是完整算法:遍历每一对因子、各自转到它的最优角度,扫完所有对算作一轮,再从头扫,直到载荷不再变化为止。每转一对都不会让 $V$ 变小,而 $V$ 又有上界,所以这个过程一定收敛,停在一个(局部)最优的简单结构上。

第八步:于是,大五出现了

把这一整套(标准化 → 提取因子 → Varimax 旋转)用到人格形容词的大规模评分数据上,反复浮现的结果是约五个清晰、可命名的因子,也就是大五人格(Big Five / OCEAN):开放性(Openness)、尽责性(Conscientiousness)、外向性(Extraversion)、宜人性(Agreeableness)、神经质(Neuroticism)。从 Tupes 与 Christal(1961)、Norman(1963)到 Goldberg 的词汇学研究,都在不同样本、不同词表里复现出这一结构。这种跨样本的可复现,正是大五被当作稳健“描述性框架”的统计底气。

几条要记在心里的边界

  • PCA 不等于因子分析. PCA 是换坐标加降维、解释总方差;因子分析是潜变量模型、区分共同与独特方差。人格维度严格说来自因子分析,PCA 常作近似,两者在小样本或共同度低时结论可能不同。
  • 旋转是一种“选择”,不是“发现”. 简单结构只是为了可解释的启发式;Varimax 给的是正交解(因子之间被强行设为不相关)。但现实里“外向”和“宜人”可能本就相关,这时该用斜交旋转(oblique,如 Promax、Oblimin),得到的因子允许相关,结论也会不同。选哪种旋转本身就是一个判断。
  • 维度是被“造”出来的描述,不是被“发现”的本质. 因子的数目旋转方法词表样本(乃至语言文化)都会影响结果。大五是对相关结构的一个简洁、好用的概括:它描述了人与人怎么不同,但并不直接解释这些不同从何而来(基因?环境?)。“能压缩、能预测”永远不等于“已经解释”,这一点,和人格特质研究一贯的告诫完全一致。
This post is licensed under CC BY 4.0 by the author.