# 读取数据
#P146,例题7.1 52名学生的6科目成绩
library(readr)
library(tidyverse)
eg7_1 <- read_csv("eg6.1.csv")
eg7_1 <- eg7_1 %>% rename(数学 = x1,
                 物理 = x2,
                 化学 = x3,
                 语文 = x4,
                 历史 = x5,
                 英语 = x6)7 FA在R中的实现
本章介绍R中的因子分析。
第1步:评估数据是否适合做因子分析
#计算KMO值,大于0.8适合,小于0.5不适合,适合降维。
library(psych)
KMO(eg7_1)Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = eg7_1)
Overall MSA =  0.8
MSA for each item = 
数学 物理 化学 语文 历史 英语 
0.80 0.83 0.76 0.84 0.81 0.78 
#BARTLETT检验,p值小于0.05,拒绝“原始变量的相关系数矩阵是单位阵(相互独立)”的原假设,适合降维。
library(EFAtools)
BARTLETT(eg7_1)
✔ The Bartlett's test of sphericity was significant at an alpha level of .05.
  These data are probably suitable for factor analysis.
  𝜒²(15) = 205.97, p < .001
第2步:确定提取的因子个数
#计算特征值和特征向量
eg7_1.ev <- eg7_1 %>% cor() %>% 
  eigen()
eg7_1.eveigen() decomposition
$values
[1] 3.7099044 1.2624812 0.4408365 0.2705018 0.1695159 0.1467602
$vectors
           [,1]       [,2]        [,3]        [,4]       [,5]        [,6]
[1,] -0.4120520 -0.3759773  0.21582978  0.78801362 -0.0205822 -0.14450829
[2,] -0.3811779 -0.3567060 -0.80555264 -0.11755209  0.2120360  0.14061074
[3,] -0.3321347 -0.5626165  0.46743533 -0.58763655 -0.0333622 -0.09068468
[4,]  0.4611846 -0.2785231 -0.04426879  0.02783261  0.5990449 -0.59003773
[5,]  0.4205876 -0.4147836 -0.25039004  0.03376008 -0.7384344 -0.20479353
[6,]  0.4301372 -0.4065022  0.14612244  0.13410793  0.2221800  0.74902427
#绘制碎石图
#install.packages("nFactors")
library(nFactors)
eg7_1.ev$values %>% nScree() %>% 
  plotnScree(legend = F)
第3步:估计因子载荷
主成分法 principal component method
无旋转
library(psych)
#未旋转
fa.pc.none <- principal(eg7_1, nfactors = 2,
                       rotate = "none")
fa.pc.nonePrincipal Components Analysis
Call: principal(r = eg7_1, nfactors = 2, rotate = "none")
Standardized loadings (pattern matrix) based upon correlation matrix
       PC1  PC2   h2   u2 com
数学 -0.79 0.42 0.81 0.19 1.5
物理 -0.73 0.40 0.70 0.30 1.5
化学 -0.64 0.63 0.81 0.19 2.0
语文  0.89 0.31 0.89 0.11 1.2
历史  0.81 0.47 0.87 0.13 1.6
英语  0.83 0.46 0.90 0.10 1.6
                       PC1  PC2
SS loadings           3.71 1.26
Proportion Var        0.62 0.21
Cumulative Var        0.62 0.83
Proportion Explained  0.75 0.25
Cumulative Proportion 0.75 1.00
Mean item complexity =  1.6
Test of the hypothesis that 2 components are sufficient.
The root mean square of the residuals (RMSR) is  0.06 
 with the empirical chi square  5.96  with prob <  0.2 
Fit based upon off diagonal values = 0.99
# com的含义
# com : Hoffman's index of complexity for each item,
#该值越接近于1,代表该原始变量主要由某个因子代表。 输出结果解读
因子载荷矩阵(loadings)
- PC1、PC2:第 1、第 2个公共因子在各变量上的标准化载荷(loading)。载荷实际上是变量在该成分方向上的相关系数(或投影系数),绝对值越大表示该成分对该变量解释力越强。注意载荷的正负只是方向的约定(可以同时乘以 −1),不影响结构本质。
 
h2(communalities,共同度)
- 每个变量被这两个公共因子共同解释的方差比例。比如 数学 的 h2 = 0.81,表示两个公共因子可以解释数学 81% 的方差;剩下 19%(u2)是变量的独特方差或噪声。
 
