R语言PCA分析如何通过图形方法选择合适主成分数
首先修正你现有代码的两处问题,否则会运行报错:
- 列选择部分重复写了
"Shot.put",末尾还多了冗余逗号:decathlon数据集前10列是十项全能的各项比赛成绩,后几列是总积分、排名、赛事信息,做成绩维度的PCA直接取前10列即可,不需要手动重复选列。 ncp参数设置为15超出上限:PCA最多能输出和纳入变量数相等的主成分,你最多放10个变量的话,ncp设为10就够了。
修正后的基础运行代码:
data("decathlon") # 提取用于PCA的运动成绩变量 pca_input <- decathlon[, 1:10] res.pca <- PCA(pca_input, scale.unit = TRUE, ncp = 10, graph = FALSE)
以下是三种常用的图形化判断主成分保留数量的方法,都可以直接复用代码运行:
1. 基础碎石图(结合肘部法则+Kaiser准则)
用factoextra包的fviz_eig()直接绘制,横轴是主成分序号,纵轴对应每个主成分的特征值/方差解释率:
fviz_eig(res.pca, addlabels = TRUE, # 显示每个主成分的方差解释占比 ylim = c(0, 40), main = "PCA碎石图") + # 加Kaiser准则参考线:特征值=1对应的方差占比(标准化后总方差等于变量数) geom_hline(yintercept = 100/ncol(pca_input), linetype = "dashed", color = "red")
判断规则:
- 优先选曲线拐点(肘部)之前的主成分,拐点之后主成分的方差解释增量会骤降,保留价值很低
- 红线上方的主成分符合Kaiser准则(特征值>1),可以作为辅助判断标准
2. 累计方差贡献率图
同样用fviz_eig(),加参数choice = "cumvariance"即可绘制累计解释方差的变化曲线:
fviz_eig(res.pca, choice = "cumvariance", addlabels = TRUE, ylim = c(0, 100), main = "累计方差贡献率图") + # 加自定义阈值参考线,比如常用的80%累计解释率 geom_hline(yintercept = 80, linetype = "dashed", color = "blue")
判断规则:
根据你所在领域的通用阈值选即可,比如探索性分析累计解释率到60%就可用,工程类/精准建模场景一般要求累计解释率到80%~90%,曲线达到阈值时对应的主成分序号就是要保留的数量。
3. 平行分析图(最稳健的判断方法)
这个方法通过模拟和原始数据同维度的随机矩阵做PCA,对比真实数据和随机数据的特征值差异,避免前两种方法的主观判断偏差:
# 没装psych包先运行安装 # install.packages("psych") library(psych) fa.parallel(pca_input, fa = "pc", # 指定做PCA而非因子分析 n.iter = 100, # 随机模拟次数 main = "平行分析碎石图")
判断规则:
图中带三角标记的实线是真实数据的特征值,带叉的虚线是随机模拟得到的平均特征值,只要真实特征值在模拟虚线上方,对应的主成分就值得保留,两条线交点之前的主成分数量就是最优选择。
针对你用的
decathlon数据集,用上述三种方法判断,一般保留3~4个主成分就足够解释绝大多数成绩差异。
内容的提问来源于stack exchange,提问作者SarahB
相关产品推荐
相关产品推荐

