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

R语言中FactoMineR执行PCA无法获取全部主成分变量贡献

问题

使用FactoMineR包执行简单PCA分析,由于有15个变量,理论上会得到15个主成分,但尝试获取每个变量对各主成分的贡献时,仅能得到5个维度的结果,无法获取全部15个维度的贡献。使用的代码如下:

library(FactoMineR)
library(factoextra)

set.seed(123)
PCA_data <- matrix(rnorm(675), ncol = 15)

PCA_scaled <- scale(PCA_data)
pca_result <- PCA(PCA_scaled, graph = TRUE)
eigenvalues <- get_eigenvalue(pca_result)

variance_explained <- get_pca_var(pca_result)$prop_var

contributions <- pca_result$var$contrib 
contributions

get_pca_var(pca_result)$contribSDT_scaled <- scale(PCA_data)  

fviz_eig(pca_result, choice = "eigenvalue", addlabels = TRUE)

# Biplot
fviz_pca_biplot(pca_result, repel = TRUE, col.var = "contrib", 
                gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"))

# Create a data frame for plotting
plot_data <- data.frame(
  Principal_Component = rep(1:ncol(contributions), each = nrow(var_contributions)),
  Variable = rep(rownames(contributions), ncol(contributions)),
  Contribution = as.vector(contributions)
)

# Create a stacked bar plot
ggplot(plot_data, aes(x = Principal_Component, y = Contribution, fill = Variable)) +
  geom_bar(stat = "identity") +
  labs(title = "Variable Contributions to Principal Components",
       x = "Principal Component",
       y = "Contribution") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_viridis_d() 

#I also tried: 
summary(pca_result, nbelements=Inf)

尝试了上述多种方法,均无法获取全部15个维度及每个变量的贡献。

原因

FactoMineR的PCA()函数默认采用Kaiser准则,只保留特征值大于1的主成分。你的数据中只有5个主成分的特征值大于1,所以默认只返回这5个维度的结果,导致后续只能拿到对应维度的变量贡献。

解决办法

在调用PCA()函数时,通过ncp参数指定要保留的主成分数量为变量总数(这里是15),强制保留全部主成分:

# 修改PCA调用代码,指定ncp=15
pca_result <- PCA(PCA_scaled, graph = TRUE, ncp = 15)

修改后,再执行contributions <- pca_result$var$contrib,就能得到15行15列的矩阵,包含每个变量对全部15个主成分的贡献值。

另外,你的绘图代码中存在一个小错误:nrow(var_contributions)未定义,应该改为nrow(contributions),修正后的绘图代码如下:

# Create a data frame for plotting
plot_data <- data.frame(
  Principal_Component = rep(1:ncol(contributions), each = nrow(contributions)),
  Variable = rep(rownames(contributions), ncol(contributions)),
  Contribution = as.vector(contributions)
)

内容的提问来源于stack exchange,提问作者Lw301

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:43:32