旋转后SPSS和Stata中的主成分分析结果大相径庭

机器算法验证 主成分分析 spss 状态 因子分析 因子轮换
2022-03-15 14:06:06

对于我的博士论文,我必须进行主成分分析(PCA)。我没有发现在 Stata 中太难,并且很高兴解释结果(我知道因子分析和主成分分析之间存在差异)。但是,我与使用 SPSS 的同事讨论过,所以我也将我的数据(从 Excel)导入到 SPSS 中,并在那里执行了 PCA。

令我震惊的是,结果与我的 Stata 结果(轮换后)大不相同。甚至没有接近它。

怎么可能?(请参阅下面的 Stata PCA 和 SPSS PCA 代码和结果)。

对我来说甚至更陌生:当我factor [varnames], pcf在 Stata 中进行(主成分因子)时,我收到(几乎)与 SPSS 中的 PCA 相同的结果(请参阅下面的 Stata 主成分因子)。

什么是主成分因子?PCA和因子分析的混合体?

我很困惑。如果人们在期刊上报告做过 PCA:那么我应该问,用 SPSS 还是 Stata?谁能给我解释一下?

状态:

pca bewert_sfu_a bewert_sfu_b bewert_sfu_c bewert_sfu_d bewert_sfu_e bewert_sfu_f bewert_sfu_g bewert_sfu_h bewert_sfu_i bewert_sfu_j bewert_sfu_k bewert_sfu_l, mineigen(1)

主成分/相关
obs 数量 = 158 补偿数量。= 3 轨迹 = 12 旋转:(未旋转 = 主要)Rho = 0.5382

--------------------------------------------------------------------------
   Component |   Eigenvalue   Difference         Proportion   Cumulative
-------------+------------------------------------------------------------
       Comp1 |       3.8723      2.46548             0.3227       0.3227
       Comp2 |      1.40682      .227718             0.1172       0.4399
       Comp3 |       1.1791      .206742             0.0983       0.5382
       Comp4 |      .972359      .169164             0.0810       0.6192
       Comp5 |      .803195      .050871             0.0669       0.6861
       Comp6 |      .752324     .0953662             0.0627       0.7488
       Comp7 |      .656957     .0137592             0.0547       0.8036
       Comp8 |      .643198      .135894             0.0536       0.8572
       Comp9 |      .507304     .0435925             0.0423       0.8995
      Comp10 |      .463711     .0749052             0.0386       0.9381
      Comp11 |      .388806     .0348752             0.0324       0.9705
      Comp12 |      .353931            .             0.0295       1.0000
--------------------------------------------------------------------------

主成分(特征向量)

----------------------------------------------------------
    Variable |    Comp1     Comp2     Comp3 | Unexplained 
-------------+------------------------------+-------------
bewert_sfu_a |   0.2700    0.3901   -0.1477 |       .4779 
bewert_sfu_b |   0.3298    0.2303   -0.4027 |       .3129 
bewert_sfu_c |  -0.3046    0.3149    0.1773 |       .4642 
bewert_sfu_d |   0.3489    0.1910    0.0700 |       .4715 
bewert_sfu_e |   0.3342    0.2067    0.2720 |       .4202 
bewert_sfu_f |  -0.2001    0.4561   -0.1587 |       .5227 
bewert_sfu_g |   0.3057    0.3128    0.1531 |       .4728 
bewert_sfu_h |  -0.3611    0.2180    0.2913 |        .328 
bewert_sfu_i |   0.2352   -0.2211    0.3662 |       .5588 
bewert_sfu_j |  -0.1556    0.3894    0.4578 |       .4457 
bewert_sfu_k |   0.3239    0.0525    0.0754 |       .5832 
bewert_sfu_l |   0.2091   -0.2445    0.4720 |       .4839 
----------------------------------------------------------

rotate, varimax kaiser

主成分/相关 obs 数量 = 158 补偿数量。= 3 轨迹 = 12 旋转:正交 varimax (Kaiser on) Rho = 0.5382

--------------------------------------------------------------------------
   Component |     Variance   Difference         Proportion   Cumulative
