如何基于recipes包的PCA对象绘制类似FactoMineR的相关性圆?
用recipes + ggplot2实现FactoMineR风格的PCA可视化
要在tidymodels工作流里复刻FactoMineR的PCA可视化,核心是从预处理好的recipe对象中提取载荷、方差解释率等关键信息,再用ggplot2手动构建图形。以下是完整步骤:
1. 基础准备与PCA建模
先基于标准化变量构建PCA模型(和FactoMineR默认的scale.unit = TRUE保持一致):
library(tidymodels) library(ggplot2) library(dplyr) # 用iris数据集示例 data(iris) # 构建并拟合PCA recipe pca_recipe <- recipe(~ ., data = iris) %>% step_normalize(all_predictors()) %>% # PCA前标准化变量 step_pca(all_predictors(), num_comp = 2) %>% # 保留前2个主成分 prep(training = iris) # 完成预处理拟合
2. 提取可视化所需的关键数据
提取变量载荷(相关性圆核心)
用tidy()函数提取PCA的载荷矩阵,这对应FactoMineR中PCA结果$var$coord的内容:
# 提取PCA载荷:number参数对应step_pca在recipe中的步骤序号(这里是第2步) pca_loadings <- tidy(pca_recipe, number = 2)
提取主成分方差解释率
用来给坐标轴添加方差占比标注:
# 提取方差解释百分比 pca_variance <- tidy(pca_recipe, number = 2, type = "variance") %>% filter(stringr::str_detect(terms, "percent"))
提取样本主成分得分
对应FactoMineR中PCA结果$ind$coord,用于绘制样本散点图:
# 生成样本的主成分得分,并结合分类变量 pca_scores <- bake(pca_recipe, new_data = iris) %>% bind_cols(iris %>% select(Species))
3. 绘制相关性圆(复刻FactoMineR的fviz_pca_var)
相关性圆的原理是用变量与主成分的相关系数(即载荷)绘制向量,同时添加单位圆辅助判断变量对主成分的贡献:
ggplot(pca_loadings, aes(x = value, y = value.1)) + # 绘制变量向量 geom_segment(aes(x = 0, y = 0, xend = value, yend = value.1), arrow = arrow(length = unit(0.2, "cm")), color = "gray50") + # 添加变量名称标签 geom_text(aes(label = terms), hjust = 0.5, vjust = -0.2, size = 4) + # 添加单位圆 geom_circle(aes(x0 = 0, y0 = 0, r = 1), color = "black", linetype = "dashed", inherit.aes = FALSE) + # 坐标轴标签(带方差解释率) xlab(paste0("PC1 (", round(pca_variance$value[pca_variance$terms == "percent variance PC1"], 1), "%)")) + ylab(paste0("PC2 (", round(pca_variance$value[pca_variance$terms == "percent variance PC2"], 1), "%)")) + # 调整坐标范围与比例,保证圆为正圆 xlim(-1.1, 1.1) + ylim(-1.1, 1.1) + coord_fixed() + theme_minimal()
4. 绘制样本散点图(复刻FactoMineR的fviz_pca_ind)
用提取的主成分得分绘制样本在主成分空间的分布:
ggplot(pca_scores, aes(x = PC1, y = PC2, color = Species)) + geom_point(size = 2) + xlab(paste0("PC1 (", round(pca_variance$value[pca_variance$terms == "percent variance PC1"], 1), "%)")) + ylab(paste0("PC2 (", round(pca_variance$value[pca_variance$terms == "percent variance PC2"], 1), "%)")) + theme_minimal()
关键说明
- 主成分方向可能与FactoMineR结果相反:PCA对主成分的方向没有强制约束,只要变量间的相对关系一致,结果的解释性完全相同,无需额外处理。
- 一致性验证:提取的载荷与FactoMineR的
PCA结果$var$coord数值绝对值一致,仅符号可能差异,属于正常现象。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

