因子分析原理及实现

因子分析模型

主成分分析在降维中主要是对原始变量进行线性组合,如 Y = AX , X ∈ R n × p \textbf Y =\textbf {AX},X\in \mathbf R^{n\times p} Y=AXXRn×p首先对原始数据进行标准化后取协方差矩阵所得的m个(或者说成m维数)较大的特征值 λ i \lambda_i λi,且满足 ∑ i m λ i p > 80 % \frac{\sum\limits_i^m \lambda_i}{p} > 80\% pimλi>80%(通常意义下),则可以放心的将p维的数据降维成m维的,这在后续数据的处理中可以减少计算量及方便可视化。但主成分只涉及一般的变量变换,并且对降维后的数据进行解释较为困难。

正交因子模型

设数据中的p个变量可以归功于m个因素(或m件事被分为有p个人做)
x i = u i + a i 1 f 1 + a i 2 f 2 + ⋯ + a i m f m + ε i x_i = u_i+a_{i1}f_1+a_{i2} f_2 +\cdots+a_{im}f_m+\varepsilon_i xi=ui+ai1f1+ai2f2++aimfm+εi
采用矩阵的形式表示, x = ( x 1 , ⋯   , x p ) T \mathbf x=(x_1,\cdots,x_p)^T x=(x1,,xp)T,公共因子 f = ( f 1 , ⋯   , f m ) T \mathbf f=(f_1,\cdots,f_m)^T f=(f1,,fm)T,特殊因子 ε = ( ε 1 , ⋯   , ε p ) T \mathbf \varepsilon=(\varepsilon_1,\cdots,\varepsilon_p)^T ε=(ε1,,εp)T;在处理前对数据进行标准化后变量均值 u i = 0 ∀ i = 1 , 2 , ⋯   , p u_i =0 \quad \forall i=1,2,\cdots ,p ui=0i=1,2,,p, A = ( a i j ) A=(a_{ij}) A=(aij)称为因子载荷矩阵。故可以表示为
x = A f + ε \mathbf x= A \mathbf f+\mathbf \varepsilon x=Af+ε
下面我们作几个假设,并且可以说是显然的。

  1. 公共因子 f f f与特殊因子 ε \varepsilon ε互不相关(否则 ε \varepsilon ε是可以被公共因子所解释)。
  2. 公共因子之间相互无关
    不失一般性可以假设:
  3. E ( f ) = 0 , E ( ε ) = 0 , 及 V a r ( f i ) = 1 E(f)=0,\quad E(\varepsilon)=0,\quad \text{及} Var(f_i)=1 E(f)=0,E(ε)=0,Var(fi)=1

两边同时求方差可以得 Σ = A A T + D \Sigma = AA^T+D Σ=AAT+D,其中D=Var( ε \varepsilon ε)是对角阵.

因子载荷矩阵的性质

  1. 每一个元素 a i j a_{ij} aij表示 x i x_i xi f i f_i fi之间的相关系数
    Proof
    C o v ( x , f ) = C o v ( A f + ε ) = A V a r ( f ) + C o v ( ε , f ) = A ρ ( x i , f j ) = C o v ( x i , f j ) V a r ( x i ) V a r ( f j ) = a i j Cov(x,f)=Cov(Af+\varepsilon)=AVar(f)+Cov(\varepsilon,f)=A\\ \rho(x_i,f_j)=\frac{Cov(x_i,f_j)}{\sqrt{Var(x_i)Var(f_j)}}=a_{ij} Cov(x,f)=Cov(Af+ε)=AVar(f)+Cov(ε,f)=Aρ(xi,fj)=Var(xi)Var(fj) Cov(xi,fj)=aij
  2. A 的行元素的平方和表现为公共因子对 x i x_i xi的影响
    Proof
    V a r ( x i ) = a i 1 2 V a r ( f 1 ) + ⋯ + a i , m 2 V a r ( f m ) + V ( ε ) = ∑ j = 1 m a i j 2 + σ i 2 = h i 2 + σ i 2 = 1 Var(x_i)=a_{i1}^2Var(f_1)+\cdots + a_{i,m}^2Var(f_m)+V(\varepsilon)\\ =\sum_{j=1}^m a_{ij}^2 + \sigma_i^2\\ =h_i^2 +\sigma_i^2\\ =1 Var(xi)=ai12Var(f1)++ai,m2Var(fm)+V(ε)=j=1maij2+σi2=hi2+σi2=1
  3. A的列元素平方和表现为公共因子 f j f_j fj x 1 , ⋯   , x p x_1,\cdots,x_p x1,,xp的影响,也是对比公共因子重要性的一个标准.
  4. A的元素平方和为 f 1 , ⋯   , f m f_1,\cdots,f_m f1,,fm对总方差的累计贡献