u2(uniqueness,特有方差):等于 1 − h2,表示未被提取成分解释的方差比例。
com(complexity): 衡量某个变量在提取的因子/成分上“分布多少”的指标,越接近 1 表示该变量主要加载在单一因子上(结构简单),越接近因子数 m 表示该变量在所有因子上分布得较均匀(结构复杂)。
SS loadings 就是每个因子的“载荷的平方和”,计算方法是把该因子在所有变量上的载荷取。
Proportion Var 是某个因子解释的“总体方差”的比例。
SS loadings 为 3.71 和 1.26,p = 6(因为用相关矩阵)。
Proportion Var_1 = 3.71 / 6 ≈ 0.6183 → 0.62(输出)
Proportion Var_2 = 1.26 / 6 = 0.21 → 0.21
Cumulative Var after 2 = (3.71+1.26)/6 = 0.83
“Proportion Explained 0.75 0.25” 表示在“提取出的两个公共因子”这部分方差中,PC1 占 75%,PC2 占 25%。
“Cumulative Proportion 0.75 1.00” 表示按顺序累加:前 1 个因子累计占 75%,前 2 个因子(即两个因子一起)占 100%(因为你只看这两个被提取的因子,所以它们合起来占提取方差的全部)。
Mean item complexity = 1.6
- 所有变量复杂度(complexity)的平均值,衡量每个变量在提取的成分上“分布得多均匀”。Mean item complexity1.6(m=2时)表示大多数变量较接近简单结构,但也有一些变量在两个成分上都有明显载荷。
 
“Test of the hypothesis that 2 components are sufficient.”检验:两个成分是否足够,用于评估用两个成分重构相关矩阵是否与观测相关矩阵差异显著。
RMSR = 0.06(残差的均方根)
RMSR 观测相关矩阵与模型重构相关矩阵(通常只看非对角元素,即变量间相关)的残差的均方根:
经验判断:RMSR ≈ 0.05 或更低通常认为拟合很好;0.05–0.08 可接受;>0.10 则拟合较差。但这些阈值不是绝对规则,应结合样本量与其他拟合指标一起看。
empirical chi square = 5.96 with prob < 0.2(经验卡方统计与 p 值)
- 含义:基于残差构造的卡方检验,其原假设 H0:所提取的 2 个成分能在总体上重构观测的相关结构(即模型拟合良好)。检验统计量约为 5.96,对应的 p 值约为 0.2(输出写成 “prob < 0.2”)。结论:p ≈ 0.2(大于常用显著性水平 0.05),因此不能拒绝 H0——没有足够证据表明 2个成分不足以解释相关结构,换句话说模型可以接受。
 
#绘制因子载荷系数图
fa.diagram(fa.pc.none$loadings, digits = 3)
PC2上的载荷的绝对值都小于PC1,所以不绘制指向观测变量的箭头。
varimax正交旋转
#varimax正交旋转
fa.pc.varimax <- principal(eg7_1, nfactors = 2,
                        rotate = "varimax")
fa.pc.varimaxPrincipal Components Analysis
Call: principal(r = eg7_1, nfactors = 2, rotate = "varimax")
Standardized loadings (pattern matrix) based upon correlation matrix
       RC1   RC2   h2   u2 com
数学 -0.32  0.84 0.81 0.19 1.3
物理 -0.29  0.78 0.70 0.30 1.3
化学 -0.07  0.90 0.81 0.19 1.0
语文  0.88 -0.35 0.89 0.11 1.3
历史  0.92 -0.18 0.87 0.13 1.1
英语  0.93 -0.20 0.90 0.10 1.1
                       RC1  RC2
SS loadings           2.66 2.31
Proportion Var        0.44 0.39
Cumulative Var        0.44 0.83
Proportion Explained  0.54 0.46
Cumulative Proportion 0.54 1.00
Mean item complexity =  1.2
Test of the hypothesis that 2 components are sufficient.
The root mean square of the residuals (RMSR) is  0.06 
 with the empirical chi square  5.96  with prob <  0.2 
Fit based upon off diagonal values = 0.99
#按因子载荷系数降序排列
print(fa.pc.varimax$loadings, digits = 3, cutoff = 0.5,sort = T)
Loadings:
     RC1    RC2   
语文  0.876       
历史  0.917       
英语  0.925       
数学         0.839
物理         0.784
化学         0.897
                 RC1   RC2
SS loadings    2.661 2.312
Proportion Var 0.443 0.385
Cumulative Var 0.443 0.829
#绘制因子载荷系数图
fa.diagram(fa.pc.varimax$loadings, digits = 3)
promax正交旋转
#promax斜交旋转
fa.pc.promax <- principal(eg7_1, nfactors = 2,
                           rotate = "promax")
