R中PCA置信椭圆如何计算?如何从原始数据推导椭圆参数?
R绘制PCA散点图置信椭圆的参数推导逻辑
factoextra包的fviz_pca_ind()添加的置信椭圆,默认基于分组内样本的PCA投影坐标(即b$x中对应分组的行)计算,采用正态分布假设下的95%置信区间规则,所有参数都可以从现有数据手动推导,不需要依赖包的内部封装逻辑。
注意:你提到的
b$center是原始特征维度的全局中心化均值,不是PCA投影空间的分组中心,椭圆的中心需要从分组后的PC坐标单独计算。
手动推导的完整步骤
- 第一步:按分组拆分PCA前两轴的投影坐标
# 提取PC1、PC2坐标,按物种拆分 pca_coord <- as.data.frame(b$x[, 1:2]) group_coord_list <- split(pca_coord, iris$Species) # 示例:提取setosa组的坐标 setosa_coord <- group_coord_list[["setosa"]] - 第二步:计算分组椭圆的中心坐标,即当前组PC1、PC2的均值
ellipse_center <- colMeans(setosa_coord) - 第三步:计算分组PC坐标的协方差矩阵,用于确定椭圆的拉伸方向和轴长
group_cov <- cov(setosa_coord) - 第四步:计算置信度对应的缩放因子,95%置信度对应自由度为2的卡方分布95%分位数的平方根,数值约为2.447
conf_level <- 0.95 scale_factor <- sqrt(qchisq(conf_level, df = 2)) - 第五步:对协方差矩阵做特征值分解,得到椭圆的两个半轴长度和旋转角度
eig <- eigen(group_cov) # 椭圆两个半轴的长度 ellipse_axis_len <- sqrt(eig$values) * scale_factor # 椭圆相对于x轴的逆时针旋转弧度,转角度可乘180/pi ellipse_rotation <- atan2(eig$vectors[2, 1], eig$vectors[1, 1])
结果验证
你可以直接用ggplot2的stat_ellipse绘制椭圆,和fviz_pca_ind生成的椭圆完全一致,二者底层计算逻辑相同:
library(ggplot2) ggplot(pca_coord, aes(x = PC1, y = PC2, color = iris$Species)) + geom_point() + stat_ellipse(level = 0.95, type = "norm") + theme_bw()
内容的提问来源于stack exchange,提问作者Ginko-Mitten
相关产品推荐
相关产品推荐

