问询:psych包principal函数PCA$scores与FactoMineR包PCA$ind$contrib的差异
为什么psych包的
PCA$scores和FactoMineR包的PCA$ind$contrib数值差异这么大? 哈哈,这个问题我之前踩过坑!其实你看到的这两个输出本质上完全不是一回事儿,数值差异大是必然的,我给你拆解清楚:
1. 两者代表的核心含义天差地别
psych包的
PCA$scores:这是每个观测值在主成分维度上的投影得分,说白了就是样本在新的主成分坐标轴上的“坐标值”。计算逻辑是用标准化(或原始)数据乘以主成分的载荷向量,得分的正负代表样本在该主成分上的方向,绝对值大小反映距离原点的远近。它的用途是做样本的可视化(比如画PCA散点图)、后续聚类分析等。FactoMineR包的
PCA$ind$contrib:这是单个观测值对主成分的方差贡献百分比,衡量的是某一样本对该主成分“方差解释能力”的贡献程度。计算逻辑是把样本的得分做标准化处理后平方,再转化为占总方差的百分比,数值越大说明这个样本对该主成分的“影响力”越强。它的用途是找出对主成分贡献最大的关键样本。
2. 用代码验证两者的关联(以iris数据集为例)
你可以手动计算来验证它们的关系,比如:
library(psych) library(FactoMineR) # 取iris的数值型变量 iris_num <- iris[, 1:4] # 运行psych的PCA(不旋转,标准化数据) p_psych <- principal(iris_num, nfactors = 2, rotate = "none", scale = TRUE) scores_psych <- p_psych$scores # 运行FactoMineR的PCA(同样设置) p_facto <- PCA(iris_num, ncp = 2, scale.unit = TRUE, graph = FALSE) contrib_facto <- p_facto$ind$contrib # 手动计算第一个主成分的贡献度 eigen_val <- p_facto$eig[1, 1] # 第一个主成分的特征值 n <- nrow(iris_num) # 观测数 manual_contrib <- (scores_psych[, 1]^2 / (eigen_val * n)) * 100 # 对比手动计算结果和FactoMineR的输出(浮点误差忽略) head(round(manual_contrib, 2)) head(round(contrib_facto[, 1], 2))
运行后你会发现两者几乎完全一致,这就验证了contrib是基于scores进一步计算出来的衍生指标,而非同一类数值。
3. 总结用途差异
- 如果你想看样本在主成分空间的分布,用
PCA$scores; - 如果你想找出对主成分影响最大的样本,用
PCA$ind$contrib。
内容的提问来源于stack exchange,提问作者S. Mrtz
相关产品推荐
相关产品推荐