fa.pc.promaxPrincipal Components Analysis
Call: principal(r = eg7_1, nfactors = 2, rotate = "promax")
Standardized loadings (pattern matrix) based upon correlation matrix
       RC1   RC2   h2   u2 com
数学 -0.12  0.83 0.81 0.19 1.0
物理 -0.10  0.78 0.70 0.30 1.0
化学  0.18  0.97 0.81 0.19 1.1
语文  0.87 -0.13 0.89 0.11 1.0
历史  0.97  0.07 0.87 0.13 1.0
英语  0.97  0.05 0.90 0.10 1.0
                       RC1  RC2
SS loadings           2.70 2.27
Proportion Var        0.45 0.38
Cumulative Var        0.45 0.83
Proportion Explained  0.54 0.46
Cumulative Proportion 0.54 1.00
 With component correlations of 
      RC1   RC2
RC1  1.00 -0.49
RC2 -0.49  1.00
Mean item complexity =  1
Test of the hypothesis that 2 components are sufficient.
The root mean square of the residuals (RMSR) is  0.06 
 with the empirical chi square  5.96  with prob <  0.2 
Fit based upon off diagonal values = 0.99
#按因子载荷系数降序排列
print(fa.pc.promax$loadings, digits = 3, cutoff = 0.5,sort = T)
Loadings:
     RC1    RC2   
语文  0.874       
历史  0.967       
英语  0.971       
数学         0.834
物理         0.782
化学         0.972
                 RC1   RC2
SS loadings    2.699 2.274
Proportion Var 0.450 0.379
Cumulative Var 0.450 0.829
fa.diagram(fa.pc.promax$loadings, digits = 3)
极大似然法 Maximum Likelihood
#方法一:psych::fa
fa.ml.none1 <- fa(eg7_1, 
                 nfactors = 2, 
                 fm = "ml",
                 rotate = "none")
fa.ml.none1Factor Analysis using method =  ml
Call: fa(r = eg7_1, nfactors = 2, rotate = "none", fm = "ml")
Standardized loadings (pattern matrix) based upon correlation matrix
       ML1  ML2   h2   u2 com
数学 -0.68 0.56 0.77 0.23 1.9
物理 -0.60 0.43 0.54 0.46 1.8
化学 -0.49 0.66 0.67 0.33 1.8
语文  0.92 0.10 0.85 0.15 1.0
历史  0.86 0.24 0.79 0.21 1.2
英语  0.88 0.27 0.85 0.15 1.2
                       ML1  ML2
SS loadings           3.40 1.07
Proportion Var        0.57 0.18
Cumulative Var        0.57 0.75
Proportion Explained  0.76 0.24
Cumulative Proportion 0.76 1.00
Mean item complexity =  1.5
Test of the hypothesis that 2 factors are sufficient.
df null model =  15  with the objective function =  4.28 with Chi Square =  205.97
df of  the model are 4  and the objective function was  0.08 
The root mean square of the residuals (RMSR) is  0.02 
The df corrected root mean square of the residuals is  0.04 
The harmonic n.obs is  52 with the empirical chi square  0.62  with prob <  0.96 
The total n.obs was  52  with Likelihood Chi Square =  3.64  with prob <  0.46 
Tucker Lewis Index of factoring reliability =  1.007
RMSEA index =  0  and the 90 % confidence intervals are  0 0.203
BIC =  -12.17
Fit based upon off diagonal values = 1
Measures of factor score adequacy             
                                                   ML1  ML2
Correlation of (regression) scores with factors   0.97 0.89
Multiple R square of scores with factors          0.95 0.80
Minimum correlation of possible factor scores     0.89 0.59
#方法二:stats::factanal
fa.ml.none2 <- factanal(eg7_1, 
                 factors = 2,
                 rotation = "none")
fa.ml.none2
Call:
factanal(x = eg7_1, factors = 2, rotation = "none")
Uniquenesses:
 数学  物理  化学  语文  历史  英语 
0.228 0.459 0.333 0.148 0.210 0.150 
Loadings:
     Factor1 Factor2
数学 -0.676   0.562 
物理 -0.599   0.427 
化学 -0.487   0.656 
语文  0.917   0.104 
历史  0.856   0.239 
英语  0.883   0.266 
               Factor1 Factor2
