从不会到不怕——用R语言搞懂PCA

文摘   2024-11-07 04:43   德国  

PCA 是一种统计方法,用于减少数据集的维度,同时尽可能保留数据中的方差。PCA 的核心思想是将数据投射到少数几个主成分上,以便我们可以在二维或三维图上直观地观察数据的分布。

数据介绍

在这个示例中,我们使用 R 中自带的 iris 数据集。该数据集包含 150 行数据,每行代表一种鸢尾花样本。数据集中有 4 个数值变量(Sepal.LengthSepal.WidthPetal.LengthPetal.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$rotationloading_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 的贡献最大,这些变量就是在数据集中造成样本差异的主要因素。

通过查看加载分数,我们可以进一步分析每个变量在主成分上的权重,以确定哪些特征在样本分类中起关键作用。

Dr Leo
ENT医生的科研分享
 最新文章