R语言手动实现PCA:求解主成分方差解释占比遇阻求助
计算主成分方差解释占比的R实现步骤
核心逻辑:主成分的方差解释占比 = 单个主成分得分的方差 ÷ 所有主成分得分的方差总和(或原始数据的总方差,结果一致)
步骤1:计算每个主成分得分的方差
你的Z矩阵每一行对应一个主成分的5个观测得分,用apply()函数计算每行的方差:
# 计算每个主成分的方差(var()默认除以n-1,是统计上的无偏估计) pc_var <- apply(Z, 1, var)
步骤2:计算总方差
总方差是所有主成分方差的总和,直接用sum()求和:
total_var <- sum(pc_var)
步骤3:计算方差解释占比(百分比形式)
将每个主成分的方差除以总方差,再乘以100转成百分比,保留两位小数让结果更直观:
var_explained <- round((pc_var / total_var) * 100, 2) # 给结果命名,对应三个主成分 names(var_explained) <- c("主成分1", "主成分2", "主成分3")
完整代码整合
把上述步骤和你已有的代码整合在一起:
# 原始数据矩阵 A <- matrix( c(-2, -2, 0, 2, 2, -2, 2, 0, -2, 2, -4, 0, 0, 0, 4), nrow = 3, ncol = 5, byrow = TRUE ) # 主成分向量矩阵(每列是一个主成分向量) Phi <- matrix( c(0.41, -0.71, 0.58, 0.41, 0.71, 0.58, 0.82, 0.00, -0.58), nrow = 3, ncol = 3, byrow = FALSE ) # 计算主成分得分 Z <- Phi %*% A # 计算每个主成分的方差 pc_var <- apply(Z, 1, var) # 计算总方差 total_var <- sum(pc_var) # 计算方差解释占比(百分比) var_explained <- round((pc_var / total_var) * 100, 2) names(var_explained) <- c("主成分1", "主成分2", "主成分3") # 输出结果 print("各主成分方差解释占比:") print(var_explained)
补充说明
- 方差的意义:主成分的方差越大,说明它能捕捉到的原始数据波动(信息)越多
- 验证总方差:你可以用
sum(apply(A, 1, var))计算原始数据的总方差,结果和total_var一致,这是PCA的核心性质——总方差守恒
内容的提问来源于stack exchange,提问作者jjuser19jj
相关产品推荐
相关产品推荐