-------------+------------------------------------------------------------
       Comp1 |      2.95242      .867357             0.2460       0.2460
       Comp2 |      2.08506       .66433             0.1738       0.4198
       Comp3 |      1.42073            .             0.1184       0.5382
--------------------------------------------------------------------------

旋转组件

----------------------------------------------------------
    Variable |    Comp1     Comp2     Comp3 | Unexplained 
-------------+------------------------------+-------------
bewert_sfu_a |   0.4076   -0.0266   -0.2829 |       .4779 
bewert_sfu_b |   0.3116   -0.3063   -0.3648 |       .3129 
bewert_sfu_c |  -0.0255    0.4536   -0.1302 |       .4642 
bewert_sfu_d |   0.4007   -0.0456    0.0218 |       .4715 
bewert_sfu_e |   0.4392    0.0965    0.1618 |       .4202 
bewert_sfu_f |   0.0698    0.2650   -0.4451 |       .5227 
bewert_sfu_g |   0.4531    0.0973    0.0005 |       .4728 
bewert_sfu_h |  -0.1026    0.5023    0.0011 |        .328 
bewert_sfu_i |   0.1350   -0.0261    0.4684 |       .5588 
bewert_sfu_j |   0.1927    0.5856    0.0731 |       .4457 
bewert_sfu_k |   0.3026   -0.1048    0.1037 |       .5832 
bewert_sfu_l |   0.1224    0.0410    0.5564 |       .4839 
----------------------------------------------------------

组件旋转矩阵

--------------------------------------------
             |    Comp1     Comp2     Comp3 
-------------+------------------------------
       Comp1 |   0.7942   -0.5573    0.2422 
       Comp2 |   0.5724    0.5523   -0.6061 
       Comp3 |   0.2040    0.6200    0.7576 
--------------------------------------------

SPSS代码:

FACTOR
/VARIABLES bewert_sfu_a bewert_sfu_b bewert_sfu_c bewert_sfu_d  bewert_sfu_e bewert_sfu_f bewert_sfu_g bewert_sfu_h bewert_sfu_i bewert_sfu_j bewert_sfu_k bewert_sfu_l
/MISSING LISTWISE
/ANALYSIS bewert_sfu_a bewert_sfu_b bewert_sfu_c bewert_sfu_d bewert_sfu_e bewert_sfu_f bewert_sfu_g bewert_sfu_h bewert_sfu_i bewert_sfu_j bewert_sfu_k bewert_sfu_l
/PRINT EXTRACTION ROTATION
/FORMAT BLANK(.40)
/CRITERIA MINEIGEN(1) ITERATE(50)
/EXTRACTION PC
/CRITERIA ITERATE(50)
/ROTATION VARIMAX
/METHOD=CORRELATION.

描述性统计

                Mean    Std. Deviation  Analysis N