SS loadings      3.404   1.068
Proportion Var   0.567   0.178
Cumulative Var   0.567   0.745
Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 3.64 on 4 degrees of freedom.
The p-value is 0.457 
主因子法 principal factor
varimax旋转
#函数psych::fa,varimax旋转
library(psych)
fa.pa.varimax <- fa(eg7_1, 
                  nfactors = 2, 
                  fm = "pa",
                  rotate = "varimax")
fa.pa.varimaxFactor Analysis using method =  pa
Call: fa(r = eg7_1, nfactors = 2, rotate = "varimax", fm = "pa")
Standardized loadings (pattern matrix) based upon correlation matrix
       PA1   PA2   h2   u2 com
数学 -0.32  0.82 0.77 0.23 1.3
物理 -0.31  0.67 0.54 0.46 1.4
化学 -0.11  0.81 0.66 0.34 1.0
语文  0.85 -0.36 0.85 0.15 1.3
历史  0.86 -0.20 0.78 0.22 1.1
英语  0.90 -0.20 0.86 0.14 1.1
                       PA1  PA2
SS loadings           2.49 1.98
Proportion Var        0.41 0.33
Cumulative Var        0.41 0.74
Proportion Explained  0.56 0.44
Cumulative Proportion 0.56 1.00
Mean item complexity =  1.2
Test of the hypothesis that 2 factors are sufficient.
df null model =  15  with the objective function =  4.28 with Chi Square =  205.97
df of  the model are 4  and the objective function was  0.08 
The root mean square of the residuals (RMSR) is  0.02 
The df corrected root mean square of the residuals is  0.04 
The harmonic n.obs is  52 with the empirical chi square  0.58  with prob <  0.96 
The total n.obs was  52  with Likelihood Chi Square =  3.7  with prob <  0.45 
Tucker Lewis Index of factoring reliability =  1.006
RMSEA index =  0  and the 90 % confidence intervals are  0 0.204
BIC =  -12.1
Fit based upon off diagonal values = 1
Measures of factor score adequacy             
                                                   PA1  PA2
Correlation of (regression) scores with factors   0.95 0.91
Multiple R square of scores with factors          0.91 0.83
Minimum correlation of possible factor scores     0.82 0.66
quartimax旋转
#函数psych::fa,quartimax旋转
library(psych)
fa.pa.quartimax <- fa(eg7_1, 
                    nfactors = 2, 
                    fm = "pa",
                    rotate = "quartimax")
fa.pa.quartimaxFactor Analysis using method =  pa
Call: fa(r = eg7_1, nfactors = 2, rotate = "quartimax", fm = "pa")
Standardized loadings (pattern matrix) based upon correlation matrix
       PA1   PA2   h2   u2 com
数学 -0.42  0.77 0.77 0.23 1.5
物理 -0.39  0.63 0.54 0.46 1.7
化学 -0.21  0.79 0.66 0.34 1.1
语文  0.89 -0.25 0.85 0.15 1.2
历史  0.88 -0.09 0.78 0.22 1.0
英语  0.92 -0.09 0.86 0.14 1.0
                       PA1  PA2
SS loadings           2.79 1.68
Proportion Var        0.46 0.28
Cumulative Var        0.46 0.74
Proportion Explained  0.62 0.38
Cumulative Proportion 0.62 1.00
Mean item complexity =  1.3
Test of the hypothesis that 2 factors are sufficient.
df null model =  15  with the objective function =  4.28 with Chi Square =  205.97
df of  the model are 4  and the objective function was  0.08 
The root mean square of the residuals (RMSR) is  0.02 
The df corrected root mean square of the residuals is  0.04 
The harmonic n.obs is  52 with the empirical chi square  0.58  with prob <  0.96 
The total n.obs was  52  with Likelihood Chi Square =  3.7  with prob <  0.45 
Tucker Lewis Index of factoring reliability =  1.006
RMSEA index =  0  and the 90 % confidence intervals are  0 0.204
BIC =  -12.1
Fit based upon off diagonal values = 1
Measures of factor score adequacy             
                                                   PA1  PA2
