R语言中eigen()返回特征向量符号异常及载荷矩阵技术问询
问题背景
我最近在使用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

