因子分析——数学原理及R语言代码

正交因子分析

目的

FactorAnalysis的目的是从多个高度相关的观测变量中提取出少数几个LatentFactor,这些因子代表了变量背后的共通结构,从而实现降维并提升可解释性。

假设对一组学生进行了以下六门课程的测试:语文、英语、数学、物理、化学、生物,发现语文和英语成绩之间高度相关,数学、物理、化学、生物也彼此高度相关。此时可以猜测:这些成绩可能是由两个更基本的"能力"决定的,比如语言能力和理科能力。通过因子分析就可以提取出这两个潜在因子,并发现语文和英语主要由"语言能力"因子决定,理科四门主要由"理科能力"因子解释。这样就可以用两个因子有效地概括了六个变量的结构,同时让模型更易解释、更简洁。

正交因子分析认为因子间是正交的,即不相关的,斜交因子分析中因子间可以是相关的,本文只探讨正交因子分析。

数学原理

设 ' X ' `\mathbf{X}` 'X'是一个可观测的 ' m ' `m` 'm'维随机向量, ' E ⁡ ( X ) = μ ,    Cov ⁡ ( X ) = Σ = ( σ i j ) ' `\operatorname{E}(\mathbf{X})=\boldsymbol{\mu},\;\operatorname{Cov}(\mathbf{X})=\Sigma=(\sigma_{ij})` 'E(X)=μ,Cov(X)=Σ=(σij)'。正交因子分析的数学模型为:
X = μ + A F + ε { E ⁡ ( F ) = 0 ,    Cov ⁡ ( F ) = I n E ⁡ ( ε ) = 0 ,    Cov ⁡ ( ε ) = D = diag ⁡ { σ 1 2 , ... , σ m 2 } Cov ⁡ ( F , ε ) = 0 \begin{gathered} \mathbf{X}=\boldsymbol{\mu}+AF+\varepsilon \\ \begin{cases} \operatorname{E}(F)=\mathbf{0},\;\operatorname{Cov}(F)=I_n \\ \operatorname{E}(\varepsilon)=\mathbf{0},\;\operatorname{Cov}(\varepsilon)=D=\operatorname{diag}\{\sigma_1^2,\dots,\sigma_m^2\} \\ \operatorname{Cov}(F,\varepsilon)=\mathbf{0} \end{cases} \end{gathered} X=μ+AF+ε⎩ ⎨ ⎧E(F)=0,Cov(F)=InE(ε)=0,Cov(ε)=D=diag{σ12,...,σm2}Cov(F,ε)=0

其中 ' F = ( f 1 , ... , f n ) T ' `F=(f_1,\dots,f_n)^T` 'F=(f1,...,fn)T'是不可观测的 ' n ' `n` 'n'维随机变量, ' ε ' `\varepsilon` 'ε'是不可观测的 ' m ' `m` 'm'维随机变量,分别称 ' F ' `F` 'F'和 ' ε ' `\varepsilon` 'ε'为CommonFactor和SpecificFactor。 ' A = ( a i j ) ' `A=(a_{ij})` 'A=(aij)'是一个非随机矩阵, ' a i j ' `a_{ij}` 'aij'表示公共因子 ' f j ' `f_j` 'fj'、随机变量 ' X i ' `\mathbf{X}i` 'Xi'的因子载荷。 ' a 1 j , a 2 j , ... , a i j ' `a{1j},a_{2j},\dots,a_{ij}` 'a1j,a2j,...,aij'中至少有两个不为 ' 0 ' `0` '0',否则可将 ' f i ' `f_i` 'fi'并入到 ' ε i ' `\varepsilon_i` 'εi'中去; ' ε i ' `\varepsilon_i` 'εi'也仅出现在 ' X i ' `\mathbf{X}_i` 'Xi'的表达式中。

上述因子分析模型具有如下性质:

  1. ' Σ = A A T + D ' `\Sigma=AA^T+D` 'Σ=AAT+D';

  2. 若 ' X ∗ = C X ' `\mathbf{X}^*=C\mathbf{X}` 'X∗=CX',则有:
    Y = C μ + C A F + C ε = μ ∗ + A ∗ F + ε ∗ \mathbf{Y}=C\boldsymbol{\mu}+CAF+C\varepsilon=\boldsymbol{\mu}^*+A^*F+\varepsilon^* Y=Cμ+CAF+Cε=μ∗+A∗F+ε∗

  3. 因子载荷不唯一;

  4. ' Cov ⁡ ( X , F ) = A ' `\operatorname{Cov}(\mathbf{X},F)=A` 'Cov(X,F)=A',即 ' Cov ⁡ ( X i , F j ) = a i j ' `\operatorname{Cov}(\mathbf{X}i,F_j)=a{ij}` 'Cov(Xi,Fj)=aij'

  5. 令 ' h i 2 = ∑ j = 1 n a i j 2 ' `h_i^2=\sum\limits_{j=1}^{n}a_{ij}^2` 'hi2=j=1∑naij2',则有:
    Var ⁡ ( X i ) = σ i i = ∑ j = 1 n a i j 2 + σ i 2 = h i 2 + σ i 2 ,    i = 1 , 2 , ... , m \operatorname{Var}(\mathbf{X}i)=\sigma{ii}=\sum_{j=1}^{n}a_{ij}^2+\sigma_i^2=h_i^2+\sigma_i^2,\;i=1,2,\dots,m Var(Xi)=σii=j=1∑naij2+σi2=hi2+σi2,i=1,2,...,m

  6. 令 ' g j 2 = ∑ i = 1 m a i j 2 ' `g_j^2=\sum\limits_{i=1}^{m}a_{ij}^2` 'gj2=i=1∑maij2',则有:
    ∑ i = 1 m Var ⁡ ( X i ) = ∑ j = 1 n g j 2 + ∑ i = 1 n σ i 2 \sum_{i=1}^{m}\operatorname{Var}(\mathbf{X}i)=\sum{j=1}^{n}g_j^2+\sum_{i=1}^{n}\sigma_i^2 i=1∑mVar(Xi)=j=1∑ngj2+i=1∑nσi2

Proof. (1)由[prop:CovMat](3)(4)(5)可得:
Σ = Cov ⁡ ( X ) = Cov ⁡ ( μ + A F + ε , μ + A F + ε ) = Cov ⁡ ( μ , μ + A F + ε ) + Cov ⁡ ( A F , μ + A F + ε ) + Cov ⁡ ( ε , μ + A F + ε ) = Cov ⁡ ( A F , μ ) + Cov ⁡ ( A F ) + Cov ⁡ ( A F , ε ) + Cov ⁡ ( ε , μ ) + Cov ⁡ ( ε , A F ) + Cov ⁡ ( ε ) = A Cov ⁡ ( F ) A T + A Cov ⁡ ( F , ε ) + Cov ⁡ ( ε , F ) A T + D = A A T + D \begin{aligned} \Sigma&=\operatorname{Cov}(\mathbf{X})=\operatorname{Cov}(\boldsymbol{\mu}+AF+\varepsilon,\boldsymbol{\mu}+AF+\varepsilon) \\ &=\operatorname{Cov}(\boldsymbol{\mu},\boldsymbol{\mu}+AF+\varepsilon)+\operatorname{Cov}(AF,\boldsymbol{\mu}+AF+\varepsilon)+\operatorname{Cov}(\varepsilon,\boldsymbol{\mu}+AF+\varepsilon) \\ &=\operatorname{Cov}(AF,\boldsymbol{\mu})+\operatorname{Cov}(AF)+\operatorname{Cov}(AF,\varepsilon)+\operatorname{Cov}(\mathbf{\varepsilon},\boldsymbol{\mu})+\operatorname{Cov}(\varepsilon,AF)+\operatorname{Cov}(\varepsilon) \\ &=A\operatorname{Cov}(F)A^T+A\operatorname{Cov}(F,\varepsilon)+\operatorname{Cov}(\varepsilon,F)A^T+D \\ &=AA^T+D \end{aligned} Σ=Cov(X)=Cov(μ+AF+ε,μ+AF+ε)=Cov(μ,μ+AF+ε)+Cov(AF,μ+AF+ε)+Cov(ε,μ+AF+ε)=Cov(AF,μ)+Cov(AF)+Cov(AF,ε)+Cov(ε,μ)+Cov(ε,AF)+Cov(ε)=ACov(F)AT+ACov(F,ε)+Cov(ε,F)AT+D=AAT+D

(2)显然。

(3)取正交矩阵 ' Q ' `Q` 'Q',令 ' A ∗ = A Q ' `A^*=AQ` 'A∗=AQ', ' F ∗ = Q T F ' `F^*=Q^TF` 'F∗=QTF',则依然有:
E ⁡ ( F ∗ ) = Q T E ⁡ ( F ) = 0 ,    Cov ⁡ ( F ∗ ) = Q T Cov ⁡ ( F ) Q = I n ,    X = μ + A ∗ F ∗ + ε \operatorname{E}(F^*)=Q^T\operatorname{E}(F)=\mathbf{0},\;\operatorname{Cov}(F^*)=Q^T\operatorname{Cov}(F)Q=I_n,\;\mathbf{X}=\boldsymbol{\mu}+A^*F^*+\varepsilon E(F∗)=QTE(F)=0,Cov(F∗)=QTCov(F)Q=In,X=μ+A∗F∗+ε

(4)由[prop:CovMat](3)(4)(5)可得:
Cov ⁡ ( X , F ) = Cov ⁡ ( μ + A F + ε , F ) = Cov ⁡ ( μ , F ) + Cov ⁡ ( A F , F ) + Cov ⁡ ( ε , F ) = A \operatorname{Cov}(\mathbf{X},F)=\operatorname{Cov}(\boldsymbol{\mu}+AF+\varepsilon,F)=\operatorname{Cov}(\boldsymbol{\mu},F)+\operatorname{Cov}(AF,F)+\operatorname{Cov}(\varepsilon,F)=A Cov(X,F)=Cov(μ+AF+ε,F)=Cov(μ,F)+Cov(AF,F)+Cov(ε,F)=A

(5)由(1)即可得到结论。

(6)由(1)可得:
∑ i = 1 m Var ⁡ ( X i ) = tr ⁡ [ Cov ⁡ ( X ) ] = tr ⁡ ( A A T + D ) = ∑ i = 1 m ∑ j = 1 n a i j 2 + ∑ i = 1 n σ i 2 = ∑ j = 1 n ∑ i = 1 m a i j 2 + ∑ i = 1 n σ i 2 = ∑ j = 1 n g j 2 + ∑ i = 1 n σ i 2 \begin{aligned} \sum_{i=1}^{m}\operatorname{Var}(\mathbf{X}i)&=\operatorname{tr}[\operatorname{Cov}(\mathbf{X})]=\operatorname{tr}(AA^T+D)=\sum{i=1}^{m}\sum_{j=1}^{n}a_{ij}^2+\sum_{i=1}^{n}\sigma_i^2 \\ &=\sum_{j=1}^{n}\sum_{i=1}^{m}a_{ij}^2+\sum_{i=1}^{n}\sigma_i^2=\sum_{j=1}^{n}g_j^2+\sum_{i=1}^{n}\sigma_i^2 \end{aligned} i=1∑mVar(Xi)=tr[Cov(X)]=tr(AAT+D)=i=1∑mj=1∑naij2+i=1∑nσi2=j=1∑ni=1∑maij2+i=1∑nσi2=j=1∑ngj2+i=1∑nσi2

称 ' h i 2 ' `h_i^2` 'hi2'为变量 ' X i ' `\mathbf{X}_i` 'Xi'的CommonVariance,它反映了公共因子对 ' X i ' `\mathbf{X}_i` 'Xi'的方差贡献度。称 ' σ i 2 ' `\sigma_i^2` 'σi2'为 ' X i ' `\mathbf{X}_i` 'Xi'的SpecificVariance,它反映了特殊因子 ' ε i ' `\varepsilon_i` 'εi'对 ' X i ' `\mathbf{X}_i` 'Xi'的方差贡献度。 ' g j 2 ' `g_j^2` 'gj2'可视为公共因子 ' f j ' `f_j` 'fj'对 ' X 1 , ... , X m ' `\mathbf{X}_1,\dots,\mathbf{X}_m` 'X1,...,Xm'的总方差贡献度。

参数估计方法

主成分法

设观测变量 ' X ' `\mathbf{X}` 'X'的协方差矩阵 ' Σ ' `\Sigma` 'Σ',它的特征值从大到小依次为 ' λ 1 , ... , λ m ' `\lambda_1,\dots,\lambda_m` 'λ1,...,λm',对应的单位正交特征向量分别为 ' l 1 , ... , l m ' `l_1,\dots,l_m` 'l1,...,lm'。于是 ' Σ ' `\Sigma` 'Σ'有分解式:
Σ = ( l 1 l 2 ⋯ l m ) ( λ 1 0 ⋯ 0 0 λ 2 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ λ m ) ( l 1 T l 2 T ⋮ l m T ) = ∑ i = 1 m λ i l i l i T \Sigma= \begin{pmatrix} l_1 & l_2 & \cdots &l_m \end{pmatrix} \begin{pmatrix} \lambda_1 & 0 & \cdots & 0 \\ 0 & \lambda_2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \lambda_m \end{pmatrix} \begin{pmatrix} l_1^T \\ l_2^T \\ \vdots \\ l_m^T \end{pmatrix} =\sum_{i=1}^{m}\lambda_il_il_i^T Σ=(l1l2⋯lm) λ10⋮00λ2⋮0⋯⋯⋱⋯00⋮λm l1Tl2T⋮lmT =i=1∑mλililiT

[prop:CovMat](2)和[theo:PositiveSemidefinite](3)的第五条可知 ' λ m ⩾ 0 ' `\lambda_m\geqslant0` 'λm⩾0'。当最后 ' m − n ' `m-n` 'm−n'个特征值较小时, ' Σ ' `\Sigma` 'Σ'有如下近似:
Σ = ∑ i = 1 m λ i l i l i T ≈ ∑ i = 1 n λ i l i l i T + D ^ = A ^ A ^ T + D ^ \Sigma=\sum_{i=1}^{m}\lambda_il_il_i^T\approx\sum_{i=1}^{n}\lambda_il_il_i^T+\hat{D}=\hat{A}\hat{A}^T+\hat{D} Σ=i=1∑mλililiT≈i=1∑nλililiT+D^=A^A^T+D^

其中:
A ^ = ( λ 1 l 1 ⋯ λ n l n ) ,    D ^ = diag ⁡ ( Σ − A ^ A ^ T ) \hat{A}= \begin{pmatrix} \sqrt{\lambda_1}l_1 & \cdots & \sqrt{\lambda_n}l_n \end{pmatrix},\; \hat{D}=\operatorname{diag}(\Sigma-\hat{A}\hat{A}^T) A^=(λ1 l1⋯λn ln),D^=diag(Σ−A^A^T)

与PCA一样,一般通过使 ' ( ∑ i = 1 n λ i ) / ( ∑ i = 1 m λ i ) ' `\left(\sum\limits_{i=1}^{n}\lambda_i\right)/\left(\sum\limits_{i=1}^{m}\lambda_i\right)` '(i=1∑nλi)/(i=1∑mλi)'大于一定比例来选择 ' n ' `n` 'n'的具体值。

主因子法

令 ' A A T = Σ − D ' `AA^T=\Sigma-D` 'AAT=Σ−D'。取 ' σ ^ 1 2 , ... , σ ^ m 2 ' `\hat{\sigma}1^2,\dots,\hat{\sigma}m^2` 'σ^12,...,σ^m2'为特殊方差的合理初始估计((1)全零,(2)取 ' max ⁡ j ≠ i σ i j ' `\max\limits{j\ne i}\sigma{ij}` 'j=imaxσij'),则有:
A A T ^ = ( σ 11 − σ ^ 1 2 σ 12 ⋯ σ 1 m σ 21 σ 22 − σ ^ 2 2 ⋯ σ 2 m ⋮ ⋮ ⋱ ⋮ σ m 1 σ m 2 ⋯ σ m m − σ ^ m 2 ) \widehat{AA^T}= \begin{pmatrix} \sigma_{11}-\hat{\sigma}1^2 & \sigma{12} & \cdots & \sigma_{1m} \\ \sigma_{21} & \sigma_{22}-\hat{\sigma}2^2 & \cdots & \sigma{2m} \\ \vdots & \vdots & \ddots & \vdots \\ \sigma_{m1} & \sigma_{m2} & \cdots & \sigma_{mm}-\hat{\sigma}_m^2 \end{pmatrix} AAT = σ11−σ^12σ21⋮σm1σ12σ22−σ^22⋮σm2⋯⋯⋱⋯σ1mσ2m⋮σmm−σ^m2

取 ' A A T ^ ' `\widehat{AA^T}` 'AAT '前 ' n ' `n` 'n'个大于 ' 0 ' `0` '0'的特征值,从大到小依次为 ' λ ^ 1 , ... , λ ^ n ' `\hat{\lambda}_1,\dots,\hat{\lambda}_n` 'λ^1,...,λ^n',对应的单位正交特征向量为 ' l ^ 1 , ... , l ^ n ' `\hat{l}_1,\dots,\hat{l}_n` 'l^1,...,l^n',则有近似的:
A ^ = ( λ ^ 1 l ^ 1 ⋯ λ ^ n l ^ n ) \hat{A}= \begin{pmatrix} \sqrt{\hat{\lambda}_1}\hat{l}_1 & \cdots & \sqrt{\hat{\lambda}_n}\hat{l}_n \end{pmatrix} A^=(λ^1 l^1⋯λ^n l^n)

令 ' σ ^ i 2 = σ i i − h ^ i 2 ' `\hat{\sigma}i^2=\sigma{ii}-\hat{h}_i^2` 'σ^i2=σii−h^i2',继续上面的迭代过程以得到稳定的近似解。

Input: 协方差矩阵 ' Σ ' `\Sigma` 'Σ',初始特殊方差估计
' σ ^ 1 2 , ... , σ ^ m 2 ' `\hat{\sigma}^2_1, \ldots, \hat{\sigma}^2_m` 'σ^12,...,σ^m2',目标因子数 ' n ' `n` 'n'
Output: 因子载荷矩阵估计 ' A ^ ' `\hat{A}` 'A^',特殊方差估计
' σ ^ i 2 ' `\hat{\sigma}_i^2` 'σ^i2'

初始化 ' σ ^ i 2 ' `\hat{\sigma}_i^2` 'σ^i2' 为合理值 构造矩阵
' A A T ^ = Σ − diag ⁡ ( σ ^ 1 2 , ... , σ ^ m 2 ) ' `\widehat{AA^T} = \Sigma - \operatorname{diag}(\hat{\sigma}_1^2, \ldots, \hat{\sigma}_m^2)` 'AAT =Σ−diag(σ^12,...,σ^m2)'

对 ' A A T ^ ' `\widehat{AA^T}` 'AAT ' 做特征值分解,得到部分特征值
' λ ^ 1 ⩾ ⋯ ⩾ λ ^ n ' `\hat{\lambda}_1 \geqslant \cdots \geqslant \hat{\lambda}_n` 'λ^1⩾⋯⩾λ^n',及对应单位正交特征向量
' l ^ 1 , ... , l ^ n ' `\hat{l}_1, \ldots, \hat{l}n` 'l^1,...,l^n' 构造因子载荷矩阵估计:
' A ^ = ( a ^ i j ) = ( λ ^ 1 l ^ 1 ⋯ λ ^ n l ^ n ) ' `\hat{A}=(\hat{a}
{ij}) = \begin{pmatrix} \sqrt{\hat{\lambda}_1} \hat{l}_1 & \cdots & \sqrt{\hat{\lambda}_n} \hat{l}n \end{pmatrix}` 'A^=(a^ij)=(λ^1 l^1⋯λ^n l^n)' 令
' h ^ i 2 = ∑ j = 1 n a ^ i j 2 ' `\hat{h}i^2 = \sum\limits{j=1}^n \hat{a}
{ij}^2` 'h^i2=j=1∑na^ij2',更新
' σ ^ i 2 = σ i i − h ^ i 2 ,    i = 1 , 2 , ... , m ' `\hat{\sigma}i^2 = \sigma{ii} - \hat{h}_i^2,\;i=1,2,\dots,m` 'σ^i2=σii−h^i2,i=1,2,...,m'

极大似然法

推导太过困难,可以参考

Jöreskog, K. G. (1963). Statistical Estimation in Factor Analysis. Almqvist and Wicksell.

Lawley, D. N. and Maxwell, A. E. (1971). Factor Analysis as a Statistical Method. Second edition. Butterworths.

因子旋转

为了提高因子的可解释性,我们希望每个因子对观测变量的影响是集中且明显的,即一个因子主要对少数几个变量有显著影响,对其余变量几乎没有作用。这种结构反映在因子载荷矩阵 ' A ' `A` 'A'上即为 ' A ' `A` 'A'每一列的元素 ' a i j ,    i = 1 , 2 , ... , m ' `a_{ij},\;i=1,2,\dots,m` 'aij,i=1,2,...,m'不是均匀地分布在中间水平,而是趋于两极分化:其绝对值要么接近于 ' 0 ' `0` '0',要么较大。这样可以使得每个因子更容易被识别和解释------因为它只与一小组变量高度相关。这种结构等价于希望载荷矩阵 ' A ' `A` 'A'的每一列具有稀疏性,从而便于赋予因子明确的语义标签。

[prop:FactorAnalysis](3)可知在初步求得因子载荷矩阵 ' A ' `A` 'A'后,可以使用一个正交矩阵右乘 ' A ' `A` 'A',此时仍能得到一个因子模型。使用正交矩阵来右乘 ' A ' `A` 'A'相当于是对因子 ' F ' `F` 'F'进行旋转变换,我们可以通过不断旋转 ' F ' `F` 'F'来得到更加稀疏的因子载荷矩阵,从而提高因子的可解释性。

如何旋转?怎么衡量旋转后因子载荷矩阵的优良性?

令:
d i j 2 = a i j 2 h i 2 , i = 1 , 2 , ... , m ,    j = 1 , 2 , ... , n d_{ij}^2=\frac{a_{ij}^2}{h_i^2},\quad i=1,2,\dots,m,\;j=1,2,\dots,n dij2=hi2aij2,i=1,2,...,m,j=1,2,...,n
' d i j 2 ' `d_{ij}^2` 'dij2'衡量了因子 ' j ' `j` 'j'对观测变量 ' X i ' `\mathbf{X}i` 'Xi'的影响,且消除了 ' a i j ' `a{ij}` 'aij'的正负号带来的差异和各观测变量在因子载荷大小上的不同带来的差异。定义第 ' j ' `j` 'j'列 ' p ' `p` 'p'个数据 ' d i j 2 ,    i = 1 , 2 , ... , m ' `d_{ij}^2,\;i=1,2,\dots,m` 'dij2,i=1,2,...,m'的方差为:
V j = 1 m ∑ i = 1 m ( d i j 2 − d ˉ j ) 2 = 1 m ∑ i = 1 m ( d i j 2 − 1 p ∑ i = 1 m d i j 2 ) = 1 m [ ∑ i = 1 m d i j 4 − m 1 m 2 ( ∑ i = 1 m d i j 2 ) 2 ] = 1 m 2 [ m ∑ i = 1 m d i j 4 − 1 m ( ∑ i = 1 m d i j 2 ) 2 ] = 1 m 2 [ m ∑ i = 1 m a i j 4 h i 4 − 1 m ( ∑ i = 1 m a i j 2 h i 2 ) 2 ] \begin{aligned} V_j&=\frac{1}{m}\sum_{i=1}^{m}(d_{ij}^2-\bar{d}j)^2=\frac{1}{m}\sum{i=1}^{m}\left(d_{ij}^2-\frac{1}{p}\sum_{i=1}^{m}d_{ij}^2\right) \\ &=\frac{1}{m}\left[\sum_{i=1}^{m}d_{ij}^4-m\frac{1}{m^2}\left(\sum_{i=1}^{m}d_{ij}^2\right)^2\right] \\ &=\frac{1}{m^2}\left[m\sum_{i=1}^{m}d_{ij}^4-\frac{1}{m}\left(\sum_{i=1}^{m}d_{ij}^2\right)^2\right] \\ &=\frac{1}{m^2}\left[m\sum_{i=1}^{m}\frac{a_{ij}^4}{h_i^4}-\frac{1}{m}\left(\sum_{i=1}^{m}\frac{a_{ij}^2}{h_i^2}\right)^2\right] \end{aligned} Vj=m1i=1∑m(dij2−dˉj)2=m1i=1∑m(dij2−p1i=1∑mdij2)=m1 i=1∑mdij4−mm21(i=1∑mdij2)2 =m21 mi=1∑mdij4−m1(i=1∑mdij2)2 =m21 mi=1∑mhi4aij4−m1(i=1∑mhi2aij2)2

若 ' V j ' `V_j` 'Vj'越大,则第 ' j ' `j` 'j'个因子对观测变量的影响越集中。定义因子载荷矩阵 ' A ' `A` 'A'的方差为:
V = ∑ j = 1 n V j = 1 m 2 { ∑ j = 1 n [ m ∑ i = 1 m a i j 4 h i 4 − 1 m ( ∑ i = 1 m a i j 2 h i 2 ) 2 ] } V=\sum_{j=1}^{n}V_j=\frac{1}{m^2}\left\{\sum_{j=1}^{n}\left[m\sum_{i=1}^{m}\frac{a_{ij}^4}{h_i^4}-\frac{1}{m}\left(\sum_{i=1}^{m}\frac{a_{ij}^2}{h_i^2}\right)^2\right]\right\} V=j=1∑nVj=m21⎩ ⎨ ⎧j=1∑n mi=1∑mhi4aij4−m1(i=1∑mhi2aij2)2 ⎭ ⎬ ⎫

若 ' V ' `V` 'V'越大,则表明因子对观测变量的影响越集中。

综上,我们只需使得旋转后得到的因子载荷矩阵 ' A ' `A` 'A'的方差 ' V ' `V` 'V'达到最大即可。

模型检验

由上面的讨论可以看出,潜在因子的数目是一个超参数,也是一个非常重要的参数,我们该如何选择呢?有没有什么办法能够确定这一超参数的值?

在正态性假设下(仍需假设 X \mathbf{X} X是 n n n维正态随机向量),我们可以对求解后的因子分析模型进行似然比检验。

设样本数为 p p p,分别为 X 1 , X 2 , ... , X p \mathbf{X_1},\mathbf{X_2},\dots,\mathbf{X_p} X1,X2,...,Xp,都独立同分布于 N ⁡ m ( μ , Σ ) \operatorname{N}_m(\boldsymbol{\mu},\Sigma) Nm(μ,Σ)。构建似然比检验假设:
H 0 : Σ = A A T + D , H 1 : Σ 为其它任一正定矩阵 \begin{equation*} H_0:\Sigma=AA^T+D,\quad H_1:\Sigma\text{为其它任一正定矩阵} \end{equation*} H0:Σ=AAT+D,H1:Σ为其它任一正定矩阵

由\cref{def:MultiNormalPDF2}可得此时备择假设下的对数似然函数为:
L 1 = ∑ i = 1 p ln ⁡ { 1 ( 2 π ) m 2 ( det ⁡ Σ ) 1 2 e − 1 2 tr ⁡ [ ( X i − μ ) ( X i − μ ) T Σ − 1 ] } = ∑ i = 1 p { − m 2 ln ⁡ ( 2 π ) − 1 2 ln ⁡ ( det ⁡ Σ ) − 1 2 tr ⁡ [ ( X i − μ ) ( X i − μ ) T Σ − 1 ] } = − p 2 { m ln ⁡ ( 2 π ) + ln ⁡ ( det ⁡ Σ ) + 1 p ∑ i = 1 p tr ⁡ [ ( X i − μ ) ( X i − μ ) T Σ − 1 ] } \begin{align*} L_1&=\sum_{i=1}^{p}\ln\left\{\frac{1}{(2\pi)^{\frac{m}{2}}(\det\Sigma)^{\frac{1}{2}}}e^{-\frac{1}{2}\operatorname{tr}[(\mathbf{X_i}-\boldsymbol{\mu})(\mathbf{X_i}-\boldsymbol{\mu})^T\Sigma^{-1}]}\right\} \\ &=\sum_{i=1}^{p}\left\{-\frac{m}{2}\ln(2\pi)-\frac{1}{2}\ln(\det\Sigma)-\frac{1}{2}\operatorname{tr}[(\mathbf{X_i}-\boldsymbol{\mu})(\mathbf{X_i}-\boldsymbol{\mu})^T\Sigma^{-1}]\right\} \\ &=-\frac{p}{2}\left\{m\ln(2\pi)+\ln(\det\Sigma)+\frac{1}{p}\sum_{i=1}^{p}\operatorname{tr}[(\mathbf{X_i}-\boldsymbol{\mu})(\mathbf{X_i}-\boldsymbol{\mu})^T\Sigma^{-1}]\right\} \end{align*} L1=i=1∑pln{(2π)2m(detΣ)211e−21tr[(Xi−μ)(Xi−μ)TΣ−1]}=i=1∑p{−2mln(2π)−21ln(detΣ)−21tr[(Xi−μ)(Xi−μ)TΣ−1]}=−2p{mln(2π)+ln(detΣ)+p1i=1∑ptr[(Xi−μ)(Xi−μ)TΣ−1]}

上式可以化为(样本因子分析时需要注意使用协方差矩阵的无偏估计,系数应取 p − 1 p-1 p−1):
L 1 ( Σ ) = − p 2 [ m ln ⁡ ( 2 π ) + ln ⁡ ( det ⁡ Σ ) + tr ⁡ ( S Σ − 1 ) ] \begin{equation*} L_1(\Sigma)=-\frac{p}{2}\left[m\ln(2\pi)+\ln(\det\Sigma)+\operatorname{tr}(S\Sigma^{-1})\right] \end{equation*} L1(Σ)=−2p[mln(2π)+ln(detΣ)+tr(SΣ−1)]

其中 S S S为样本协方差阵。这个似然函数在 Σ = S \Sigma=S Σ=S时取最大值,于是:
L 1 = − p 2 [ m ln ⁡ ( 2 π ) + ln ⁡ ( det ⁡ S ) + p ] \begin{equation*} L_1=-\frac{p}{2}[m\ln(2\pi)+\ln(\det S)+p] \end{equation*} L1=−2p[mln(2π)+ln(detS)+p]

同理,此时原假设下的似然函数值为:
L 2 = − p 2 [ m ln ⁡ ( 2 π ) + ln ⁡ ( det ⁡ Σ ^ ) + tr ⁡ ( S Σ ^ ) ] \begin{equation*} L_2=-\frac{p}{2}\left[m\ln(2\pi)+\ln(\det\hat{\Sigma})+\operatorname{tr}(S\hat{\Sigma})\right] \end{equation*} L2=−2p[mln(2π)+ln(detΣ^)+tr(SΣ^)]

其中 Σ ^ = A ^ A ^ T − D ^ \hat{\Sigma}=\hat{A}\hat{A}^T-\hat{D} Σ^=A^A^T−D^。

由似然比检验原理可知:
− 2 [ L 2 ( Σ ) − L 1 ( Σ ) ] = ∼ χ d f 2 \begin{equation*} -2[L_2(\Sigma)-L_1(\Sigma)]=\sim\chi^2_{df} \end{equation*} −2[L2(Σ)−L1(Σ)]=∼χdf2


p [ ln ⁡ ( det ⁡ Σ ^ ) + tr ⁡ ( S Σ ^ ) − ln ⁡ ( det ⁡ S ) − p ] > χ 0.95 2 ( d f ) \begin{equation*} p[\ln(\det\hat{\Sigma})+\operatorname{tr}(S\hat{\Sigma})-\ln(\det S)-p]>\chi^2_{0.95}(df) \end{equation*} p[ln(detΣ^)+tr(SΣ^)−ln(detS)−p]>χ0.952(df)

时应拒绝原假设,即 n n n个因子不足以解释数据,应增大因子个数。其中 χ 0.95 2 ( d f ) \chi^2_{0.95}(df) χ0.952(df)为分布的 0.95 0.95 0.95分位数。

不介绍自由度的计算,有点复杂,R语言factanal函数中使用的自由度计算公式为 dof <- 0.5 * ((p - factors)^2 - p - factors),其中p为变量数,factors为潜在因子数。

因子得分

在拟合得到因子载荷矩阵后,我们可以反过来求解各样本因子的取值,这样一来就可以根据因子值去进行进一步的分析。例如在开头的例子里,我们可以得到每个学生语言能力与理科能力的值,进而可以进行分类或选择。

因子得分主要有两种计算方式。

加权最小二乘法

考虑加权最小二乘函数:
φ ( F ) = ( X − μ − A F ) T D − 1 ( X − μ − A F ) \begin{equation*} \varphi(F)=(\mathbf{X}-\boldsymbol{\mu}-AF)^TD^{-1}(\mathbf{X}-\boldsymbol{\mu}-AF) \end{equation*} φ(F)=(X−μ−AF)TD−1(X−μ−AF)

求:
F ^ = arg ⁡ min ⁡ φ ( F ) \begin{equation*} \hat{F}=\arg\min\varphi(F) \end{equation*} F^=argminφ(F)

由极值的必要条件得到:
∂ φ ( F ) ∂ F = − 2 A T D − 1 ( X − μ − A F ) = 0 A T D − 1 ( X − μ ) = A T D − 1 A F F = ( A T D − 1 A ) − 1 A T D − 1 ( X − μ ) \begin{gather*} \frac{\partial\varphi(F)}{\partial F}=-2A^TD^{-1}(\mathbf{X}-\boldsymbol{\mu}-AF)=0 \\ A^TD^{-1}(\mathbf{X}-\boldsymbol{\mu})=A^TD^{-1}AF \\ F=(A^TD^{-1}A)^{-1}A^TD^{-1}(\mathbf{X}-\boldsymbol{\mu}) \end{gather*} ∂F∂φ(F)=−2ATD−1(X−μ−AF)=0ATD−1(X−μ)=ATD−1AFF=(ATD−1A)−1ATD−1(X−μ)

需要注意 A T D − 1 A A^TD^{-1}A ATD−1A的可逆性。\par

若认为 X ∼ N ⁡ m ( μ + A F , D ) \mathbf{X}\sim\operatorname{N}_m(\boldsymbol{\mu}+AF,D) X∼Nm(μ+AF,D),则上述解得的 F F F也是极大似然估计的结果。

称加权最小二乘法得到的因子得分为Bartlett因子得分

从求解过程可以看出,该方法实际上是对特殊方差更大的变量施以更宽容的残差值。

回归法

设:
f j = ∑ i = 1 m b j i X i + ε j ,    Cov ⁡ ( X i , ε j ) = 0 , j = 1 , 2 , ... , n \begin{equation*} f_j=\sum_{i=1}^{m}b_{ji}\mathbf{X}_i+\varepsilon_j,\;\operatorname{Cov}(\mathbf{X}_i,\varepsilon_j)=0,\quad j=1,2,\dots,n \end{equation*} fj=i=1∑mbjiXi+εj,Cov(Xi,εj)=0,j=1,2,...,n

由\cref{prop:FactorAnalysis}(4)和\cref{prop:CovMat}(3)(5)可知:
a i j = Cov ⁡ ( X i , f j ) = Cov ⁡ ( X i , ∑ k = 1 m b j k X k + ε j ) = ∑ k = 1 m σ i k b j k \begin{equation*} a_{ij}=\operatorname{Cov}(\mathbf{X}i,f_j)=\operatorname{Cov}\left(\mathbf{X}i,\sum{k=1}^{m}b{jk}\mathbf{X}k+\varepsilon_j\right)=\sum{k=1}^{m}\sigma_{ik}b_{jk} \end{equation*} aij=Cov(Xi,fj)=Cov(Xi,k=1∑mbjkXk+εj)=k=1∑mσikbjk

令 B = ( b i j ) B=(b_{ij}) B=(bij),则有:
A = Σ B T \begin{equation*} A=\Sigma B^T \end{equation*} A=ΣBT

于是 B = A T Σ − 1 B=A^T\Sigma^{-1} B=ATΣ−1,需要注意 Σ \Sigma Σ的可逆性。回归法的因子得分即为:
F = A T Σ − 1 X \begin{equation*} F=A^T\Sigma^{-1}\mathbf{X} \end{equation*} F=ATΣ−1X

代码实现

R语言中使用Factanal函数进行因子分析,注意它使用极大似然估计法进行参数估计。

复制代码
factanal(x, factors, data = NULL, covmat = NULL, n.obs = NA,
         subset, na.action, start = NULL,
         scores = c("none", "regression", "Bartlett"),
         rotation = "varimax", control = NULL, ...)
  1. x :formula或矩阵或数据框。formula时要用data参数来指定数据来源,因为因子分析是对变量的考察,所以formula应形如~X_1+X_2+X_3~左侧为空,右端指定观测变量。若为矩阵或数据框,其行数应为样本数,列数应为观测变量数。若covmat被指定,则不应指定x
  2. factors:指定潜在因子个数,应为正整数。
  3. datax为formula时指定数据来源。
  4. covmat :指定观测变量协方差矩阵,被指定时不需要传递x, data
  5. n.obs :样本数,指定covmat时需要明确样本数。
  6. subset, na.action:选择样本子集及缺失值处理
  7. start:特殊方差迭代时的初始值,无需深究,除非你懂了极大似然估计法估计参数。
  8. scores :指定因子得分计算方式,"none"表示不计算因子得分。
  9. rotation :因子旋转,值只能为"varimax"none,前者表示使用varimax函数来进行正交旋转,后者表示不进行因子旋转。

注意事项

  1. factanal()函数只提供正交因子分析,斜交因子分析请另外找包。
  2. 若只提供covmat ,无法进行似然比检验,结果将会输出拟合残差平方和与自由度,但如果此时提供n.obs,则会输出似然比检验的结果。

例子

复制代码
x<-c(1.000,
     0.923, 1.000,
     0.841, 0.851, 1.000,
     0.756, 0.807, 0.870, 1.000,
     0.700, 0.775, 0.835, 0.918, 1.000,
     0.619, 0.695, 0.779, 0.864, 0.928, 1.000,
     0.633, 0.697, 0.787, 0.869, 0.935, 0.975, 1.000,
     0.520, 0.596, 0.705, 0.806, 0.866, 0.932, 0.943, 1.000)
names<-c("X1", "X2", "X3", "X4", "X5", "X6", "X7", "X8")
R<-matrix(0, nrow=8, ncol=8, dimnames=list(names, names))
for (i in 1:8){
  for (j in 1:i){
    R[i,j]<-x[(i-1)*i/2+j]; R[j,i]<-R[i,j]
  }
}
factanal(factors = 3, covmat = R, n.obs = 20)

Call:
factanal(factors = 3, covmat = R, n.obs = 20)

Uniquenesses:
   X1    X2    X3    X4    X5    X6    X7    X8 
0.005 0.106 0.144 0.080 0.057 0.038 0.010 0.090 

Loadings:
   Factor1 Factor2 Factor3
X1  0.284   0.956         
X2  0.395   0.851   0.119 
X3  0.543   0.723   0.196 
X4  0.682   0.595   0.318 
X5  0.797   0.501   0.240 
X6  0.900   0.382         
X7  0.914   0.391         
X8  0.913   0.273         

               Factor1 Factor2 Factor3
SS loadings      4.110   3.139   0.221
Proportion Var   0.514   0.392   0.028
Cumulative Var   0.514   0.906   0.934

Test of the hypothesis that 3 factors are sufficient.
The chi square statistic is 0.79 on 7 degrees of freedom.
The p-value is 0.998 
  1. Uniquenesses即为特殊方差的值
  2. loadings表示因子载荷,其中较小的因子载荷会显示空值
  3. SS loadings为 g j 2 g_j^2 gj2,Proportion Var为因子对所有观测变量总方差的贡献率,即 g j 2 / ∑ i = 1 m Var ⁡ ( X i ) g_j^2/\sum\limits_{i=1}^m\operatorname{Var}(\mathbf{X}_i) gj2/i=1∑mVar(Xi),Cumulative Var为累计方差贡献率。
  4. 最底下是似然比检验的结果,若p值小于0.05,则应增大潜在因子数。

Reference

1.薛毅,统计建模与R软件

相关推荐
大龄Python青年2 小时前
C语言 交换算法之加减法,及溢出防范
c语言·开发语言·算法
啊我不会诶2 小时前
CF每日5题
算法
朱剑君3 小时前
排序算法——基数排序
算法·排序算法
COOCC13 小时前
PyTorch 实战:从 0 开始搭建 Transformer
人工智能·pytorch·python·深度学习·算法·机器学习·transformer
拾忆-eleven4 小时前
C++算法(19):整数类型极值,从INT_MIN原理到跨平台开发实战
数据结构·c++·算法
JK0x075 小时前
代码随想录算法训练营 Day39 动态规划Ⅶ 打家劫舍
算法·动态规划
blammmp5 小时前
算法专题四:前缀和
java·开发语言·算法
望未来无悔6 小时前
系统学习算法:动态规划(斐波那契+路径问题)
java·算法
明月看潮生6 小时前
青少年编程与数学 02-018 C++数据结构与算法 25课题、图像处理算法
c++·图像处理·算法·青少年编程·编程与数学
我是一只鱼02236 小时前
LeetCode算法题 (反转链表)Day17!!!C/C++
数据结构·c++·算法·leetcode·链表