R语言prcomp函数PCA旋转后数据镜像问题求助
关于R语言prcomp PCA旋转后镜像问题的解决办法
我之前也踩过这个坑!其实这不是prcomp的bug,而是PCA主成分本身的一个特性——主成分的符号是任意的,因为特征向量乘以-1之后仍然是有效的特征向量,所以不同函数在计算时可能选择了相反的方向,导致结果看起来像是镜像,但本质上包含的信息完全一致。
问题根源
你用psych::principal()直接做带varimax旋转的PCA时,函数内部默认的特征向量方向和prcomp()输出的主成分方向相反,后续旋转后自然就出现了镜像效果。但两者的统计意义是一样的,只是坐标轴方向翻转了而已。
解决方法:手动调整符号对齐结果
如果你想要让prcomp旋转后的结果和principal保持一致,可以通过对比两者的载荷矩阵,手动翻转成分的符号:
# 1. 先运行你认为"正确"的principal结果 library(psych) psych_pca <- principal(PCADataFrame, nfactors=2, rotate="varimax", scale=TRUE) # 记得scale,principal默认标准化 # 2. 用prcomp提取主成分并做varimax旋转 prcomp_pca <- prcomp(PCADataFrame, scale.=TRUE) pc_scores <- prcomp_pca$x[, 1:2] # 取前两个主成分 pr_rotated <- varimax(pc_scores) # 3. 对比载荷矩阵,调整符号 for (i in 1:2) { # 计算两个结果对应成分载荷的相关系数,判断方向是否相反 corr_dir <- cor(psych_pca$loadings[, i], pr_rotated$loadings[, i]) if (corr_dir < 0) { # 翻转当前成分的得分和载荷的符号 pr_rotated$scores[, i] <- pr_rotated$scores[, i] * -1 pr_rotated$loadings[, i] <- pr_rotated$loadings[, i] * -1 } }
调整后,pr_rotated的结果就和psych_pca完全对齐了,之后你就可以放心用prcomp配套的可视化工具(比如biplot(prcomp_pca)或者结合ggplot2画得分散点图)啦。
小提醒
其实这种镜像翻转完全不影响PCA的解释——主成分的方向本身没有实际的物理意义,只是为了和你预期的结果一致才需要调整。如果不需要和其他结果对齐,完全可以忽略这个镜像问题哦~
内容的提问来源于stack exchange,提问作者b1234
相关产品推荐
相关产品推荐

