R语言实现PCA主成分分析图的示例代码

 更新时间:2022年04月29日 08:32:34   作者:watermark's  
主成分分析(Principal Component Analysis,PCA)是一种无监督的数据降维方法,通过主成分分析可以尽可能保留下具备区分性的低维数据特征。本文将用R语言实现PCA主成分分析图,需要的可以参考一下

简介

主成分分析(Principal Component Analysis,PCA)是一种无监督的数据降维方法,通过主成分分析可以尽可能保留下具备区分性的低维数据特征。主成分分析图能帮助我们直观地感受样本在降维后空间中的分簇和聚合情况,这在一定程度上亦能体现样本在原始空间中的分布情况,这对于只能感知三维空间的人类来说,不失为一种不错的选择。

再举个形象的栗子,假如你是一本养花工具宣传册的摄影师,你正在拍摄一个水壶。水壶是三维的,但是照片是二维的,为了更全面的把水壶展示给客户,你需要从不同角度拍几张图片。下图是你从四个方向拍的照片:

PCA形象解释说明

第一张图里水壶的背面可以看到,但是看不到前面。

第二张图是拍前面,可以看到壶嘴,这张图可以提供了第一张图缺失的信息,但是壶把看不到了。

第三张俯视图既可以看到壶嘴,也可以看到壶把,但是无法看出壶的高度。

第四张图是你打算放进目录的,水壶的高度,顶部,壶嘴和壶把都清晰可见。

PCA的设计理念与此类似,它可以将高维数据集映射到低维空间的同时,尽可能的保留更多变量。

开始作图

使用 R 语言能做出像 SIMCA-P 一样的 PCA 图吗?

答案是肯定的,使用 R 语言不仅能做出像 SIMCA-P 一样的 PCA 图,还能做出比 SIMCA-P 更好看的图,而且好看的上限仅取决于个人审美风格。

1. PCA 分析图本质上是散点图

主成分分析图 = 散点图 + 置信椭圆,散点的横纵坐标对应 PCA 的第一主成分、第二主成分。

library(ggplot2)

# 数据准备
data = subset(iris, select = -Species)
class = iris[["Species"]]

# PCA
pca = prcomp(data, center = T, scale. = T)
pca.data = data.frame(pca$x)
pca.variance = pca$sdev^2 / sum(pca$sdev^2)

ggplot(pca.data, aes(x = PC1, y = PC2)) +
    geom_point(size = 3) +
    geom_hline(yintercept = 0) + 
    geom_vline(xintercept = 0) +
    stat_ellipse(aes(x = PC1, y = PC2), linetype = 2, size = 0.5, level = 0.95) + 
    theme_bw()

散点图+椭圆

2. 为不同类别着色

接下来想给散点加上分类颜色:

library(ggplot2)

# 数据准备
data = subset(iris, select = -Species)
class = iris[["Species"]]

# PCA
pca = prcomp(data, center = T, scale. = T)
pca.data = data.frame(pca$x)
pca.variance = pca$sdev^2 / sum(pca$sdev^2)

ggplot(pca.data, aes(x = PC1, y = PC2, color = class)) +
    geom_point(size = 3) +
    geom_hline(yintercept = 0) + 
    geom_vline(xintercept = 0) +
    stat_ellipse(aes(x = PC1, y = PC2), linetype = 2, size = 0.5, level = 0.95) + 
    theme_bw()

给不同类别样本着色

颜色是加上了,但是椭圆咋变成了 3 个?

原来是 stat_ellipse 函数默认对每个类别的数据计算自己的置信区间。如何对多类样本只计算一个置信区间呢?查看 stat_ellipse 的帮助文档:

inherit.aesdefault TRUE, If FALSE, overrides the default aesthetics, rather than combining with them. This is most useful for helper functions that define both data and aesthetics and shouldn't inherit behaviour from the default plot specification,

原来是 stat_ellipse 函数默认会继承 ggplot 中的 aes 设置,如果希望 stat_ellipse 使用自己的 aes 设置,需要将参数 inherit.aes 设置为 FALSE。

library(ggplot2)

# 数据准备
data = subset(iris, select = -Species)
class = iris[["Species"]]

# PCA
pca = prcomp(data, center = T, scale. = T)
pca.data = data.frame(pca$x)
pca.variance = pca$sdev^2 / sum(pca$sdev^2)

