2026a

# factoran


因子分析

函数库: TyMachineLearning

# 语法

mdl = factoran(X,m)

# 说明

mdl = factoran(X, m)返回包含因子分析模型参数。

# 示例

因子分析
对观测值数据进行因子分析。

加载examgrades数据集。

using TyMachineLearning
using CSV
using DataFrames
using TyPlot 
file = joinpath(pkgdir(TyMachineLearning), "data/DimReduction/examgrades.csv")
factordata = CSV.read(file, DataFrame; header=false)

先输入一个公共因子, 对输入数据X进行因子分析。

x = Array(factordata)
x1 = x'
res1 = factoran(x1, 1)
5×1 Matrix{Float64}:
  1.8411342008802452
  0.14514524406848847
 -0.5850961855056228
 -1.0641549702627833
 -0.3370282891803342

从估计的负荷可以看到,这个模型中的一个共同因子对所有五个变量都有很大的负权重

若将因子数设置为2,我们可以得到一个 的载荷矩阵

查看初始因子载荷矩阵:

res2 = factoran(x1, 2)
5×2 Matrix{Float64}:
  1.91157      0.554059
  0.00105833  -1.34318
 -0.611944    -0.254552
 -0.900795     1.58936
 -0.399888    -0.545693

# 根据两个公共因子绘制因子载荷图

x = Array(factordata)
x1 = x'
mm = factoran(x1, 2)
a = zeros(1, 5)
t1 = mm[:, 1]'
t2 = mm[:, 2]'
(x, y) = ([a; t1], [a; t2])
figure()
hold("on")
TyPlot.scatter(mm[:, 1], mm[:, 2])
i = 1:5
str = [string(j) for j in 1:5]
TyPlot.plot([0, 0], [-1, 1]; color="black")
TyPlot.plot([-1, 1], [0, 0]; color="black")
TyPlot.plot(x, y; color="r")
xlabel("Factor 1")
ylabel("Factor 2")
hold("off")
该变量图反映了原始特征在公共因子下的载荷情况,以图形的方式展现了变量对公共因子的影响情况,其中载荷矩阵每个载荷是沿着相应因素轴的坐标。前两次考试特征对第二个因素有积极的影响,这表明它们与学生的理科思维能力有一定的关联。但所有变量对于公共因子1来说都是负相关的,可以进一步通过旋转操作得到较为科学合理的解释

# 通过因子旋转增加公因子的可解释性

建立因子分析模型的目的不仅是要找出公因子以及对变量进行分组,更重要的是要知道每个公因子的意义,以便对实际问题做出科学分析。得到因子模型后,其中的公共因子不一定能反映问题的实质特征,为了更好的解释每一个公共因子的实际意义减少解释的主观性,可以通过因子旋转达到目的。 因子旋转即对因子载荷矩阵A,用一个正交矩阵T右乘A实现对因子载荷矩阵的旋转(一次正交变换即对应坐标系的一次旋转),旋转后因子载荷矩阵结构简化,更容易对公因子进行解释。

rr = rotatefactors(x1, 2)
5×2 Matrix{Float64}:
  1.98617   -0.127299
 -0.454677  -1.26388
 -0.66201   -0.0318535
 -0.308183   1.8007
 -0.5613    -0.377669

从旋转后的因子载荷矩阵可以看出,前两次的考试特征对第2个公共因子有较大影响,后三次的考试特征对第1个公共因子有较大影响。又因为前两次都是数学考试,第三四次是语文考试,因此可以将第1个公共因子命名为“文学思维能力”,第2个公共因子命名为“理性思维能力”。这与该样本数据集的构成相符合,具有一定的科学解释意义,说明旋转后的公共因子相较于前面更有可解释性。

下面将绘制变量特征在旋转后的公共因子的载荷情况:

rr = rotatefactors(x1, 2)
a = zeros(1, 5)
t1 = rr[:, 1]'
t2 = rr[:, 2]'
(x, y) = ([a; t1], [a; t2])
figure()
hold("on")
TyPlot.scatter(rr[:, 1], rr[:, 2])
i = 1:5
str = [string(j) for j in 1:5]
# TyPlot.text(mm[i, 1], (mm[i, 2] .+ 0.1); str)
# TyPlot.annotation([(mm[i, 1], mm[i, 2] + 0.1, TyPlot.text(string(i))) for i in 1:5])
TyPlot.plot([0, 0], [-1, 1]; color="black")
TyPlot.plot([-1, 1], [0, 0]; color="black")
TyPlot.plot(x, y; color="r")
xlabel("Factor 1")
ylabel("Factor 2")
hold("off")

# 输入参数

X-观测值
数值矩阵
examgrades数据集。

数据类型: Matrix

m-选择公共因子数量
数值
选择公共因子数量

数据类型: Int64

# 输出参数

mdl- 因子分析模型对象
对象
结果含因子分析模型参数对象

数据类型: 对象