2026a
# factoran
因子分析
函数库: TyMachineLearning
# 语法
mdl = factoran(X,m)
# 说明
mdl = factoran(X, m)返回包含因子分析模型参数。
# 示例
因子分析
对观测值数据进行因子分析。
该变量图反映了原始特征在公共因子下的载荷情况,以图形的方式展现了变量对公共因子的影响情况,其中载荷矩阵每个载荷是沿着相应因素轴的坐标。前两次考试特征对第二个因素有积极的影响,这表明它们与学生的理科思维能力有一定的关联。但所有变量对于公共因子1来说都是负相关的,可以进一步通过旋转操作得到较为科学合理的解释

加载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- 因子分析模型对象
对象
结果含因子分析模型参数对象
数据类型: 对象