PCA 是一种统计方法,用于减少数据集的维度,同时尽可能保留数据中的方差。PCA 的核心思想是将数据投射到少数几个主成分上,以便我们可以在二维或三维图上直观地观察数据的分布。
数据介绍
在这个示例中,我们使用 R 中自带的 iris
数据集。该数据集包含 150 行数据,每行代表一种鸢尾花样本。数据集中有 4 个数值变量(Sepal.Length
、Sepal.Width
、Petal.Length
、Petal.Width
),这些变量是鸢尾花的萼片和花瓣的长度和宽度。数据集还包含一个分类变量 Species
,表示鸢尾花的种类。
1. 加载并查看数据
# 加载 iris 数据集
data(iris)
# 查看数据结构
str(iris)
# 查看数据的前几行
head(iris)
2. 数据预处理
PCA 分析要求数据必须是数值型,因此我们需要去除分类变量 Species
,只保留数值变量。另外,为了避免数值尺度不同对 PCA 结果的影响,我们需要对数据进行标准化处理。
# 去除分类变量,只保留数值变量
iris_data <- iris[, 1:4]
# 标准化数据(使每个变量的均值为0,标准差为1)
iris_data_scaled <- scale(iris_data)
3. 进行 PCA 分析
在 R 中,使用 prcomp()
函数进行 PCA 分析。prcomp()
默认情况下会对数据进行中心化(即减去均值),并且可以选择性地对数据进行标准化。在这里我们已经手动标准化了数据,因此可以直接执行 PCA。
# 进行 PCA 分析
pca_result <- prcomp(iris_data_scaled, center = TRUE, scale. = TRUE)
# 查看 PCA 结果的结构
summary(pca_result)
4. 提取并理解 PCA 结果
prcomp
函数的结果是一个包含多个元素的列表。以下是结果的主要组成部分:sdev
:每个主成分的标准差,可以用来计算解释方差。rotation
:主成分的加载矩阵,显示原始变量对主成分的贡献。x
:主成分得分矩阵,表示样本在主成分空间中的坐标。
查看每个主成分的标准差和解释的方差比例
# 计算每个主成分解释的方差比例
explained_variance <- pca_result$sdev^2 / sum(pca_result$sdev^2)
# 输出解释的方差比例
explained_variance
# 累积解释方差比例
cumulative_variance <- cumsum(explained_variance)
cumulative_variance
绘制 PCA 图表
基本二维散点图
plot
函数绘制一个基本的二维散点图,显示前两个主成分的分布情况。# 绘制基本的 PCA 散点图
plot(pca_result$x[, 1], pca_result$x[, 2],
xlab = paste0("PC1 (", round(explained_variance[1] * 100, 1), "%)"),
ylab = paste0("PC2 (", round(explained_variance[2] * 100, 1), "%)"),
main = "PCA Plot of Iris Dataset",
col = iris$Species,
pch = 19)
# 添加图例
legend("topright", legend = levels(iris$Species), col = 1:3, pch = 19)
5.2 使用 ggplot2 绘制美观的 PCA 图
首先,将 PCA 结果转化为数据框格式,以便 ggplot2 可以使用。
# 创建数据框,将主成分得分与物种信息结合
pca_data <- data.frame(Species = iris$Species,
PC1 = pca_result$x[, 1],
PC2 = pca_result$x[, 2])
# 使用 ggplot2 绘制散点图
library(ggplot2)
ggplot(pca_data, aes(x = PC1, y = PC2, color = Species)) +
geom_point(size = 3) +
xlab(paste0("PC1 (", round(explained_variance[1] * 100, 1), "% Variance)")) +
ylab(paste0("PC2 (", round(explained_variance[2] * 100, 1), "% Variance)")) +
ggtitle("PCA Plot of Iris Dataset") +
theme_minimal()
6. 解释主成分的加载分数(Loading Scores)
加载分数表示每个变量(例如萼片长度、萼片宽度等)对主成分的影响程度。通过加载分数可以识别出最重要的变量。
# 查看加载矩阵
loading_scores <- pca_result$rotation
loading_scores
# 提取主成分1的加载分数,并按绝对值排序
loading_scores_PC1 <- abs(loading_scores[, 1])
loading_scores_PC1_sorted <- sort(loading_scores_PC1, decreasing = TRUE)
# 查看对主成分1贡献最大的变量
top_variables <- names(loading_scores_PC1_sorted[1:2])
top_variables
iris
数据集中,我们可以看到哪些变量对 PC1 和 PC2 的贡献最大,这些变量就是在数据集中造成样本差异的主要因素。通过查看加载分数,我们可以进一步分析每个变量在主成分上的权重,以确定哪些特征在样本分类中起关键作用。