迭代求解(主因子法)

初始化特殊方差 σ i 2 \sigma_i^2 σi2,计算 Σ − D \Sigma -D ΣD的特征值 λ 1 , ⋯   , λ m \lambda_1,\cdots,\lambda_m λ1,,λm和线性无关的特征向量 t 1 , ⋯   , t m t_1,\cdots,t_m t1,,tm,则前m个较大的组成A的主因子分解
A ^ = ( λ 1 t 1 , ⋯   , λ m t m ) \hat{A}=(\sqrt{\lambda_1}t_1,\cdots,\sqrt{\lambda_m}t_m) A^=(λ1 t1,,λm tm)
再计算特殊因子方差 σ i 2 = 1 − h i 2 \sigma_i^2 = 1- h_i^2 σi2=1hi2,代入上式迭代知道所求主因子稳定即可.

因子旋转

当主因子仍不好解释时采用,正交因子旋转是对公共因子作用一个正交旋转变换, f ∗ = T T f f^*=T^Tf f=TTf,载荷矩阵相应的变为 A ∗ = A T A^* =AT A=AT。可以发现正交旋变换后结构不变。

Python程序实现

以一个简单的例子展现python中factor_analyzer库中的因子分析

import pandas as pd
import numpy as np
from pandas import DataFrame,Series
from factor_analyzer import FactorAnalyzer

datafile = u'f:\\Factor\data.xls'
data = pd.read_excel(datafile)
data = data.fillna(0)#用0填充空值
 
fa = FactorAnalyzer()
fa.analyze(data, 5, rotation=None)#固定公共因子个数为5个
print("公因子方差:\n", fa.get_communalities())#公因子方差
print("\n成分矩阵:\n", fa.loadings)#成分矩阵
var = fa.get_factor_variance()#给出贡献率
print("\n解释的总方差(即贡献率):\n", var)
 
fa_score = fa.get_scores(data)#因子得分
fa_score.head()
 
#将各因子乘上他们的贡献率除以总的贡献率,得到因子得分中间值
a = (fa.get_scores(data)*var.values[1])/var.values[-1][-1]
 
#将各因子得分中间值相加,得到综合得分
a['score'] = a.apply(lambda x: x.sum(), axis=1)
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
因子分析是一种多变量统计方法,旨在找到多个观测变量之间的共同因素。它的基本思想是将多个观测变量表示为少数几个潜在因素的线性组合,通过这种方式来简化数据集并揭示变量之间的关系。 在因子分析中,我们假设每个观测变量都与若干个潜在因素有关,每个潜在因素又对应着一组权重,这些权重用来表示潜在因素对观测变量的影响。因子分析的目标是找到这些潜在因素和权重,使得它们能够最好地解释观测变量之间的关系。 下面是因子分析算法的一般步骤: 1. 收集数据并确定需要进行因子分析的变量。 2. 确定因子数量,即要分析的潜在因素的数量。 3. 选择合适的因子提取方法,如主成分分析法或最大似然估计法。 4. 计算因子载荷,即每个变量与每个因子之间的关系强度。 5. 旋转因子载荷,以更好地解释变量之间的关系。 6. 解释因子,确定每个因子代表的含义。 7. 计算因子得分,以便将数据转换为因子空间中的坐标。 下面是使用Python实现因子分析的示例代码: ```python import pandas as pd from factor_analyzer import FactorAnalyzer # 读取数据 data = pd.read_csv('data.csv') # 创建因子分析对象,并指定因子数量 fa = FactorAnalyzer(n_factors=3, rotation='varimax') # 使用最大似然估计方法进行因子提取 fa.fit(data) # 显示因子载荷 print(fa.loadings_) # 显示因子方差贡献率 print(fa.get_factor_variance()) # 显示因子得分 print(fa.transform(data)) ``` 在上面的代码中,我们使用了`pandas`库来读取数据,然后使用`factor_analyzer`库中的`FactorAnalyzer`类来进行因子分析。我们指定了要分析因子数量为3,并使用了最大似然估计方法进行因子提取。最后,我们显示了因子载荷、因子方差贡献率和因子得分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值