因子分析由斯皮尔曼在1904年首次提出,其在某种程度上可以被看成是主成分分析的推广和扩展。因子分析法通过研究变量间的相关系数矩阵,把这些变量间错综复杂的关系归结成少数几个综合因子,由于归结出的因子个数少于原始变量的个数,但是它们又包含原始变量的信息,所以,这一分析过程也称为降维
。由于因子往往比主成分更易得到解释,故因子分析比主成分分析更容易成功,从而有更广泛的应用。
基本思想: 根据相关性大小把变量分组,使得同组内的变量之间相关性较高,但不同组的变量不相关或相关性较低,每组变量代表一个基本结构一即公共因子。
两个核心问题: 一是如何构造因子变量,二是如何对因子变量进行命名解释。
因子分析类型: R型因子分析与Q型因子分析,就像聚类分析分为R型和Q型一样,R型的因子分析是对变量作因子分析,Q型因子分析是对样品作因子分析。
假设有 n n n 个样本, p p p 个指标, 则可构成大小为 n × p n \times p n×p 的样本矩阵 x = [ x 21 x 22 ⋯ x 2 p ⋮ ⋮ ⋱ ⋮ x n 1 x n 2 ⋯ x n p ] = ( x 1 , x 2 , ⋯ , x p ) x=\left[\begin{array}{cccc}x_{21} & x_{22} & \cdots & x_{2 p} \\ \vdots & \vdots & \ddots & \vdots \\ x_{n 1} & x_{n 2} & \cdots & x_{n p}\end{array}\right]=\left(x_{1}, x_{2}, \cdots, x_{p}\right) x=⎣ ⎡x21⋮xn1x22⋮xn2⋯⋱⋯x2p⋮xnp⎦ ⎤=(x1,x2,⋯,xp)
主成分分析: x 1 , x 2 , ⋯ , x p ⇒ z 1 , z 2 , ⋯ , z m ( m ≤ p ) x_{1}, x_{2}, \cdots, x_{p} \Rightarrow z_{1}, z_{2}, \cdots, z_{m}(m \leq p) x1,x2,⋯,xp⇒z1,z2,⋯,zm(m≤p), 且它们满足: { z 1 = l 11 x 1 + l 12 x 2 + ⋯ + l 1 p x p z 2 = l 21 x 1 + l 22 x 2 + ⋯ + l 2 p x p ⋮ z m = l m 1 x 1 + l m 2 x 2 + ⋯ + l m p x p \left\{\begin{array}{} z_{1}=l_{11} x_{1}+l_{12} x_{2}+\cdots+l_{1 p} x_{p} \\ z_{2}=l_{21} x_{1}+l_{22} x_{2}+\cdots+l_{2 p} x_{p} \\ \vdots \\ z_{m}=l_{m 1} x_{1}+l_{m 2} x_{2}+\cdots+l_{m p} x_{p} \end{array}\right. ⎩ ⎨ ⎧z1=l11x1+l12x2+⋯+l1pxpz2=l21x1+l22x2+⋯+l2pxp⋮zm=lm1x1+lm2x2+⋯+lmpxp
z 1 , z 2 , ⋯ , z m z_{1}, z_{2}, \cdots, z_{m} z1,z2,⋯,zm 是 m m m 个主成分, 可以看出, 主成分实际上就是各指标的线性组合。
因子分析: x 1 , x 2 , ⋯ , x p ⇒ f 1 , f 2 , ⋯ , f m ( m ≤ p ) x_{1}, x_{2}, \cdots, x_{p} \Rightarrow f_{1}, f_{2}, \cdots, f_{m}(m \leq p) x1,x2,⋯,xp⇒f1,f2,⋯,fm(m≤p), 且它们满足: { x 1 = u 1 + a 11 f 1 + a 12 f 2 + ⋯ + a 1 m f m + ε 1 x 2 = u 2 + a 21 f 1 + a 22 f 2 + ⋯ + a 2 m f m + ε 2 ⋮ x p = u p + a p 1 f 1 + a p 2 f 2 + ⋯ + a p m f m + ε p \left\{\begin{array}{c}x_{1}=u_{1}+a_{11} f_{1}+a_{12} f_{2}+\cdots+a_{1 m} f_{m}+\varepsilon_{1} \\ x_{2}=u_{2}+a_{21} f_{1}+a_{22} f_{2}+\cdots+a_{2 m} f_{m}+\varepsilon_{2} \\ \vdots \\ x_{p}=u_{p}+a_{p 1} f_{1}+a_{p 2} f_{2}+\cdots+a_{p m} f_{m}+\varepsilon_{p}\end{array}\right. ⎩ ⎨ ⎧x1=u1+a11f1+a12f2+⋯+a1mfm+ε1x2=u2+a21f1+a22f2+⋯+a2mfm+ε2⋮xp=up+ap1f1+ap2f2+⋯+apmfm+εp
f 1 , f 2 , ⋯ , f m f_{1}, f_{2}, \cdots, f_{m} f1,f2,⋯,fm 被称为公共因子, ε i \varepsilon_{i} εi 为特殊因子, 各因子的线性组合构成了原始的指标。
(有点像回归, 回归中自变量是已知的, 因子分析是只知道因变量, 要我们来找自变量)
其他主要区别:
联系:
因子解释成功的可能性要远大于主成分解释成功的可能性。
PCA与FA对比图解:
主成分(PC1和PC2)是自变量(1-5)的线性组合。形成线性组合的权重都是通过最大化各主成分所解释的方差来获得,同时还要保证个主成分间不相关。相反,因子(F1、F2)被当做是自变量的结构基础或“原因”,而不是它们的线性组合。代表自变量方差的误差(e1到e5)无法用因子来解释。图中的椭圆表示因子和误差无法直接观测,但是可通过变量间的相互关系推导得到。
假设大小为 n × p n \times p n×p 的随机向量 x = ( x 1 , x 2 , ⋯ , x p ) x=\left(x_{1}, x_{2}, \cdots, x_{p}\right) x=(x1,x2,⋯,xp) 的均值 u = ( u 1 , u 2 , ⋯ u p ) u=\left(u_{1}, u_{2}, \cdots u_{p}\right) u=(u1,u2,⋯up), 协方差矩阵 Σ p × p = ( σ i j ) \Sigma_{p \times p}=\left(\sigma_{i j}\right) Σp×p=(σij)
因子分析的一般模型为: { x 1 = u 1 + a 11 f 1 + a 12 f 2 + ⋯ + a 1 m f m + ε 1 x 2 = u 2 + a 21 f 1 + a 22 f 2 + ⋯ + a 2 m f m + ε 2 ⋮ x p = u p + a p 1 f 1 + a p 2 f 2 + ⋯ + a p m f m + ε p \left\{ \begin{array}{}x_{1}=u_{1}+a_{11} f_{1}+a_{12} f_{2}+\cdots+a_{1 m} f_{m}+\varepsilon_{1} \\ x_{2}=u_{2}+a_{21} f_{1}+a_{22} f_{2}+\cdots+a_{2 m} f_{m}+\varepsilon_{2} \\ \quad \vdots \\ x_{p}=u_{p}+a_{p 1} f_{1}+a_{p 2} f_{2}+\cdots+a_{p m} f_{m}+\varepsilon_{p} \end{array}\right. ⎩ ⎨ ⎧x1=u1+a11f1+a12f2+⋯+a1mfm+ε1x2=u2+a21f1+a22f2+⋯+a2mfm+ε2⋮xp=up+ap1f1+ap2f2+⋯+apmfm+εp
其中 f 1 , f 2 , ⋯ , f m f_{1}, f_{2}, \cdots, f_{m} f1,f2,⋯,fm 被称为公共因子, ε i ( i = 1 , 2 , ⋯ , p ) \varepsilon_{i}(i=1,2, \cdots, p) εi(i=1,2,⋯,p) 为特殊因子, 它们都是无法观测的随机变量。
公共因子 f 1 , f 2 , ⋯ , f m f_{1}, f_{2}, \cdots, f_{m} f1,f2,⋯,fm 出现在每一个原始变量 x i ( i = 1 , 2 , ⋯ , p ) x_{i}(i=1,2, \cdots, p) xi(i=1,2,⋯,p) 的表达式中, 可以理解为原始变量共同 拥有的某些特征 (具有共同的影响因素) ; 每个特殊因子 ε i ( i = 1 , 2 , ⋯ , p \varepsilon_{i}(i=1,2, \cdots, p εi(i=1,2,⋯,p )仅仅出现在与之相应的 第 i i i 个原始变量 x i x_{\mathrm{i}} xi 的表达式中, 它只对这个原始变量起作用。
上面这个式子我们用矩阵形式可记为:
x = u + A f + ε x=u+A f+\varepsilon x=u+Af+ε
其中 f = ( f 1 , f 2 , ⋯ , f m ) ⊤ ( m ≤ p ) f=\left(f_{1}, f_{2}, \cdots, f_{m}\right)^{\top}(m \leq p) f=(f1,f2,⋯,fm)⊤(m≤p) 为公因子向量, ε = ( ε 1 , ε 2 , ⋯ , ε p ) ⊤ \varepsilon=\left(\varepsilon_{1}, \varepsilon_{2}, \cdots, \varepsilon_{p}\right)^{\top} ε=(ε1,ε2,⋯,εp)⊤ 为特殊因子向量, A p × m = ( a i j ) A_{p \times m}=\left(a_{i j}\right) Ap×m=(aij) 称为 因子载荷矩阵, 并假设 A A A 的秩为 m m m.
要进行因子分析, 必须要解出 A A A 这个矩阵, 因此下面我们要给的一些假设用来计算 A A A 矩阵。
因子分析模型:
x = { x 1 = u 1 + a 11 f 1 + a 12 f 2 + ⋯ + a 1 m f m + ε 1 x 2 = u 2 + a 21 f 1 + a 22 f 2 + ⋯ + a 2 m f m + ε 2 ⋮ x p = u p + a p 1 f 1 + a p 2 f 2 + ⋯ + a p m f m + ε p = u + A f + ε 假设 , { E ( f ) = 0 E ( ε ) = 0 Var ( f ) = I Var ( ε ) = D = diag ( σ 1 2 , σ 2 2 , ⋯ , σ p 2 ) cov ( f , ε ) = E ( f ε ⊤ ) = 0 \begin{aligned} &x=\left\{\begin{array}{} x_{1}=u_{1}+a_{11} f_{1}+a_{12} f_{2}+\cdots+a_{1 m} f_{m}+\varepsilon_{1} \\ x_{2}=u_{2}+a_{21} f_{1}+a_{22} f_{2}+\cdots+a_{2 m} f_{m}+\varepsilon_{2} \\ \vdots \\ x_{p}=u_{p}+a_{p 1} f_{1}+a_{p 2} f_{2}+\cdots+a_{p m} f_{m}+\varepsilon_{p} \end{array}=u+Af+\varepsilon\right. \\ &\text {假设 ,}\left\{\begin{array}{l} E(f)=0 \\ E(\varepsilon)=0 \\ \operatorname{Var}(f)=I \\ \operatorname{Var}(\varepsilon)=D=\operatorname{diag}\left(\sigma_{1}^{2}, \sigma_{2}^{2}, \cdots, \sigma_{p}^{2}\right) \\ \operatorname{cov}(f, \varepsilon)=E\left(f \varepsilon^{\top}\right)=0 \end{array}\right. \end{aligned} x=⎩ ⎨ ⎧x1=u1+a11f1+a12f2+⋯+a1mfm+ε1x2=u2+a21f1+a22f2+⋯+a2mfm+ε2⋮xp=up+ap1f1+ap2f2+⋯+apmfm+εp=u+Af+ε假设 ,⎩ ⎨ ⎧E(f)=0E(ε)=0Var(f)=IVar(ε)=D=diag(σ12,σ22,⋯,σp2)cov(f,ε)=E(fε⊤)=0
其中 f = ( f 1 , f 2 , ⋯ , f m ) ⊤ ( m ≤ p ) f=\left(f_{1}, f_{2}, \cdots, f_{m}\right)^{\top}(m \leq p) f=(f1,f2,⋯,fm)⊤(m≤p) 为公因子向量
ε = ( ε 1 , ε 2 , ⋯ , ε p ) ⊤ \varepsilon=\left(\varepsilon_{1}, \varepsilon_{2}, \cdots, \varepsilon_{p}\right)^{\top} ε=(ε1,ε2,⋯,εp)⊤ 为特殊因子向量
A p × m = ( a i j ) A_{p \times m}=\left(a_{i j}\right) Ap×m=(aij) 称为因子载荷矩阵, 并假设 A A A 的秩为 m m m.
公因子彼此不相关, 且具有单位方差; 特殊因子彼此不相关且与公因子也不相关。
设 x 1 , x 2 , ⋯ , x n x_{1}, x_{2}, \cdots, x_{n} x1,x2,⋯,xn 是一组 p p p 维样本, 则 u u u 和 Σ \Sigma Σ 可分别估计为: x ˉ = 1 n ∑ i = 1 n x i \bar{x}=\frac{1}{n} \sum_{i=1}^{n} x_{i} xˉ=n1∑i=1nxi 和 S 2 = 1 n ∑ i = 1 n ( x i − x ˉ ) ( x i − x ˉ ) ⊤ S^{2}=\frac{1}{n} \sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)\left(x_{i}-\bar{x}\right)^{\top} S2=n1∑i=1n(xi−xˉ)(xi−xˉ)⊤ 为了建立因子模型, 我们需要估计出因子载荷矩阵 A p × m = ( a i j ) A_{p \times m}=\left(a_{i j}\right) Ap×m=(aij), 以及个性方差矩阵 D = diag ( σ 1 2 , σ 2 2 , ⋯ , σ p 2 ) D=\operatorname{diag}\left(\sigma_{1}^{2}, \sigma_{2}^{2}, \cdots, \sigma_{p}^{2}\right) D=diag(σ12,σ22,⋯,σp2).
参数估计方法:
主成分法: 假设变量是因子的线性组合, 第一主成分有最大的方差, 后续主成 分所解释的方差逐渐减小, 各主成分之间互不相关, 主成分法通常用来计算初 始公因子, 它也适用于相关矩阵为奇异时的情况。
设 λ 1 ≥ λ 2 ≥ ⋯ ≥ λ p \lambda_{1} \geq \lambda_{2} \geq \cdots \geq \lambda_{p} λ1≥λ2≥⋯≥λp 为样本相关系数矩阵 R 的特征值, η 1 , η 2 , ⋯ , η p \eta_{1}, \eta_{2}, \cdots, \eta_{p} η1,η2,⋯,ηp为相应的标准正交化特征向量。设m
A = ( λ 1 η 1 , λ 2 η 2 , ⋯ , λ m η m ) A=\left(\sqrt{\lambda_{1}} \eta_{1}, \sqrt{\lambda_{2}} \eta_{2}, \cdots, \sqrt{\lambda_{m}} \eta_{m}\right) A=(λ1η1,λ2η2,⋯,λmηm)
特殊因子的方差用 R − A A T R-A A^{T} R−AAT 的对角元来估计, 即
σ i 2 = 1 − ∑ j = 1 m a i j 2 \sigma_{i}^{2}=1-\sum_{j=1}^{m} a_{i j}^{2} σi2=1−j=1∑maij2
末加权最小平方法: 使得观测的相关矩阵和再生的相关矩阵之差的平方和最小, 忽略对角元素。
综合最小平方法: 使得观测的相关矩阵和再生的相关矩阵之差的平方和最小,
并以变量单值的倒数对相关系数加权。
最大似然法: 假设样本来自多元正态分布, 使用极大使然估计。
主因子法: 从初始相关矩阵提取公共因子, 并把多元相关系数的平方置于对 角线上, 再用初始因子载荷估计新的变量共同度, 如此重复直至变量共同度在 两次相邻迭代中的变化达到临界条件。
主因子方法是对主成分方法的修正, 假定我们首先对变量进行标准化变换。则
R = A A T + D R ∗ = A A T = R − D \begin{array}{l} R=A A^{T}+D \\ R^{*}=A A^{T}=R-D \end{array} R=AAT+DR∗=AAT=R−D
称 R ∗ R^{*} R∗ 为约相关系数矩阵, R ∗ R^{*} R∗对角线上的元素是 h i 2 h_{i}^{2} hi2 , 而不是 1 。
R ∗ = R − D = [ h ^ 1 2 r 12 ⋯ r 1 p r 21 h ^ 2 2 ⋯ r 2 p ⋮ ⋮ ⋮ r p 1 r p 2 ⋯ h ^ p 2 ] R^{*}=R-D=\left[\begin{array}{cccc} \hat{h}_{1}^{2} & r_{12} & \cdots & r_{1 p} \\ r_{21} & \hat{h}_{2}^{2} & \cdots & r_{2 p} \\ \vdots & \vdots & & \vdots \\ r_{p 1} & r_{p 2} & \cdots & \hat{h}_{p}^{2} \end{array}\right] R∗=R−D=⎣ ⎡h^12r21⋮rp1r12h^22⋮rp2⋯⋯⋯r1pr2p⋮h^p2⎦ ⎤
直接求 R ∗ R^{*} R∗的前 p p p个特征值和对应的正交特征向量。得到如下的矩阵
A = [ λ 1 ∗ u 1 ∗ λ 2 ∗ u 2 ∗ ⋯ λ p ∗ u p ∗ ] A=\left[\begin{array}{llll} \sqrt{\lambda_{1}^{*}} u_{1}^{*} & \sqrt{\lambda_{2}^{*}} u_{2}^{*} & \cdots & \sqrt{\lambda_{p}^{*}} u_{p}^{*} \end{array}\right] A=[λ1∗u1∗λ2∗u2∗⋯λp∗up∗]
其中 R ∗ R^{*} R∗ 的特征值: λ 1 ∗ ≥ λ 2 ∗ ≥ ⋯ ≥ λ p ∗ \lambda_{1}^{*} \geq \lambda_{2}^{*} \geq \cdots \geq \lambda_{p}^{*} λ1∗≥λ2∗≥⋯≥λp∗ , 对应的正交特征向量为 u 1 ∗ , u 2 ∗ , ⋯ , u p ∗ u_{1}^{*}, u_{2}^{*}, \cdots, u_{p}^{*} u1∗,u2∗,⋯,up∗ 。
在实际应用中, 特殊因子的方差一般都是末知的, 可以通过一组样本来估计。估计 的方法有如下几种:
Alpha 因子法: 把当前分析变量看作是所有潜在变量的一个样本, 最大化因子 的Alpha可靠性。
映像因子法: 把每个变量的主要部分定义为其他各变量的线性回归, 而不是潜 在因子的函数。
最常用主成分法、最大似然法和主轴因子法。
得到因子模型后,其中的公共因子不一定能反映问题的实质特征,为了能更好地解释每一个公共因子的实际意义,且减少解释的主观性,可以通过因子旋转达到目的。因子旋转分为正交旋转与斜交旋转,经过正交旋转而得到的新的公共因子仍然保持彼此独立的性质,而斜交旋转得到的公共因子是相关的(违背了最初的假定,因此可以看作传统因子分析的拓展),其实际意义更容易解释。但不论是正交旋转还是斜交旋转,都应当使新公共因子的载荷系数的绝对值尽可能接近0或1。
最大方差法 (Varimax Method): 一种正交旋转方法, 它使得对每个因子有高负载的变量的数目达到最小。该 方法简化了因子的解释。
直接 Oblimin 方法: 一种斜交 (非正交) 旋转方法。当 delta 等于 0 (缺省值) 时, 解是最斜交的。 delta 负得越厉害, 因子的斜交度越低。要覆盖缺省的 delta 值 0 , 请输人小于等于 0.8 0.8 0.8 的数。
最大四次方值法 (Quartimax Method): 一种旋转方法, 它可使得解释每个变量所需的因子最少。该方法简化 了观察到的变量的解释。
最大平衡值法 (Equamax Method): 一种旋转方法, 它是简化因子的最大方差法与简化变量的最大四次方值 法的组合。它可以使得高度依赖因子的变量的个数以及解释变量所需的因子的个数最少。
最优斜交旋转 (Promax Rotation): 斜交旋转, 可使因子相关联。该旋转可比直接最小斜交旋转更快地计算出 来, 因此适用于大型数据集。
因子分析是将变量表示为公共因子和特殊因子的线性组合;此外, 我们可以反过来将公共因子表示为原变量的线性组合, 即可得到因子得分。
{ x 1 = u 1 + a 11 f 1 + a 12 f 2 + ⋯ + a 1 m f m + ε 1 x 2 = u 2 + a 21 f 1 + a 22 f 2 + ⋯ + a 2 m f m + ε 2 ⋮ x p = u p + a p 1 f 1 + a p 2 f 2 + ⋯ + a p m f m + ε p ⇒ { f 1 = b 11 x 1 + b 12 x 2 + ⋯ + b 1 p x p f 2 = b 21 x 1 + b 22 x 2 + ⋯ + b 2 p x p ⋮ f m = b m 1 x 1 + b m 2 x 2 + ⋯ + b m p x p \left\{\begin{array} { l } { x _ { 1 } = u _ { 1 } + a _ { 1 1 } f _ { 1 } + a _ { 1 2 } f _ { 2 } + \cdots + a _ { 1 m } f _ { m } + \varepsilon _ { 1 } } \\ { x _ { 2 } = u _ { 2 } + a _ { 2 1 } f _ { 1 } + a _ { 2 2 } f _ { 2 } + \cdots + a _ { 2 m } f _ { m } + \varepsilon _ { 2 } } \\ { \vdots } \\ { x _ { p } = u _ { p } + a _ { p 1 } f _ { 1 } + a _ { p 2 } f _ { 2 } + \cdots + a _ { p m } f _ { m } + \varepsilon _ { p } } \end{array} \Rightarrow \left\{\begin{array}{c} f_{1}=b_{11} x_{1}+b_{12} x_{2}+\cdots+b_{1 p} x_{p} \\ f_{2}=b_{21} x_{1}+b_{22} x_{2}+\cdots+b_{2 p} x_{p} \\ \vdots \\ f_{m}=b_{m 1} x_{1}+b_{m 2} x_{2}+\cdots+b_{m p} x_{p} \end{array}\right.\right. ⎩ ⎨ ⎧x1=u1+a11f1+a12f2+⋯+a1mfm+ε1x2=u2+a21f1+a22f2+⋯+a2mfm+ε2⋮xp=up+ap1f1+ap2f2+⋯+apmfm+εp⇒⎩ ⎨ ⎧f1=b11x1+b12x2+⋯+b1pxpf2=b21x1+b22x2+⋯+b2pxp⋮fm=bm1x1+bm2x2+⋯+bmpxp
第 i i i 个因子的得分可写成 f i = b i 1 x 1 + b i 2 x 2 + ⋯ + b i p x p ( i = 1 , 2 , ⋯ , m ) f_{i}=b_{i 1} x_{1}+b_{i 2} x_{2}+\cdots+b_{i p} x_{p}(i=1,2, \cdots, m) fi=bi1x1+bi2x2+⋯+bipxp(i=1,2,⋯,m) b i j b_{i j} bij 就是第 i i i 个因子的得分对应于第 j j j 个变量 x j x_{j} xj 的系数
注:我们计算出因子得分函数的系数后,就能够求出所有的因子得分。
计算因子得分的可选方法有回归、Bartlett 和 Anderson-Rubin。
因子得分函数
F ^ j = b j 1 X 1 + ⋯ + b j p X p , ( j = 1 , 2 , ⋯ , m ) \hat{F}_{j}=b_{j 1} X_{1}+\cdots+b_{j p} X_{p}, (j=1,2, \cdots, m) F^j=bj1X1+⋯+bjpXp,(j=1,2,⋯,m)
由于
a i j = γ X i F j = E ( X i F j ) = E [ X i ( b j 1 X 1 + ⋯ + b j p X p ) ] = b j 1 γ i 1 + ⋯ + b j p γ i p = [ γ i 1 γ i 2 ⋯ γ i p ] [ b j 1 b j 2 ⋮ b j p ] \begin{array}{c} a_{i j}=\gamma_{X_{i} F_{j}}=E\left(X_{i} F_{j}\right)=E\left[X_{i}\left(b_{j 1} X_{1}+\cdots+b_{j p} X_{p}\right)\right] \\ =b_{j 1} \gamma_{i 1}+\cdots+b_{j p} \gamma_{i p}=\left[\begin{array}{llll} \gamma_{i 1} & \gamma_{i 2} & \cdots & \gamma_{i p} \end{array}\right]\left[\begin{array}{c} b_{j 1} \\ b_{j 2} \\ \vdots \\ b_{j p} \end{array}\right] \end{array} aij=γXiFj=E(XiFj)=E[Xi(bj1X1+⋯+bjpXp)]=bj1γi1+⋯+bjpγip=[γi1γi2⋯γip]⎣ ⎡bj1bj2⋮bjp⎦ ⎤
则我们有如下的方程组
[ γ 11 γ 12 ⋯ γ 1 p γ 21 γ 22 ⋯ γ 2 p ⋮ ⋮ ⋮ γ p 1 b p 2 ⋯ b p p ] [ b j 1 b j 2 ⋮ b j p ] = [ a 1 j a 2 j ⋮ a p j ] \left[\begin{array}{cccc} \gamma_{11} & \gamma_{12} & \cdots & \gamma_{1 p} \\ \gamma_{21} & \gamma_{22} & \cdots & \gamma_{2 p} \\ \vdots & \vdots & & \vdots \\ \gamma_{p 1} & b_{p 2} & \cdots & b_{p p} \end{array}\right]\left[\begin{array}{c} b_{j 1} \\ b_{j 2} \\ \vdots \\ b_{j p} \end{array}\right]=\left[\begin{array}{c} a_{1 j} \\ a_{2 j} \\ \vdots \\ a_{p j} \end{array}\right] ⎣ ⎡γ11γ21⋮γp1γ12γ22⋮bp2⋯⋯⋯γ1pγ2p⋮bpp⎦ ⎤⎣ ⎡bj1bj2⋮bjp⎦ ⎤=⎣ ⎡a1ja2j⋮apj⎦ ⎤
其中
[ γ 11 γ 12 ⋯ γ 1 p γ 21 γ 22 ⋯ γ 2 p ⋮ ⋮ ⋮ γ p 1 b p 2 ⋯ b p p ] , [ b j 1 b j 2 ⋮ b j p ] , [ a 1 j a 2 j ⋮ a p j ] \left[\begin{array}{cccc} \gamma_{11} & \gamma_{12} & \cdots & \gamma_{1 p} \\ \gamma_{21} & \gamma_{22} & \cdots & \gamma_{2 p} \\ \vdots & \vdots & & \vdots \\ \gamma_{p 1} & b_{p 2} & \cdots & b_{p p} \end{array}\right],\left[\begin{array}{c} b_{j 1} \\ b_{j 2} \\ \vdots \\ b_{j p} \end{array}\right],\left[\begin{array}{c} a_{1 j} \\ a_{2 j} \\ \vdots \\ a_{p j} \end{array}\right] ⎣ ⎡γ11γ21⋮γp1γ12γ22⋮bp2⋯⋯⋯γ1pγ2p⋮bpp⎦ ⎤,⎣ ⎡bj1bj2⋮bjp⎦ ⎤,⎣ ⎡a1ja2j⋮apj⎦ ⎤
分别为原始变量的相关系数矩阵, 第 j 个因子得分函数的系数, 载荷矩阵的第 j 列。
用矩阵表示有
[ b 11 b 21 ⋯ b m 1 b 12 b 22 ⋯ b m 2 ⋮ ⋮ ⋮ b 1 p b 2 p ⋯ b m p ] = R − 1 A \left[\begin{array}{cccc} b_{11} & b_{21} & \cdots & b_{m 1} \\ b_{12} & b_{22} & \cdots & b_{m 2} \\ \vdots & \vdots & & \vdots \\ b_{1 p} & b_{2 p} & \cdots & b_{m p} \end{array}\right]=R^{-1} A ⎣ ⎡b11b12⋮b1pb21b22⋮b2p⋯⋯⋯bm1bm2⋮bmp⎦ ⎤=R−1A
因此, 因子得分的估计为
F ^ = ( F ^ i j ) n × m = X 0 R − 1 A \hat{F}=\left(\hat{F}_{i j}\right)_{n \times m}=X_{0} R^{-1} A F^=(F^ij)n×m=X0R−1A
其中 F ^ i j \hat{F}_{i j} F^ij 为第 i i i 个样本点对第 j j j 个因子 F j F_{j} Fj 得分的估计值, X 0 X_{0} X0 是 n × m n \times m n×m 的原始数据矩阵。
[ a 11 a 12 ⋯ a 1 m a 21 a 22 ⋯ a 2 m ⋮ ⋮ ⋮ a p 1 a p 2 ⋯ a p m ] \left[\begin{array}{cccc} a_{11} & a_{12} & \cdots & a_{1 m} \\ a_{21} & a_{22} & \cdots & a_{2 m} \\ \vdots & \vdots & & \vdots \\ a_{p 1} & a_{p 2} & \cdots & a_{p m} \end{array}\right] ⎣ ⎡a11a21⋮ap1a12a22⋮ap2⋯⋯⋯a1ma2m⋮apm⎦ ⎤
看成自变量的观测。
{ x i 1 − μ 1 = a 11 f 1 + a 12 f 2 + ⋯ + a 1 m f m + ε 1 x i 2 − μ 2 = a 21 f 1 + a 22 f 2 + ⋯ + a 2 m f m + ε 2 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ x i p − μ p = a p 1 f 1 + a p 2 f 2 + ⋯ + a p m f m + ε p \left\{\begin{array}{l} x_{i 1}-\mu_{1}=a_{11} f_{1}+a_{12} f_{2}+\cdots+a_{1 m} f_{m}+\varepsilon_{1} \\ x_{i 2}-\mu_{2}=a_{21} f_{1}+a_{22} f_{2}+\cdots+a_{2 m} f_{m}+\varepsilon_{2} \\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \\ x_{i p}-\mu_{p}=a_{p 1} f_{1}+a_{p 2} f_{2}+\cdots+a_{p m} f_{m}+\varepsilon_{p} \end{array}\right. ⎩ ⎨ ⎧xi1−μ1=a11f1+a12f2+⋯+a1mfm+ε1xi2−μ2=a21f1+a22f2+⋯+a2mfm+ε2⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯xip−μp=ap1f1+ap2f2+⋯+apmfm+εp
由于特殊因子的方差相异, 所以用加权最小二乘法求得分。使
∑ j = 1 p [ ( x i j − μ i ) − ( a i 1 f ^ 1 + a i 2 f ^ 2 + ⋯ a i m f ^ m ) ] 2 / σ i 2 \sum_{j=1}^{p}\left[\left(x_{i j}-\mu_{i}\right)-\left(a_{i 1} \hat{f}_{1}+a_{i 2} \hat{f}_{2}+\cdots a_{i m} \hat{f}_{m}\right)\right]^{2} / \sigma_{i}^{2} j=1∑p[(xij−μi)−(ai1f^1+ai2f^2+⋯aimf^m)]2/σi2
最小的 f ^ 1 , ⋯ , f ^ m \hat{f}_{1}, \cdots, \hat{f}_{m} f^1,⋯,f^m 是相应个案的因子得分。
用矩阵表达有
x − μ = A F + ε x-\mu=A F+\varepsilon x−μ=AF+ε
则要使
( x − μ − A F ) T D − 1 ( x − μ − A F ) (x-\mu-A F)^{T} D^{-1}(x-\mu-A F) (x−μ−AF)TD−1(x−μ−AF)
达到最小, 其中
D = [ σ 1 2 ⋱ σ p 2 ] D=\left[\begin{array}{lll} \sigma_{1}^{2} & & \\ & \ddots & \\ & & \sigma_{p}^{2} \end{array}\right] D=⎣ ⎡σ12⋱σp2⎦ ⎤
使取得最小值的 F F F 是相应个案的因子得分。
计算得 F F F 满足
A T D − 1 F = A T D − 1 A ( x − μ ) A^{T} D^{-1} F=A^{T} D^{-1} A(x-\mu) ATD−1F=ATD−1A(x−μ)
解之得
F ^ = ( A T D − 1 A ) − 1 A T D − 1 ( x − μ ) \hat{F}=\left(A^{T} D^{-1} A\right)^{-1} A^{T} D^{-1}(x-\mu) F^=(ATD−1A)−1ATD−1(x−μ)
KMO检验是 Kaiser, Meyer和 Olkin提出的,该检验是对原始变量之间的简单相关系数和偏相关系数的相对大小进行验,主要应用于多元统计的因子分析。KMO统计量是取值在0和1之间,当所有变量间的简单相关系数平方和远远大于偏相关系数平方和时, KMO值越接近于1,意味着变量间的相关性越强,原有变量越适合作因子分析;当所有变量间的简单相关系数平方和接近0时, KMO值越接近于0,意味着变量间的相关性越弱,原有变量越不适合作因子分析。其中, Kaiser给出一个KMO检验标准: KMO>0.9,非常适合; 0.8 巴特利特球形检验是一种检验各个变量之间相关性程度的检验方法。一般在做因子分析之前都要进行巴特利特球形检验,用于判断变量是否适合用于做因子分析。巴特利特球形检验是以变量的相关系数矩阵为出发点的。它的原假设是相关系数矩阵是一个单位阵(不适合做因子分析,指标之间的相关性太差,不适合降维),即相关系数矩阵对角线上的所有元素都是1,所有非对角线上的元素都为0。巴特利特球形检验的统计量是根据相关系数矩阵的行列式得到的。如果该值较大,且其对应的p值小于用户心中的显著性水平(一般为0.05),那么应该拒绝原假设,认为相关系数不可能是单位阵,即原始变量之间存在相关性,适合于作因子分析。 相反不适合作因子分析。 碎石检验(scree test)是根据碎石图来决定因素数的方法。Kaiser提出,可通过直接观察特征值的变化来决定因素数。当某个特征值较前一特征值的值出现较大的下降,而这个特征值较小,其后面的特征值变化不大,说明添加相应于该特征值的因素只能增加很少的信息,所以前几个特征值就是应抽取的公共因子数。 碎石图得到的因子数只起到参考作用;在因子分析应用于某些专业问题上时,可能事先我们已经知道了最后要确定的因子数,这时候碎石图的意义就不大了。 因子分析跟主成分分析一样,由于侧重点都是进行数据降维,因此很少单独使用,大多数情况下都会有一些模型组合使用。例如: 流程: 示例: R = [ 1 0.64 0.29 0.1 0.64 1 0.7 0.3 0.29 0.7 1 0.84 0.1 0.3 0.84 1 ] R=\left[\begin{array}{cccc} 1 & 0.64 & 0.29 & 0.1 \\ 0.64 & 1 & 0.7 & 0.3 \\ 0.29 & 0.7 & 1 & 0.84 \\ 0.1 & 0.3 & 0.84 & 1 \end{array}\right] R=⎣ ⎡10.640.290.10.6410.70.30.290.710.840.10.30.841⎦ ⎤ 对应特征值的特征向量矩阵为: U = [ 0.38 0.67 0.62 − 0.14 0.54 0.36 − 0.61 0.46 0.59 − 0.3 − 0.2 − 0.72 0.47 − 0.58 0.45 0.50 ] U=\left[\begin{array}{cccc} 0.38 & 0.67 & 0.62 & -0.14 \\ 0.54 & 0.36 & -0.61 & 0.46 \\ 0.59 & -0.3 & -0.2 & -0.72 \\ 0.47 & -0.58 & 0.45 & 0.50 \end{array}\right] U=⎣ ⎡0.380.540.590.470.670.36−0.3−0.580.62−0.61−0.20.45−0.140.46−0.720.50⎦ ⎤ 假吅要求所取特征值反映的信息量占总体信息量的 90 % 以上,则从男计徍征值所占百分比看,只需取前两项即可。也就是说,只需取两个 主要因子。对应于前两列特征值的特征向量, 可求的其因子载荷矩阵A为: A = [ 0.60 0.71 0.85 0.38 0.93 − 0.32 0.74 − 0.40 ] A=\left[\begin{array}{cc} 0.60 & 0.71 \\ 0.85 & 0.38 \\ 0.93 & -0.32 \\ 0.74 & -0.40 \end{array}\right] A=⎣ ⎡0.600.850.930.740.710.38−0.32−0.40⎦ ⎤ 于是,该问题的因子模型为: x l = 0.60 f 1 + 0.71 f 2 x 2 = 0.85 f 1 + 0.38 f 2 x 3 = 0.93 f 1 − 0.32 f 2 x 4 = 0.74 f 1 − 0.40 f 2 \begin{array}{l} x_{l}=0.60 f_{1}+0.71 f_{2} \\ x_{2}=0.85 f_{1}+0.38 f_{2} \\ x_{3}=0.93 f_{1}-0.32 f_{2} \\ x_{4}=0.74 f_{1}-0.40 f_{2} \end{array} xl=0.60f1+0.71f2x2=0.85f1+0.38f2x3=0.93f1−0.32f2x4=0.74f1−0.40f2 数据集:9.2 巴特利特球形检验
9.3 碎石检验
十、应用
十一、实现步骤流程及示例分析
假设某一社会经济系统问题, 其主要特性可用 4 个指标表示, 它们分别是生产、技术、交通和环境。其相关矩阵为:
因子分析:由以上可以看出,两个因子中, f 1 f_1 f1是全面反映生产、技术、交通和环境的因子,而 f 2 f_2 f2却不同,它反映了对生产和技术这两项增长有利,而对交通和环境增长不利的因子。也就是说,按照原有统计资料得出的相关矩阵分析的结果是如果生产和技术都随 f 2 f_2 f2增长了,将有可能出现交通紧张和环境恶化的问题, f 2 f_2 f2反映了这两方面的相互制约状况。十二、python实现因子分析
列名使用中文会报错,未解决。采用x(1-8)代替不影响结果。
# 数据处理
import pandas as pd
import numpy as np
# 绘图
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib as mpl
# 因子分析
from factor_analyzer import FactorAnalyzer
# Bartlett's球状检验
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity
#KMO检验
from factor_analyzer.factor_analyzer import calculate_kmo
df = pd.read_excel("data_1.xls",index_col=0).reset_index(drop=True)
print(df)
print(df.isnull().sum())
# Bartlett's球状检验
# 检验总体变量的相关矩阵是否是单位阵(相关系数矩阵对角线的所有元素均为1,所有非对角线上的元素均为零);即检验各个变量是否各自独立。
# 如果不是单位矩阵,说明原变量之间存在相关性,可以进行因子分子;反之,原变量之间不存在相关性,数据不适合进行主成分分析
chi_square_value, p_value = calculate_bartlett_sphericity(df)
print("Bartlett's球状检验参数:\n",chi_square_value, p_value)
#KMO检验
# 检查变量间的相关性和偏相关性,取值在0-1之间;KOM统计量越接近1,变量间的相关性越强,偏相关性越弱,因子分析的效果越好。
# 通常取值从0.6开始进行因子分析
kmo_all,kmo_model=calculate_kmo(df)
print("KMO检验参数:\n",kmo_model)
# 构建因子分析模型
fa = FactorAnalyzer(8, rotation=None)
# 训练模型
fa.fit(df)
# 得到特征值ev、特征向量v
ev, v = fa.get_eigenvalues()
print(ev, v)
# 同样的数据绘制散点图和折线图
plt.scatter(range(1, df.shape[1] + 1), ev)
plt.plot(range(1, df.shape[1] + 1), ev)
# 显示图的标题和xy轴的名字
# 最好使用英文,中文可能乱码
plt.title("Scree Plot")
plt.xlabel("Factors")
plt.ylabel("Eigenvalue")
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
plt.grid() # 显示网格
plt.show() # 显示图形
# 选择方式: varimax 方差最大化
# 选择固定因子为2个
fa_two = FactorAnalyzer(2,rotation='varimax')
fa_two.fit(df)
# 查看每个变量的公因子方差数据
pd.DataFrame(fa_two.get_communalities(),index=df.columns)
# 查看旋转后的特征值
pd.DataFrame(fa_two.get_eigenvalues())
# 查看成分矩阵
# 变量个数*因子个数
pd.DataFrame(fa_two.loadings_,index=df.columns)
# 查看因子贡献率
fa_two.get_factor_variance()
# 隐藏变量可视化
df1 = pd.DataFrame(np.abs(fa_two.loadings_),index=df.columns)
print(df1)
# 绘图
plt.figure(figsize=(14, 14))
ax = sns.heatmap(df1, annot=True, cmap="BuPu")
# 设置y轴字体大小
ax.yaxis.set_tick_params(labelsize=15)
plt.title("Factor Analysis", fontsize="xx-large")
# 设置y轴标签
plt.ylabel("Sepal Width", fontsize="xx-large")
# 显示图片
plt.show()
# 保存图片
# plt.savefig("factorAnalysis", dpi=500)
# 转换新变量
df2 = pd.DataFrame(fa_two.transform(df))
print(df2)