You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言中eigen()返回特征向量符号异常及载荷矩阵技术问询

R语言PCA分析:特征向量符号异常与载荷矩阵疑问解析

问题背景

我最近在使用R语言开展PCA分析时,通过eigen()函数处理相关矩阵,发现返回的特征向量符号和princomp()输出的载荷矩阵存在明显差异,同时对载荷矩阵的相关逻辑存有疑问。以下是我的代码及运行输出:

代码与运行输出

setwd("D:/BlueHDD/MAQAB/RStudio/R/PCA/Intelligence")
mydata <- read.csv("Intelligence2.csv",na.strings = ".")
head(mydata)
# 输出:
#      M    P    C    E     H     F
# 1 1.000 0.620 0.540 0.320 0.284 0.370
# 2 0.620 1.000 0.510 0.380 0.351 0.430
# 3 0.540 0.510 1.000 0.360 0.336 0.405
# 4 0.320 0.380 0.360 1.000 0.686 0.730
# 5 0.284 0.351 0.336 0.686 1.000 0.735
# 6 0.370 0.430 0.405 0.730 0.735 1.000

ii <- as.matrix(mydata[,1:6])
rownames(ii)<- c ("M","P","C","E","H","F")
colnames(ii)<- c ("M","P","C","E","H","F")
head(ii)
# 输出:
#      M    P    C    E     H     F
# M 1.000 0.620 0.540 0.320 0.284 0.370
# P 0.620 1.000 0.510 0.380 0.351 0.430
# C 0.540 0.510 1.000 0.360 0.336 0.405
# E 0.320 0.380 0.360 1.000 0.686 0.730
# H 0.284 0.351 0.336 0.686 1.000 0.735
# F 0.370 0.430 0.405 0.730 0.735 1.000

myEIG <- eigen(ii)
myEIG$values
# [1] 3.3670861 1.1941791 0.5070061 0.3718472 0.3131559 0.2467257

myEIG$vectors
#            [,1]       [,2]        [,3]        [,4]         [,5]
# [1,] -0.3677678 -0.5098401  0.266985551  0.72768020  0.047584025
# [2,] -0.3913477 -0.4092063  0.485916591 -0.66464527 -0.005392018
# [3,] -0.3719504 -0.3825819 -0.831626240 -0.15204371 -0.003331423
# [4,] -0.4321872  0.3748248  0.021531885  0.06531777 -0.742970281
# [5,] -0.4219572  0.4214599  0.002730054  0.01174474  0.665109730
# [6,] -0.4565228  0.3288196  0.023032686  0.03473540  0.057617669
#            [,6]
# [1,] -0.04178482
# [2,] -0.03872816
# [3,] -0.02352388
# [4,] -0.34056682
# [5,] -0.44922966
# [6,]  0.82365511

myPCA <- princomp(covmat=ii)
head(myPCA)
# $sdev
#    Comp.1    Comp.2    Comp.3    Comp.4    Comp.5    Comp.6 
# 1.8349621 1.0927850 0.7120436 0.6097927 0.5596033 0.4967149 
# 
# $loadings
# Loadings:
#    Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6
# M  0.368  0.510  0.267  0.728          
# P  0.391  0.409  0.486 -0.665          
# C  0.372  0.383 -0.832 -0.152          
# E  0.432 -0.375         -0.743  0.341  
# H  0.422 -0.421          0.665  0.449  
# F  0.457 -0.329                -0.824  
# 
#                Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6
# SS loadings      1.000  1.000  1.000  1.000  1.000  1.000
# Proportion Var   0.167  0.167  0.167  0.167  0.167  0.167
# Cumulative Var   0.167  0.333  0.500  0.667  0.833  1.000
# $center
# [1] NA NA NA NA NA NA
# $scale
# M P C E H F 
# 1 1 1 1 1 1 
# $n.obs
# [1] NA
# $scores
# NULL

summary(myPCA) # print variance accounted for
# Importance of components:
#                           Comp.1    Comp.2     Comp.3     Comp.4
# Standard deviation     1.834962 1.0927850 0.71204360 0.60979272
# Proportion of Variance 0.561181 0.1990299 0.08450101 0.06197453
# Cumulative Proportion  0.561181 0.7602109 0.84471188 0.90668641
#                            Comp.5      Comp.6
# Standard deviation     0.55960331 0.49671489
# Proportion of Variance 0.05219264 0.04112095
# Cumulative Proportion  0.95887905 1.00000000

loadings(myPCA) # pc loadings
# Loadings:
#    Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6
# M  0.368  0.510  0.267  0.728          
# P  0.391  0.409  0.486 -0.665          
# C  0.372  0.383 -0.832 -0.152          
# E  0.432 -0.375         -0.743  0.341  
# H  0.422 -0.421          0.665  0.449  
# F  0.457 -0.329                -0.824  
# 
#                Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6
# SS loadings      1.000  1.000  1.000  1.000  1.000  1.000
# Proportion Var   0.167  0.167  0.167  0.167  0.167  0.167
# Cumulative Var   0.167  0.333  0.500  0.667  0.833  1.000

plot(myPCA,type="lines") # scree plot

问题解析与解答

1. 特征向量符号差异的本质

你观察到的eigen()和princomp()输出的向量符号差异,完全是正常现象,核心原因在于:

  • 特征向量的符号不具有唯一性:如果向量v是某个特征值对应的特征向量,那么-v必然也是同一个特征值的特征向量(代入特征方程即可验证)。
  • 不同函数的符号选择规则不同:eigen()函数没有强制特征向量的符号规则,而princomp()通常会让主成分载荷的第一个元素为正,以此统一输出格式,这就导致了两者的符号完全相反(比如你输出中myEIG$vectors的第一列全为负,而myPCA$loadings的Comp.1全为正)。

这种符号差异不会影响PCA的结果解释:主成分的方向本身是人为定义的,无论是正方向还是反方向,变量与主成分的相关性逻辑是一致的,只是相关系数的符号反转,只要在解释时保持逻辑统一即可。

2. 载荷矩阵的相关疑问

princomp()返回的loadings本质上是标准化后的特征向量,当基于相关矩阵做PCA时,载荷矩阵的每一列对应eigen()输出的特征向量(符号可能反转),同时满足“每列元素的平方和为1”(你可以看到输出中SS loadings均为1.000)。

载荷的意义是原始变量与主成分的相关系数,它反映了变量对主成分的贡献程度。当特征向量符号反转时,载荷的符号也会反转,但这仅仅表示变量与主成分是负相关,不会改变变量之间的相对关系,也不会影响主成分的方差解释率(你可以看到summary(myPCA)中的方差比例和eigen()的特征值除以变量数(6)的结果完全一致:3.367/6≈0.561,和Proportion of Variance的Comp.1值匹配)。

总结

无需担心这种符号差异,它是特征向量的固有属性,不影响PCA的分析结果和解释逻辑。如果你需要统一符号,可以手动将eigen()的特征向量乘以-1,使其和princomp()的载荷矩阵保持一致。

内容的提问来源于stack exchange,提问作者Wilks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:47:23