因子旋转的理论基础
写本博客的目的是:在使用varimax方法时不知道原理到底是什么?查了好多教材和网上的资料,都没有具体的理论推导,无法真正理解此方法的内核计算。最后终于在factor analysis as a statistical method书中的chapter6找到相关内容,并进行整理,最后给出相关matlab代码。
1. varimax 方法
1.1 varimax的理论基础
在varimax旋转方法出现之前,通常使用旋转的图形方法,目的是消除负的因子载荷(loading)并且尽可能少的非0因子载荷来描述数据。但这种方法具有一定的主观性。
varimax方法与图形方法在某种程度上具有相似的特点。 与原始的因子载荷相比,用这种方法对因子进行旋转得到的新的因子载荷要么相对大要么相对小。正如我们所看到的,这种旋转的方法是通过最大化loading的平方的一个特定函数并且迭代完成的。在Kaiser’s的原始旋转方法中,因子是成对地旋转(两个两个的旋转)直到loadings收敛到最终值。下面我们描述的是"The simultaneously factor varimax solution"(同时因子varimax解),显然,这个方法的最主要特点是在每一次迭代时,所有因子同时被旋转,并非Kaiser’s的成对成对地旋转。它比原始的varimax方法更快,并且没有累积的舍入误差(因为原始方法是成对旋转的)。
将 矩阵
Λ
0
(
p
×
k
)
\mathbf{\Lambda}_{0}(p \times k)
Λ0(p×k) 看做是未旋转的因子载荷,则
Λ
0
′
\mathbf{\Lambda}_{0}^{\prime}
Λ0′的第
i
i
i列(即
Λ
0
\mathbf{\Lambda}_{0}
Λ0 的第
i
i
i行)是一个
k
k
k维的列向量,用
I
i
\mathbf{I}_{i}
Ii表示。 定义
M
\mathbf{M}
M是一个
k
×
k
k \times k
k×k的正交旋转矩阵,它的第
r
r
rth列用
m
r
(
r
=
1
,
⋯
,
k
)
\mathbf{m}_r(r=1,\cdots,k)
mr(r=1,⋯,k)。新的旋转的因子载荷矩阵
Λ
=
[
λ
i
r
]
\mathbf{\Lambda}=\left[\lambda_{i r}\right]
Λ=[λir],可以通过如下计算:
Λ
=
Λ
0
M
\mathbf{\Lambda}=\mathbf{\Lambda}_{\mathbf{0}} \mathbf{M}
Λ=Λ0M
因此,
λ
i
r
=
l
i
′
m
r
.
\lambda_{i r}=\mathbf{l}_{i}^{\prime} \mathbf{m}_{r} .
λir=li′mr.
定义一个标量 d r ( r = 1 , ⋯ , k ) d_r(r=1,\cdots,k) dr(r=1,⋯,k):
d r = ∑ i = 1 p λ i r 2 = ∑ i ( I i ′ m r ) 2 d_{r}=\sum_{i=1}^{p} \lambda_{i r}^{2}=\sum_{i}\left(\mathbf{I}_{i}^{\prime} \mathbf{m}_{r}\right)^{2} dr=i=1∑pλir2=i∑(Ii′mr)2
d r d_r dr表示的是 Λ \mathbf{\Lambda} Λ的第 r r rth列的因子载荷的平方和。
在同时varimax方法中的标准 x x x被最大化,形式如下:
x
=
∑
r
=
1
k
[
∑
i
=
1
p
(
λ
i
r
2
−
d
r
/
p
)
2
]
=
∑
r
[
∑
i
λ
i
r
4
−
d
r
2
/
p
]
=
∑
r
[
∑
i
(
I
i
′
m
r
)
4
−
d
r
2
/
p
]
\begin{aligned} x &=\sum_{r=1}^{k}\left[\sum_{i=1}^{p}\left(\lambda_{i r}^{2}-d_{r} / p\right)^{2}\right] \\ &=\sum_{r}\left[\sum_{i} \lambda_{i r}^{4}-d_{r}^{2} / p\right] \\ &=\sum_{r}\left[\sum_{i}\left(\mathbf{I}_{i}^{\prime} \mathbf{m}_{r}\right)^{4}-d_{r}^{2} / p\right] \end{aligned}
x=r=1∑k[i=1∑p(λir2−dr/p)2]=r∑[i∑λir4−dr2/p]=r∑[i∑(Ii′mr)4−dr2/p]
从这个定义中,我们可以看出:
x
x
x代表的是
λ
i
r
2
\lambda_{i r}^{2}
λir2与其对应的列均值的偏差平方和。这个
x
x
x的最大化与
M
\mathbf{M}
M有关。因为
M
\mathbf{M}
M是正交阵,所以它的列满足如下条件:
m r ′ m r = 1 , m r ′ m s = 0 ( r ≠ s ) \begin{aligned} \mathbf{m}_{r}^{\prime} \mathbf{m}_{r} &=1, & \\ \mathbf{m}_{r}^{\prime} \mathbf{m}_{s} &=0 &(r \neq s) \end{aligned} mr′mrmr′ms=1,=0(r=s)
使用拉格朗日乘子的方法,表达式如下:
y = x − 2 ∑ x ∑ s a r s m r ′ m s y=x-2 \sum_{x} \sum_{s} a_{r s} \mathbf{m}_{r}^{\prime} \mathbf{m}_{s} y=x−2x∑s∑arsmr′ms
a a a系数代表的是不确定的乘子,且 a r s = a s r a_{rs}=a_{sr} ars=asr.
对 y y y关于 m s \mathbf{m}_s ms求导并令其等于0,求解如下:
∂
y
/
∂
m
s
=
4
∑
i
[
(
I
i
′
m
s
)
3
I
i
]
−
(
4
d
s
/
p
)
∑
i
[
(
I
i
′
m
s
)
I
i
]
−
4
∑
r
(
a
r
s
m
r
)
=
4
∑
i
(
c
i
s
−
d
s
λ
i
s
/
p
)
I
i
−
4
∑
r
a
r
s
m
r
\begin{aligned} \partial y / \partial \mathbf{m}_{s} &=4 \sum_{i}\left[\left(\mathbf{I}_{i}^{\prime} \mathbf{m}_{s}\right)^{3} \mathbf{I}_{i}\right]-\left(4 d_{s} / p\right) \sum_{i}\left[\left(\mathrm{I}_{i}^{\prime} \mathbf{m}_{s}\right) \mathrm{I}_{i}\right]-4 \sum_{r}\left(a_{r s} \mathbf{m}_{r}\right) \\ &=4 \sum_{i}\left(c_{is}-d_{s} \lambda_{i s} / p\right) \mathbf{I}_{i}-4 \sum_{r} a_{r s} \mathbf{m}_{r} \end{aligned}
∂y/∂ms=4i∑[(Ii′ms)3Ii]−(4ds/p)i∑[(Ii′ms)Ii]−4r∑(arsmr)=4i∑(cis−dsλis/p)Ii−4r∑arsmr
其中,
c i r = ( I i ′ m r ) 3 = λ i r 3 . c_{i r}=\left(\mathbf{I}_{i}^{\prime} \mathbf{m}_{r}\right)^{3}=\lambda_{i r}^{3}. cir=(Ii′mr)3=λir3.
经检查发现: ∂ y / ∂ m s \partial y / \partial \mathbf{m}_{s} ∂y/∂ms是下面矩阵的第 s s sth列:
4
[
Λ
0
′
C
−
(
1
/
p
)
Λ
0
′
Λ
D
−
M
A
]
4\left[\mathbf{\Lambda}_{0}^{\prime} \mathbf{C}-(1 / p) \mathbf{\Lambda}_{0}^{\prime} \mathbf{\Lambda} \mathbf{D}-\mathbf{M} \mathbf{A}\right]
4[Λ0′C−(1/p)Λ0′ΛD−MA]
其中,
C
\mathbf{C}
C是一个
p
×
k
p \times k
p×k矩阵,其元素为
c
i
r
c_{ir}
cir,
A
\mathbf{A}
A是
k
×
k
k \times k
k×k的对称矩阵,且元素为
a
r
s
a_{rs}
ars,
D
\mathbf{D}
D是对角矩阵,对角元为
d
1
,
d
2
,
,
⋯
,
d
k
d_1,d_2,,\cdots,d_k
d1,d2,,⋯,dk.因此将
s
s
s的所有值都考虑进去,有:
∂
y
/
∂
M
=
4
(
B
−
M
A
)
\begin{array}{l} \partial y / \partial \mathbf{M}=4(\mathbf{B}-\mathbf{M A}) \end{array}
∂y/∂M=4(B−MA)
其中,
B
=
Λ
0
′
[
C
−
(
1
/
p
)
Λ
D
]
\begin{array}{l} \mathbf{B}=\mathbf{\Lambda}_{0}^{\prime}[\mathbf{C}-(1 / p) \mathbf{\Lambda} \mathbf{D}] \end{array}
B=Λ0′[C−(1/p)ΛD]
因此,最大化 x x x的正交矩阵 M \mathbf{M} M满足如下等式:
M A = B \mathbf{M A}=\mathbf{B} MA=B
可以证明:如果 A \mathbf{A} A是正定的,由于 A \mathbf{A} A也是对称的,那么上述的等式对应于 x x x的一个最大值。对上式左乘一个 M ′ \mathbf{M}^{\prime} M′,有:
A
=
M
′
B
=
Λ
′
C
−
(
1
/
p
)
Λ
′
Λ
D
\begin{aligned} \mathbf{A} &=\mathbf{M}^{\prime} \mathbf{B} \\ &=\mathbf{\Lambda}^{\prime} \mathbf{C}-(1 / p) \mathbf{\Lambda}^{\prime} \mathbf{\Lambda D} \end{aligned}
A=M′B=Λ′C−(1/p)Λ′ΛD
因此,当
x
x
x被最大化时,等式右边应该是对称矩阵。
A
\mathbf{A}
A的第
r
r
rth个对角元为:
∑ i λ i r 4 − ( 1 / p ) ( ∑ i λ i r 2 ) 2 \sum_{i} \lambda_{i r}^{4}-(1 / p)\left(\sum_{i} \lambda_{i r}^{2}\right)^{2} i∑λir4−(1/p)(i∑λir2)2
基于 x x x的定义,我们发现: tr ( A ) \operatorname{tr}(\mathbf{A}) tr(A)就是 x x x的最大值。
满足 M A = B \mathbf{M A}=\mathbf{B} MA=B的 M \mathbf{M} M, A \mathbf{A} A和 B \mathbf{B} B可以通过迭代获得。我们首先用一个近似的初始矩阵 M 1 \mathbf{M}_1 M1,这将产生一个 Λ \mathbf{\Lambda} Λ初始的近似 Λ 1 = Λ 0 M 1 \mathbf{\Lambda}_{1}=\mathbf{\Lambda}_{0} \mathbf{M}_{1} Λ1=Λ0M1。并且,从 Λ 1 \mathbf{\Lambda}_{1} Λ1中,我们获得 C \mathbf{C} C, D \mathbf{D} D和 B \mathbf{B} B的近似 C 1 \mathbf{C}_1 C1, D 1 \mathbf{D}_1 D1和 B 1 \mathbf{B}_1 B1,x现在我们来求对称和正定矩阵 A 1 \mathbf{A}_1 A1和第二个正交旋转矩阵 M 2 \mathbf{M}_2 M2:
M 2 A 1 = B 1 \mathbf{M}_{2} \mathbf{A}_{1}=\mathbf{B}_{1} M2A1=B1
注意对上述方程的等式两边分别左乘自己的转置矩阵,有如下等式:
A
1
2
=
B
1
′
B
1
\mathbf{A}_{1}^{2}=\mathbf{B}_{1}^{\prime} \mathbf{B}_{1}
A12=B1′B1
现在,
B
1
′
B
1
\mathbf{B}_{1}^{\prime} \mathbf{B}_{1}
B1′B1是
k
×
k
k \times k
k×k的对称和正定矩阵,因此我们可以用如下形式来表示:
U
Δ
2
U
′
\mathbf{U} \Delta^{2} \mathbf{U}^{\prime}
UΔ2U′,其中
U
\mathbf{U}
U是正交矩阵,且
Δ
\Delta
Δ是具有正的对角元素的对角矩阵。因此我们可以用以下形式来表示
A
1
\mathbf{A}_{1}
A1:
A 1 = U Δ U ′ \mathbf{A}_{\mathbf{1}}=\mathbf{U} \boldsymbol{\Delta} \mathbf{U}^{\prime} A1=UΔU′
则 M 2 \mathbf{M}_{2} M2为:
M 2 = B 1 A 1 − 1 \mathbf{M}_{2}=\mathbf{B}_{1} \mathbf{A}_{1}^{-1} M2=B1A1−1
然后用 M 2 \mathbf{M}_{2} M2替代 M 1 \mathbf{M}_{1} M1,在对上述程序进行重复,我们会得到一个 M s \mathbf{M}_{s} Ms的矩阵序列。可以证明:当 M 1 \mathbf{M}_{1} M1与 M \mathbf{M} M充分接近时,序列收敛到 M \mathbf{M} M。且对应的矩阵序列 A s \mathbf{A}_{s} As,它的 tr ( A s ) \operatorname{tr}(\mathbf{A}_s) tr(As)是不断上升并且最终达到一个稳定值,这个稳定值便是标准 x x x的最大值。
在实际中,选择一个好的 M \mathbf{M} M的初始近似并不是必须的,通常情况下, M 1 = I \mathbf{M}_{\mathbf{1}}=\mathbf{I} M1=I 并且 Λ 1 = Λ 0 \mathbf{\Lambda}_{\mathbf{1}}=\mathbf{\Lambda}_{\mathbf{0}} Λ1=Λ0,通常只需要很少的几次迭代就可以了。
Horst建议,在最大化过程开始时,最好对原始的因子载荷矩阵 Λ 0 \mathbf{\Lambda}_{0} Λ0按行标准化,这样每一个行向量 I i ′ \mathbf{I}_{i}^{\prime} Ii′就被尺度化为单位长度了。在最大化结束时,当获得 M \mathbf{M} M后,最终的 Λ \mathbf{\Lambda} Λ也需要重新按照行进行标准化,这样communalities的值才是正确的。
1.2 varimax的缺点
varimax有两个主要的缺点:
- 第一个缺点:如果在旋转过程中加入其他额外的因子,则通过varimax方法获得的因子载荷的pattern可能会发生很大的变化。
- 第二个缺点:当在因子中出现一个非常重要的一般因子(general factor)情况下,varimax方法可能并不work;
2. promax方法
在许多情况下,因子载荷的pattern可以通过进一步将因子转化为倾斜或者是相关的因子来进一步简化。可是这种简化需要付出一定的代价因为我们必须估计因子之间的相关系数,在对结果进行解释时也必须考虑这些因素。最终,人们的注意力转向了分析标准的发现,这些标准可以用来产生唯一的、不那么主观的解。有很多这样的方法,我们集中注意力介绍promax方法,因为它在实际中似乎效果更好。
2.1 promax方法的理论基础
promax方法的起始以varimax旋转的结果为起始。假设varimax方法产生的loadings是 Λ = [ λ i r ] \mathbf{\Lambda}=[\lambda_{ir}] Λ=[λir],并且构造另外一个 p × k p \times k p×k的矩阵 Q = [ q i r ] \mathbf{Q}=\left[q_{i r}\right] Q=[qir],它的元素按如下公式定义:
q i r = ∣ λ i r m − 1 ∣ λ i r q_{i r}=\left|\lambda_{i r}^{m-1}\right| \lambda_{i r} qir=∣∣λirm−1∣∣λir
其中, m m m是满足 m > 1 m>1 m>1的某个整数。因此:如果 λ i r = 0 \lambda_{i r}=0 λir=0则 q i r = 0 q_{i r}=0 qir=0 ,否则, q i r q_{i r} qir和 λ i r \lambda_{i r} λir有相同的符号和相同的绝对值。
现在,我们向寻找一个变换矩阵 U \mathbf{U} U(此矩阵不必是正交的),对于 r = 1 , … , k r=1, \ldots, k r=1,…,k, Λ U \mathbf{\Lambda U} ΛU的第 r r r列与 Q \mathbf{Q} Q的第 r r r列在最小二乘的意义上保持最大的一致性。一般来说,是当loadings相对较大时, Λ U \mathbf{\Lambda U} ΛU的目的使其更大;当loadings相对较小时, Λ U \mathbf{\Lambda U} ΛU使其更小。
m m m值的选择是一个反复试错的过程,但经验证明当简化loadings的pattern时,m大于4经常生成高度相关的因子,这在实际中是不被期望的。
将
Q
\mathbf{Q}
Q 和
U
\mathbf{U}
U的第
r
r
r列分别表示为
q
r
\mathbf{q}_{r}
qr 和
u
r
\mathbf{u}_{r}
ur。然后,对于每一个
r
r
r,我们选择的
u
r
\mathbf{u}_{r}
ur使其最小化以下的表达式:
(
q
r
−
Λ
u
r
)
′
(
q
r
−
Λ
u
r
)
\left(\mathbf{q}_{r}-\mathbf{\Lambda} \mathbf{u}_{r}\right)^{\prime}\left(\mathbf{q}_{r}-\mathbf{\Lambda} \mathbf{u}_{r}\right)
(qr−Λur)′(qr−Λur)
上式关于
u
r
\mathbf{u_{r}}
ur求导得到:
− 2 Λ ′ ( q r − Λ u r ) -2 \mathbf{\Lambda}^{\prime}\left(\mathbf{q}_{r}-\mathbf{\Lambda} \mathbf{u}_{r}\right) −2Λ′(qr−Λur)
令其等于0得到:
(
Λ
′
Λ
)
u
r
=
Λ
′
q
r
\left(\mathbf{\Lambda}^{\prime} \mathbf{\Lambda}\right) \mathbf{u}_{r}=\mathbf{\Lambda}^{\prime} \mathbf{q}_{r}
(Λ′Λ)ur=Λ′qr
因此,考虑所有的 r r r,有:
( Λ ′ Λ ) U = Λ ′ Q or U = ( Λ ′ Λ ) − 1 Λ ′ Q \begin{array}{l} \left(\mathbf{\Lambda}^{\prime} \mathbf{\Lambda}\right) \mathbf{U}=\mathbf{\Lambda}^{\prime} \mathbf{Q}\\ \text { or }\\ \mathbf{U}=\left(\mathbf{\Lambda}^{\prime} \mathbf{\Lambda}\right)^{-\mathbf{1}} \mathbf{\Lambda}^{\prime} \mathbf{Q} \end{array} (Λ′Λ)U=Λ′Q or U=(Λ′Λ)−1Λ′Q
事实上,重新尺度化
U
\mathbf{U}
U的列是非常方便的,以至于转换后的因子具有单位方差。这可以通过找对角矩阵
D
\mathbf{D}
D来实现,且它的对角元素是正的,且满足:
D
2
=
diag
[
(
U
′
U
)
−
1
]
\mathbf{D}^{2}=\operatorname{diag}\left[\left(\mathbf{U}^{\prime} \mathbf{U}\right)^{-1}\right]
D2=diag[(U′U)−1]
代替
U
\mathbf{U}
U的变换矩阵为:
M
=
U
D
\mathbf{M}=\mathbf{U D}
M=UD
转换的因子载荷矩阵为:
Λ ∗ = Λ M \mathbf{\Lambda}^{*}=\mathbf{\Lambda} \mathbf{M} Λ∗=ΛM
所以基于上述讨论有以下公式:
Λ
Λ
′
=
Λ
∗
M
−
1
M
′
−
1
Λ
∗
′
=
Λ
∗
(
M
′
M
)
−
1
Λ
∗
′
=
Λ
∗
Φ
Λ
∗
′
\begin{aligned} \mathbf{\Lambda} \mathbf{\Lambda}^{\prime} &=\mathbf{\Lambda}^{*} \mathbf{M}^{-1} \mathbf{M}^{\prime-1} \mathbf{\Lambda}^{* \prime} \\ &=\mathbf{\Lambda}^{*}\left(\mathbf{M}^{\prime} \mathbf{M}\right)^{-1} \mathbf{\Lambda}^{* \prime} \\ &=\mathbf{\Lambda}^{*} \mathbf{\Phi} \mathbf{\Lambda}^{* \prime} \end{aligned}
ΛΛ′=Λ∗M−1M′−1Λ∗′=Λ∗(M′M)−1Λ∗′=Λ∗ΦΛ∗′
其中,
Φ
=
(
M
′
M
)
−
1
=
D
−
1
(
U
′
U
)
−
1
D
−
1
\mathbf{\Phi}=\left(\mathbf{M}^{\prime} \mathbf{M}\right)^{-1}=\mathbf{D}^{-1}\left(\mathbf{U}^{\prime} \mathbf{U}\right)^{-1} \mathbf{D}^{-1}
Φ=(M′M)−1=D−1(U′U)−1D−1
Φ \mathbf{\Phi} Φ是变换矩阵的协方差矩阵。由 D \mathbf{D} D的定义,很明显, Φ \mathbf{\Phi} Φ具有单位对角元素,因此 Φ \mathbf{\Phi} Φ是新因子(被标准化后)的相关矩阵。
3. Transformation of correlated factors using a pattern matrix
4. MATLAB 实现
function [B,T] = rotateFactors(A,varargin)
if nargin > 1
[varargin{:}] = convertStringsToChars(varargin{:});
end
names = {'method' 'normalize' 'reltol' 'maxit'};
dflts = {'varimax' [] [] []};
[method,normalize,reltol,maxit] = internal.stats.parseArgs(names, dflts, varargin{:});
methodNames = {'varimax'};
[method,~] = internal.stats.getParamVal(method,methodNames,'Method');
switch method
case 'varimax'
[B, T] = varimax(A, normalize, reltol, maxit);
end
end
%-----------------------------------------------------------------------
function [B, T] = varimax(A, normalize, reltol, maxit)
% VARIMAX method of orthogonal rotation of FA or PCA loadings.
[d, m] = size(A);
% Defaults to normalized varimax rotation
if nargin < 2 || isempty(normalize), normalize = 'on'; end
if nargin < 3 || isempty(reltol), reltol = sqrt(eps(class(A))); end
if nargin < 4 || isempty(maxit), maxit = 250; end
% Normalize the factor loadings
switch normalize
case {'on',1}
h = sqrt(sum(A.^2, 2));
A = bsxfun(@rdivide, A, h);
case {'off',0}
% A = A;
otherwise
error(message('stats:rotatefactors:BadNormalize'));
end
T = eye(m); % the intial rotation matrix is identity.
R = zeros(m); % the coefficient matrix
converged = false;
for n = 1:maxit
Aold = A;
A = Aold * T;
D = sum(A.^2,1); % the sum of square of the column of B
C = A.^3;
P = Aold'*(C-(1/d).*A.*D);
[U,L] = svd(P'*P);
Rold = R;
R = U.*sqrt(diag(L))'*U';
T = P/R;
if (trace(R)-trace(Rold)< reltol)
B = A;
converged = true;
break;
end
end
if ~converged
error(message('stats:rotatefactors:IterationLimit'));
end
% Unnormalize the rotated loadings
switch normalize
case {'on',1}
B = bsxfun(@times, B, h);
end
end