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

问询: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:40:41