Correlation of (regression) scores with factors   0.96 0.90
Multiple R square of scores with factors          0.93 0.82
Minimum correlation of possible factor scores     0.85 0.63
主成分分析中的主成分载荷与因子分析中的主成分估计方法下的因子载荷的区别
eg7_1.pr <- prcomp(eg7_1, scale = TRUE)
eg7_1.pr$rotation # 查看主成分载荷矩阵            PC1       PC2         PC3         PC4        PC5         PC6
数学  0.4120520 0.3759773  0.21582978 -0.78801362 -0.0205822  0.14450829
物理  0.3811779 0.3567060 -0.80555264  0.11755209  0.2120360 -0.14061074
化学  0.3321347 0.5626165  0.46743533  0.58763655 -0.0333622  0.09068468
语文 -0.4611846 0.2785231 -0.04426879 -0.02783261  0.5990449  0.59003773
历史 -0.4205876 0.4147836 -0.25039004 -0.03376008 -0.7384344  0.20479353
英语 -0.4301372 0.4065022  0.14612244 -0.13410793  0.2221800 -0.74902427
#求相关系数矩阵的特征值和特征向量
pc <- eg7_1 %>% cor %>% eigen() %>% .$vectors # 查看主成分载荷矩阵
eigen <- eg7_1 %>% cor %>% eigen() %>% .$values # 查看特征值sqrt(eigen[1]) * pc[,1] # 计算第1个公共因子载荷[1] -0.7936579 -0.7341911 -0.6397283  0.8882928  0.8100985  0.8284920
eg7_1.pc <- eg7_1 %>% prcomp(scale = TRUE)
eg7_1.pc$rotation[,1] # 查看第1个主成分载荷      数学       物理       化学       语文       历史       英语 
 0.4120520  0.3811779  0.3321347 -0.4611846 -0.4205876 -0.4301372 
#因子分析中的主成分法
fa.pc.none <- psych::principal(eg7_1, nfactors = 2,
                       rotate = "none")
fa.pc.none$loadings[,1] # 查看第1个因子公共因子载荷      数学       物理       化学       语文       历史       英语 
-0.7936579 -0.7341911 -0.6397283  0.8882928  0.8100985  0.8284920 
因子分析面临的决策:提取几个因子?因子载荷估计方法?旋转方法?
提取的因子个数 特征值大于1 因子的累积贡献达到70%-80%以上
因子载荷估计方法 主成分法 principal() 极大似然法 fa() 主轴因子法 fa()
因子旋转方法 正交旋转:varimax, quartimax 因子相互独立的 斜交旋转:oblimin, promax 因子之间是相关的
第4步 可视化
因子载荷系数图
#主成分法 Principal Component Method无旋转
fa.pc.none <- principal(eg7_1, 
                        nfactors = 2,
                        rotate = "none")
fa.pc.none$loadings 
Loadings:
     PC1    PC2   
数学 -0.794  0.422
物理 -0.734  0.401
化学 -0.640  0.632
语文  0.888  0.313
历史  0.810  0.466
英语  0.828  0.457
                 PC1   PC2
SS loadings    3.710 1.262
Proportion Var 0.618 0.210
Cumulative Var 0.618 0.829
fa.diagram(fa.pc.none$loadings, 
           digits = 3, 
           rsize = 0.8)
#主成分法 Principal Component Method 正交旋转varimax
fa.pc.varimax <- principal(eg7_1, 
                        nfactors = 2,
                        rotate = "varimax")
fa.pc.varimax$loadings %>% print(digits = 3,
                                 cut = 0.5,
                                 sort = TRUE)
Loadings:
     RC1    RC2   
语文  0.876       
历史  0.917       
英语  0.925       
数学         0.839
物理         0.784
化学         0.897
                 RC1   RC2
SS loadings    2.661 2.312
Proportion Var 0.443 0.385
Cumulative Var 0.443 0.829
fa.diagram(fa.pc.varimax$loadings, 
           digits = 3, 
           rsize = 0.5)
colnames(fa.pc.varimax$loadings) <- c("文科", "理科")#maximum likelihood 极大似然 斜交旋转promax
fa.ml.promax <- fa(eg7_1, 
                   nfactors = 2, 
                   fm = "ml",
                   rotate = "promax")
fa.ml.promax$loadings %>% print(digits = 3,
                                 cut = 0.5,
                                 sort = TRUE)
Loadings:
     ML1    ML2   
语文  0.847       
历史  0.911       
英语  0.956       
数学         0.833
物理         0.656
化学         0.890
                 ML1   ML2
SS loadings    2.510 1.940
Proportion Var 0.418 0.323
Cumulative Var 0.418 0.742
colnames(fa.ml.promax$loadings) <- c("文科", "理科")
fa.ml.promax %>% fa.diagram(rsize = 0.5,
                            digits = 3)
因子载荷和因子得分图
#主成分法 Principal Component Method无旋转
fa.pc.none <- principal(eg7_1, 
                        nfactors = 2,
                        rotate = "none")