bewert_sfu_a    3.79              .452  158
bewert_sfu_b    3.68              .506  158
bewert_sfu_c    1.61              .827  158
bewert_sfu_d    3.32              .619  158
bewert_sfu_e    3.03              .643  158
bewert_sfu_f    2.61              .812  158
bewert_sfu_g    3.32              .621  158
bewert_sfu_h    1.53              .796  158
bewert_sfu_i    2.10              .838  158
bewert_sfu_j    2.53              .819  158
bewert_sfu_k    3.29              .784  158
bewert_sfu_l    2.78              .842  158`

成分矩阵

                       Component        
                   1       2       3
bewert_sfu_a    .531    .463    
bewert_sfu_b    .649           -.437
bewert_sfu_c   -.599        
bewert_sfu_d    .687        
bewert_sfu_e    .658        
bewert_sfu_f            .541    
bewert_sfu_g    .602        
bewert_sfu_h   -.711        
bewert_sfu_i    .463        
bewert_sfu_j            .462    .497
bewert_sfu_k    .637        
bewert_sfu_l    .412            .513

提取方法:主成分分析。
提取了 3 个组件。

社区

                Extraction
bewert_sfu_a    .522
bewert_sfu_b    .687
bewert_sfu_c    .536
bewert_sfu_d    .529
bewert_sfu_e    .580
bewert_sfu_f    .477
bewert_sfu_g    .527
bewert_sfu_h    .672
bewert_sfu_i    .441
bewert_sfu_j    .554
bewert_sfu_k    .417
bewert_sfu_l    .516
Extraction Method: Principal Component Analysis.    

旋转分量矩阵 a

                      Component     
                   1      2      3
bewert_sfu_a    .705        
bewert_sfu_b    .673  -.448 
bewert_sfu_c           .627 
bewert_sfu_d    .671        
bewert_sfu_e    .661        
bewert_sfu_f                 -.576
bewert_sfu_g    .699        
bewert_sfu_h           .698 
bewert_sfu_i                  .630
bewert_sfu_j           .742 
bewert_sfu_k    .528        
bewert_sfu_l                  .707

Extraction Method: Principal Component Analysis. 
Rotation Method: Varimax with Kaiser Normalization.         
a Rotation converged in 5 iterations.           

分量变换矩阵

Component      1        2      3
1           .765    -.476   .434
2           .644     .567  -.513
3          -.001     .672   .741
Extraction Method: Principal Component Analysis.
Rotation Method: Varimax with Kaiser Normalization.         

Stata 因子分析/相关
obs 数量 = 158 方法:主成分因子
保留因子 = 3 旋转:(未旋转)
参数数量 = 33

--------------------------------------------------------------------------
     Factor  |   Eigenvalue   Difference        Proportion   Cumulative
-------------+------------------------------------------------------------
    Factor1  |      3.87230      2.46548            0.3227       0.3227
    Factor2  |      1.40682      0.22772            0.1172       0.4399
    Factor3  |      1.17910      0.20674            0.0983       0.5382
    Factor4  |      0.97236      0.16916            0.0810       0.6192
    Factor5  |      0.80319      0.05087            0.0669       0.6861
    Factor6  |      0.75232      0.09537            0.0627       0.7488
    Factor7  |      0.65696      0.01376            0.0547       0.8036
    Factor8  |      0.64320      0.13589            0.0536       0.8572
    Factor9  |      0.50730      0.04359            0.0423       0.8995
   Factor10  |      0.46371      0.07491            0.0386       0.9381
   Factor11  |      0.38881      0.03488            0.0324       0.9705
   Factor12  |      0.35393            .            0.0295       1.0000
--------------------------------------------------------------------------
LR test: independent vs. saturated:  chi2(66) =  453.95 Prob>chi2 = 0.0

因子载荷(模式矩阵)和唯一方差

-----------------------------------------------------------
    Variable |  Factor1   Factor2   Factor3 |   Uniqueness 
-------------+------------------------------+--------------
bewert_sfu_a |   0.5314    0.4627   -0.1603 |      0.4779  
bewert_sfu_b |   0.6490    0.2732   -0.4373 |      0.3129  
bewert_sfu_c |  -0.5994    0.3735    0.1926 |      0.4642  
bewert_sfu_d |   0.6866    0.2265    0.0760 |      0.4715  
bewert_sfu_e |   0.6576    0.2451    0.2954 |      0.4202  
bewert_sfu_f |  -0.3938    0.5409   -0.1723 |      0.5227  
bewert_sfu_g |   0.6015    0.3710    0.1663 |      0.4728  
bewert_sfu_h |  -0.7107    0.2586    0.3163 |      0.3280  
bewert_sfu_i |   0.4629   -0.2622    0.3977 |      0.5588  
bewert_sfu_j |  -0.3062    0.4619    0.4971 |      0.4457  
bewert_sfu_k |   0.6373    0.0623    0.0818 |      0.5832  
bewert_sfu_l |   0.4116   -0.2900    0.5125 |      0.4839  

rotate, varimax kaiser blanks(.4)

因子分析/相关
obs 数量 = 158 方法:主成分因子
保留因子 = 3 旋转:正交 varimax (Kaiser on)
参数数量 = 33

--------------------------------------------------------------------------
     Factor  |     Variance   Difference        Proportion   Cumulative
-------------+------------------------------------------------------------
    Factor1  |      2.84986      0.98705            0.2375       0.2375
    Factor2  |      1.86281      0.11727            0.1552       0.3927
    Factor3  |      1.74554            .            0.1455       0.5382
--------------------------------------------------------------------------
LR test: independent vs. saturated:  chi2(66) =  453.95 Prob>chi2 = 0.0000

旋转因子载荷(模式矩阵)和唯一方差

-----------------------------------------------------------
    Variable |  Factor1   Factor2   Factor3 |   Uniqueness 
-------------+------------------------------+--------------
bewert_sfu_a |   0.7047   -0.0983   -0.1258 |      0.4779  
bewert_sfu_b |   0.6732   -0.4479   -0.1827 |      0.3129  
bewert_sfu_c |  -0.2184    0.6266   -0.3090 |      0.4642  
bewert_sfu_d |   0.6710   -0.1473    0.2377 |      0.4715  
bewert_sfu_e |   0.6605    0.0245    0.3781 |      0.4202  
bewert_sfu_f |   0.0474    0.3785   -0.5761 |      0.5227  
bewert_sfu_g |   0.6989    0.0358    0.1935 |      0.4728  
bewert_sfu_h |  -0.3776    0.6976   -0.2067 |      0.3280  
bewert_sfu_i |   0.1847   -0.1019    0.6298 |      0.5588  
bewert_sfu_j |   0.0624    0.7419   -0.0018 |      0.4457  
bewert_sfu_k |   0.5276   -0.2131    0.3050 |      0.5832  
bewert_sfu_l |   0.1273   -0.0160    0.7069 |      0.4839  
-----------------------------------------------------------

因子旋转矩阵

-----------------------------------------
             | Factor1  Factor2  Factor3 
-------------+---------------------------
     Factor1 |  0.7650  -0.4761   0.4336 
     Factor2 |  0.6440   0.5672  -0.5134 
     Factor3 | -0.0016   0.6720   0.7406 
-----------------------------------------
4个回答

你是对的。Stata对此很奇怪。Stata 给出了 SAS、R 和 SPSS 的不同结果,如果不深入研究因子分析和 PCA 世界,就很难(在我看来)理解为什么。

以下是您如何知道发生了一些奇怪的事情的方法。一个组件的平方载荷之和等于该组件的特征值。

旋转前后,特征值发生变化,但总特征值不变。将输出中的平方负载的总和相加(这就是我要求您删除评论中的空白的原因)。使用 Stata 的默认值,平方载荷的总和将为 1.00(在舍入误差内)。使用 SPSS(和 R、SAS,以及我看过的所有其他因子分析程序),它们将求和该因子的特征值。(旋转后特征值发生变化,但特征值之和保持不变)。SPSS 中的平方载荷之和等于旋转前和旋转后的特征值之和(即 3.8723 + 1.40682)。

在 Stata 中,每个因子的载荷平方和等于 1.00,因此 Stata 重新调整了载荷。

在 Stata 文档中唯一提到这一点(我发现)是在帮助的 estat loadings 部分,它说:

cnorm(unit | eigen | inveigen),与 estat 载荷一起使用的选项,选择特征向量的归一化,即主成分载荷矩阵的列。以下规范化可用

然而,这似乎只适用于未旋转的分量矩阵,而不适用于分量旋转的矩阵。在 PCA 之后我无法得到非归一化的旋转矩阵。

Stata 的人似乎知道他们在做什么,并且通常有充分的理由以他们的方式做事。不过这个超出了我的范围。

(为了将来参考,如果您使用我可以访问的数据集,并且如果您包含所有输出,没有空格,那会让我的生活更轻松)。

编辑:关于如何为不同程序获得相同结果的信息,我通常的首选站点是 UCLA IDRE。他们不包括 Stata 中的 PCA:http: //www.ats.ucla.edu/stat/AnnotatedOutput/ 我想知道这是不是因为他们无法获得相同的结果。:)

Stata PCA 方法与 R 或 SPSS 中使用的常规方法之间的区别是:

1. 缩放特征向量/分量

Stata 旋转特征向量。而 R 或 SPSS PCA 旋转方法通常在按特征值的 sqrt 缩放特征向量后旋转,以产生在因子分析中更典型的分量载荷。

2.收敛停止标准(容差)

另一个区别是,Stata 的旋转收敛停止标准(公差)对于 varimax 旋转是 1e-6(根据 Stat 的rotatemat功能手册),而在 R 中默认是1e-5,而在 SPSS 中默认是1e-14,如果我没记错的话。在解决了这些差异之后,我能够在 R 中获得相同的载荷和相同的旋转矩阵。

R 和 SPSS varimax 旋转函数默认执行 Kaiser 归一化。

然而,直接在特征向量上进行 varimax 旋转似乎是非常规的。请参阅标题为“PCA 后跟旋转(例如 varimax)是否仍然是 PCA?”的讨论?.

附录

每个 PC 都是正交的(不相关的)。然而,一旦旋转完成,旋转 PC 既没有正交载荷也没有不相关的分量。这就是Stata代码中发生的事情。为了获得不相关的分量,需要特殊的缩放,例如将分量除以对应特征值的平方根(特征值是对应 PC 的方差),这是 R 和 SPSS 中默认的缩放方法。

参考:

备注:这更像是评论而不是答案。

这是一个尝试重现Stata解决方案如何计算的脚本。
实际上,它似乎与 SPSS 的解决方案不同,是对特征向量的转换(更具体地说:在前 3 个特征向量上的 Kaiser 归一化),而不是像 SPSS 中的 PCA 组件。

这是我使用矩阵计算器软件 MatMate 进行的计算

;******  MatMate Version 0.1410 Beta *****************************
//  first part of posted data (via clipboard) Eigenvectors (your first protocol)
 // of Stata- computations
clp = csvdatei("clip")
eig_lad = clp[*,1..3]   // the first 3 columns: these are obviously eigenvector-values

        |   0,2700    0,3901     -0,1477 |
        |   0,3298    0,2303     -0,4027 |
        |  -0,3046    0,3149      0,1773 |
        |   0,3489    0,1910      0,0700 |
        |   0,3342    0,2067      0,2720 |
        |  -0,2001    0,4561     -0,1587 |
        |   0,3057    0,3128      0,1531 |
        |  -0,3611    0,2180      0,2913 |
        |   0,2352   -0,2211      0,3662 |
        |  -0,1556    0,3894      0,4578 |
        |   0,3239    0,0525      0,0754 |
        |   0,2091   -0,2445      0,4720 |

uniq = clp[*,4]  // "not-explained" = unique (unexplained by 3 eigenvectors) variances
                 //  (= squared values, not loadings)

        |   0,4779 |
        |   0,3129 |
        |   0,4642 |
        |   0,4715 |
        |   0,4202 |
        |   0,5227 |
        |   0,4728 |
        |   0,3280 |
        |   0,5588 |
        |   0,4457 |
        |   0,5832 |
        |   0,4839 |

//  second part of posted data (via clipboard) : first three eigenvalues
pca_ssl = csvdatei("clip")  // "ssl" means "sum of sqauares of loadings"

        |   3,8723    1,4068      1,1791 |


   // check whether the "unique" variance is really the non-explained
   // variance by the first 3 eigenvectors/PCA-components:
chk = sumzl(    eig_lad ^# 2 *#  pca_ssl   ) + uniq 
   // the squared pca-loadings (eigenvectors^2 scaled by eigenvalues)
   //  plus the unique variance should sum up to 1-variance for each row (=item)

        |   1,0000 |
        |   0,9999 |
        |   1,0000 |
        |   1,0000 |
        |   1,0000 |
        |   1,0001 |
        |   1,0000 |
        |   0,9998 |
        |   0,9999 |
        |   0,9999 |
        |   1,0000 |
        |   1,0000 |




 // get the rotationmatrix to bring the "Kaiser"-normalized loadings to Varimax 
 // note that SPSS computes this based on the PCA-loadings, not on Eigenvector-values 
t = gettrans(normzl(eig_lad ),"varimax") // "normzl(<loadings>)"
                                         // provides Kaiser-normalization per row 
  //       (of course here in Stata based on eigenvectors)

 // rotation-/transformation-matrix "t" from pca to varimax coordinates

        |   0,7942   -0,5573      0,2421 |
        |   0,5724    0,5523     -0,6062 |
        |   0,2041    0,6200      0,7576 |

vmx_lad = eig_lad * t        // this computes the Stata - varimax-coordinates

        |   0,4580   -0,0065     -0,1926 |
        |   0,4012   -0,2970     -0,2735 |
        |  -0,0305    0,4428     -0,1625 |
        |   0,3898   -0,0107      0,1051 |
        |   0,3884    0,1409      0,2402 |
        |   0,1409    0,2473     -0,4385 |
        |   0,4351    0,1348      0,0853 |
        |  -0,1363    0,4913     -0,0528 |
        |   0,0370    0,0087      0,4867 |
        |   0,1310    0,6026      0,0716 |
        |   0,2815   -0,0738      0,1693 |
        |   0,0018    0,0790      0,5657 |

vmx_ssl = sqsumsp((pca_ssl *# sqrt(pca_ssl#)) *t) 
          // sums of squares of the varimax-rotated princ. components (not eigenvectors!)

        |   2,9522    2,0849      1,4207 |


// =============== The SPSS-solution          =========================
eig_lad = clp[*,1..3]   // the first 3 columns: these are obviously eigenvector-values
spss_pca_lad = eig_lad *# sqrt(pca_ssl#) // compute pca-loadings from eigenvectors
spss_t = gettrans(normzl(spss_pca_lad ),"varimax") // "normzl(<pca loadings>)"
spss_vmx_lad = spss_pca_lad * spss_t        // this computes the SPSS - varimax-coordinates

    |   0,7047   -0,0983     -0,1260 |
    |   0,6731   -0,4479     -0,1827 |
    |  -0,2184    0,6266     -0,3091 |
    |   0,6710   -0,1473      0,2377 |
    |   0,6606    0,0244      0,3780 |
    |   0,0474    0,3785     -0,5761 |
    |   0,6989    0,0358      0,1935 |
    |  -0,3776    0,6975     -0,2066 |
    |   0,1846   -0,1019      0,6298 |
    |   0,0624    0,7418     -0,0018 |
    |   0,5276   -0,2131      0,3050 |
    |   0,1273   -0,0160      0,7068 |

   spss_vmx_ssl = sqsumsp(spss_vmx_lad)  // the SPSS-"variances" of the vmx-factors

    |   2,8498    1,8626      1,7455 |

由于所有坐标以及变换/旋转矩阵似乎都被正确复制,这似乎确实是 Stata 和 SPSS 的内部计算

减少到语法/概念的差异将是

// Stata
eig_lad = clp[*,1..3]   // the first 3 columns: these are obviously eigenvector-values
t = gettrans(normzl(eig_lad ),"varimax") // "normzl(<on eigenvectors>)"
vmx_lad = eig_lad * t        // this computes the Stata - varimax-coordinates

// SPSS
eig_lad = clp[*,1..3]   // the first 3 columns: these are obviously eigenvector-values
spss_pca_lad = eig_lad *# sqrt(pca_ssl#) // compute pca-loadings from eigenvectors
spss_t = gettrans(normzl(spss_pca_lad ),"varimax") // "normzl(<on pca loadings>)"
spss_vmx_lad = spss_pca_lad * spss_t        // this computes the SPSS - varimax-coordinates

VARIMAX 概念的旋转标准在两个软件包中似乎不同。虽然Stata基于eigenvectors的单位方差归一化(“Kaiser 归一化”)行计算旋转角度,但SPSS是否基于单位方差归一化(“Kaiser 归一化”)行计算旋转角度PCA-components ,它们是通过相关特征值的平方根对特征向量进行缩放。在大多数情况下,这应该会导致不同的解决方案。

这是我笔记中的一部分,可能会有所帮助。特征向量(或载荷)的所有归一化都是正确的! 在此处输入图像描述

在此处输入图像描述

在此处输入图像描述