ggplot(pca.data, aes(x = PC1, y = PC2, color = class)) +
    geom_point(size = 3) +
    geom_hline(yintercept = 0) + 
    geom_vline(xintercept = 0) +
    stat_ellipse(aes(x = PC1, y = PC2), linetype = 2, size = 0.5, level = 0.95, inherit.aes = FALSE) + 
    theme_bw()

给不同类别样本着色

3. 样式微调

接下来对样式进行微调:为不同类别样本自定义着色,添加 x 轴、y 轴标题,添加 title:

library(ggplot2)

# 数据准备
data = subset(iris, select = -Species)
class = iris[["Species"]]

# PCA
pca = prcomp(data, center = T, scale. = T)
pca.data = data.frame(pca$x)
pca.variance = pca$sdev^2 / sum(pca$sdev^2)

# 自定义颜色
palette = c("mediumseagreen", "darkorange", "royalblue")

ggplot(pca.data, aes(x = PC1, y = PC2, color = class)) +
    geom_point(size = 3) +
    geom_hline(yintercept = 0) + 
    geom_vline(xintercept = 0) +
    stat_ellipse(aes(x = PC1, y = PC2), linetype = 2, size = 0.5, level = 0.95, inherit.aes = FALSE) + 
    theme_bw() +
    scale_color_manual(values = palette) +
    theme(panel.grid.major.x = element_blank(),
          panel.grid.minor.x = element_blank(),
          panel.grid.major.y = element_blank(),
          panel.grid.minor.y = element_blank()) +
    labs(x = paste0("PC1: ", signif(pca.variance[1] * 100, 3), "%"), 
         y = paste0("PC2: ", signif(pca.variance[2] * 100, 3), "%"), 
         title = paste0("PCA of iris")) +
    theme(plot.title = element_text(hjust = 0.5))

样式微调

将作图结果和 SIMCA-P 对比,散点、椭圆基本完全一致,只是比它更顺眼一些罢了~

到此这篇关于R语言实现PCA主成分分析图的示例代码的文章就介绍到这了,更多相关R语言 PCA主成分分析图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • R语言之dplyr包常用函数方法示例学习

    R语言之dplyr包常用函数方法示例学习

    这篇文章主要为大家介绍了R语言之dplyr包常用函数方法示例学习详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • R语言中fread使用方法

    R语言中fread使用方法

    在R语言中,fread函数是data.table包中的一个功能强大的数据读取函数,可以用于快速读取大型数据文件,它比基本的read.table和read.csv函数更快,尤其在处理大型数据集时效果更为明显,这篇文章主要介绍了R语言中fread使用方法,需要的朋友可以参考下
    2023-12-12
  • R语言学习VennDiagram包绘制韦恩图示例

    R语言学习VennDiagram包绘制韦恩图示例

    这篇文章主要为大家介绍了R语言学习VennDiagram包绘制韦恩图示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • R语言基本运算的示例代码

    R语言基本运算的示例代码

    这篇文章主要介绍了R语言基本运算的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • R语言apply系列函数实例详解

    R语言apply系列函数实例详解

    apply()函数是一种很强大的机制,下面这篇文章主要给大家介绍了关于R语言apply系列函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • R语言-实现list的嵌套与提取嵌套中的值

    R语言-实现list的嵌套与提取嵌套中的值

    这篇文章主要介绍了R语言-实现list的嵌套与提取嵌套中的值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • R语言矩阵知识点总结及实例分析

    R语言矩阵知识点总结及实例分析

    在本篇文章里小编给各位整理了一篇关于R语言矩阵知识点总结及实例分析,对此有兴趣的朋友们可以学习下。
    2021-04-04
  • R语言rhdf5读写hdf5并展示文件组织结构和索引数据

    R语言rhdf5读写hdf5并展示文件组织结构和索引数据

    这篇文章主要为大家介绍了R语言rhdf5读写hdf5并展示文件组织结构和索引数据,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • R语言绘制Bubble Matrix气泡矩阵图

    R语言绘制Bubble Matrix气泡矩阵图

    这篇文章主要为大家介绍了R语言绘制Bubble Matrix气泡矩阵图的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步
    2022-02-02
  • R语言绘图大小设定的操作

    R语言绘图大小设定的操作

    这篇文章主要介绍了R语言绘图大小设定的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04

最新评论