biplot(fa.pc.none,
       main = "Principal Component, no rotation")
#主成分法 Principal Component 正交旋转varimax
fa.pc.varimax <- principal(eg7_1, 
                        nfactors = 2,
                        rotate = "varimax")
biplot(fa.pc.varimax,
       col = c(5,6),
       main = "Principal Component, Varimax")
#查看个案在原始变量的观测值与因子得分的关系
fa.pc.varimax$scores %>% cbind(eg7_1,.) %>%
                         arrange(desc(RC1))   数学 物理 化学 语文 历史 英语         RC1         RC2
1    52   62   65  100   96  100  2.37146283 -0.89236422
2    64   61   49  100   99   95  2.14453514 -1.04994850
3    72   74   75   88   91   86  1.60312684  0.27088208
4    72   67   61   92   92   88  1.60089485 -0.36560636
5    86   78   92   87   87   77  1.39661149  1.34087672
6    68   85   70   84   89   86  1.36280518  0.20076975
7    72   68   77   83   92   79  1.24824003  0.09893997
8    68   74   70   87   87   83  1.19588953 -0.15308336
9    69   56   67   75   94   80  0.94800759 -0.66986805
10   87   84  100   74   81   76  0.89505814  1.69379969
11   81   90   79   73   85   80  0.88689495  0.98857294
12   69   72   79   89   82   73  0.77761389 -0.03745268
13   65   61   72   84   81   79  0.66036380 -0.68718464
14   72   90   73   76   80   79  0.57832578  0.35968112
15   82   70   83   68   77   85  0.57503687  0.56148305
16   62   67   83   71   85   77  0.57341472 -0.24629083
17   56   48   61   85   82   80  0.50709778 -1.73750306
18   59   75   81   82   77   73  0.35974386 -0.35186206
19   73   80   64   75   80   78  0.34822485 -0.20507234
20   62   45   67   78   76   82  0.24184553 -1.45908639
21   91   85  100   70   65   76  0.12266043  1.63080706
22   70   72   56   74   82   74  0.09089471 -0.83832115
23   77   89   80   73   75   70  0.06168574  0.58222335
24   87   86   88   70   73   70  0.05095722  1.12576308
25   87   98   87   68   78   64  0.02133066  1.40930087
26   83   71   81   63   77   73 -0.03532405  0.39989888
27   85   91   95   63   76   66 -0.04997962  1.41175077
28   74   74   84   61   80   69 -0.10599059  0.23835843
29   64   79   64   72   76   74 -0.11143434 -0.68414192
30   71   58   45   83   77   73 -0.13213293 -1.62997362
31   60   51   60   78   74   76 -0.15843575 -1.72144006
32   69   64   60   68   74   80 -0.16973580 -1.00805396
33   91   74   97   62   71   66 -0.30355745  1.17630966
34   79   73   69   65   73   73 -0.33882707 -0.17510138
35   78   68   52   75   74   66 -0.56266669 -0.99490230
36   90   78   78   59   72   66 -0.59997498  0.58064466
37   78   84   75   62   71   64 -0.72215827  0.15234085
38   88  100   85   49   71   66 -0.72960966  1.30734862
39   66   61   77   62   73   64 -0.77109905 -0.81988047
40   80   98   83   58   66   66 -0.78496127  0.83027677
41   67   83   65   68   74   60 -0.79109191 -0.63366342
42   77   90   80   68   66   60 -0.83830982  0.34763562
43   84   67   75   60   70   63 -0.89636993 -0.11048745
44   99  100   99   53   63   60 -0.93655446  2.04025135
45   77   77   76   64   70   55 -1.07567973 -0.15571837
46   76   61   73   63   60   70 -1.07908021 -0.69822814
47   90   83   91   58   60   59 -1.20571398  0.91632299
48   86   94   97   51   63   55 -1.30641265  1.25308371
49   67   63   49   65   67   57 -1.60122590 -1.88323054
50   67   84   53   58   66   56 -1.72435369 -1.21908241
51   66   71   67   52   65   57 -1.75198210 -1.12791008
52   83  100   79   41   67   50 -1.84006051  0.63813576
#极大似然法, 斜交promax旋转  
fa.ml.promax <- fa(eg7_1, 
                   nfactors = 2, 
                   fm = "ml",
                   rotate = "promax")
biplot(fa.ml.promax,
       col = c(3,4),
       main = "Maximum Likelihood, Promax")