R 语言小白绘图系列
第 43 弹|主成分分析PCA图
PCA图简介
主成分分析 (PCA, Principal Component Analysis) 是一种常用的降维技术,主要用于处理高维数据集,将数据转换为低维空间,以便更好地可视化或简化后续分析。以下是关于 PCA 图的一些简单介绍:
1. PCA 的目的
PCA 主要用于将高维数据投影到一个低维空间,同时保留尽可能多的原始数据信息。它通过找到数据中的主要变化方向(主成分),并按方差大小依次排序来实现降维。
2. PCA 图解释
PCA 图通常是二维(2D)或三维(3D)图表,展示数据在前两个或前三个主成分(PC1、PC2、PC3)上的分布情况。这些主成分是数据的主要变化方向,通常每个主成分对应一个轴。以下是 PCA 图的一些常见元素:
数据点: 每个点代表一个样本,在新的主成分空间中进行表示。不同类别的数据点可以用不同颜色或形状表示。 PC1 和 PC2: 通常是前两个主成分(即方差贡献最大的两个维度)。X 轴通常代表第一个主成分 (PC1),Y 轴代表第二个主成分 (PC2)。 方差解释: 图中会标注每个主成分的方差贡献率,显示该主成分在数据中捕捉的方差信息。例如,PC1 的方差解释可能为70%,PC2可能为20%,表示这两个主成分一起捕获了90%的数据变化信息。 样本聚类: PCA 图可以帮助识别样本的分组和聚类情况,不同类别或组别可能在图上表现出聚集或分离的趋势。
3. PCA 图的应用
数据可视化: 通过将高维数据简化为2D或3D,PCA 图使得复杂的数据更易于理解和可视化。 噪声消除: 通过保留最具信息的主成分,PCA 还能帮助去除数据中的噪声。 特征选择和模型优化: PCA 常用于特征选择,通过剔除解释方差少的主成分,减少数据维度,进而提升机器学习模型的效率和性能。
4. 如何解释 PCA 图
主成分的方向与解释力: 第一主成分(PC1)表示最大的数据变化方向,第二主成分(PC2)表示第二大变化方向。PC1 和 PC2 的方向不同,说明数据变化的主要方向不同。 样本点的位置: 相似的样本在 PCA 图上通常聚集在一起,距离较远的点表示它们在原始空间中的差异较大。
总之,PCA 图是一种直观展示高维数据中主要变化趋势的工具,特别适合用来探索数据结构、识别异常点和发现潜在的模式。
应用实例
本案例中有7个基因,我们想知道能否通过这7个基因的表达量区分高低风险的患者;如果直接对这7个基因可视化,需要绘制一个七维的图形;通过PCA可以进行降维,把7个基因的信息压缩到PC1和PC2中,以便更好地可视化。
下图中:横坐标是PC1,纵坐标是PC2;PC1和PC2中压缩了7个基因的表达信息;红色点代表高风险患者,蓝色点代表低风险患者,图中高低风险患者是分明的,这表明通过这7个基因的表达量可以将高低风险的患者区分开。
源文件
输入文件包含
id: 样品名称 分组:Risk(临床分期等亦可) 7个基因的表达量
代码
环境准备
这段代码的目的是安装并加载ggplot2
包,用于可视化操作,并为主成分分析(PCA)准备输入输出文件和设置工作目录。以下是逐行解释:
逐行解释:
# 安装ggplot2包
install.packages("ggplot2")
这行代码用于安装 ggplot2
包,ggplot2
是R中最常用的用于数据可视化的包,能够创建高度自定义的图形,包括PCA图。
# 加载ggplot2包
library(ggplot2)
加载 ggplot2
包,以便后续进行绘图操作,特别是用于PCA结果的可视化。
# 设置输入文件、输出文件和工作目录
inputFile = "input.txt" # 定义输入数据文件
outFile = "PCA.pdf" # 定义输出PDF文件名,用于保存PCA结果图
inputFile
:设置要读取的数据文件,文件名为input.txt
,这个文件应该包含进行PCA分析的数据。outFile
:设置输出文件名为PCA.pdf
,将绘制的PCA图保存到这个PDF文件中。
# 设置工作目录
setwd("D:\\biowolf\\bioR\\45.PCA")
这行代码将当前工作目录设置为 D:\\biowolf\\bioR\\45.PCA
。R将在这个目录中查找输入文件,并将输出文件保存到该路径下。
总结
这段代码的功能是安装并加载ggplot2
包,设置主成分分析(PCA)的输入文件和输出文件,以及指定工作目录。接下来可以从input.txt
中读取数据,进行PCA分析,并将结果保存为PDF文件。
读取输入文件并整理
这段代码的目的是从输入文件 input.txt
中读取数据,并进行初步处理以准备进行主成分分析(PCA)。以下是逐行解释:
# 读取输入数据文件
rt = read.table(inputFile, header = TRUE, sep = "\t", check.names = FALSE, row.names = 1)
这行代码从 input.txt
文件中读取数据,并将其存储在数据框rt
中。header = TRUE
:文件的第一行是列名。sep = "\t"
:数据是以制表符(\t
)分隔的。check.names = FALSE
:保持原始列名,不修改。row.names = 1
:将文件的第一列作为行名,而不是数据的一部分。
# 提取数值数据,去除第一列
data = rt[, c(2:ncol(rt))]
这行代码从数据框 rt
中提取从第二列开始的所有数据,并存储在变量data
中。通常,在PCA分析中,我们只使用数值数据进行降维,而第一列可能是样本类型或其他信息,不适合直接进行PCA。
# 提取第一列的样本分组信息
Type = rt[, 1]
这行代码提取数据框 rt
的第一列,并将其存储在变量Type
中。Type
可能是分类标签或样本类型信息,例如不同的实验组(如"Control"、"Treatment"等),可以在PCA结果中作为分类依据。
# 提取第一列的列名
var = colnames(rt)[1]
这行代码获取数据框 rt
的第一列的列名,并存储在变量var
中。这样可以在后续分析或绘图中使用这个列名作为参考。
数据准备总结:
data
:存储了从第二列开始的数值型数据,将用于PCA分析。Type
:存储了第一列的信息,通常是样本的分类标签或组别。var
:存储了第一列的列名,以便后续分析中引用。
现在数据已经被整理好,可以进行PCA分析,并根据Type
(样本分组)可视化PCA结果。
PCA分析
这段代码的目的是执行主成分分析(PCA),并将结果整合到一个新的数据框中,用于后续的可视化。以下是逐行解释:
# 进行主成分分析(PCA)
data.pca = prcomp(data, scale. = TRUE)
prcomp()
:这是R中用于执行PCA的函数。data
:之前从数据框rt
提取的数值型数据(去除了样本分组信息)。scale. = TRUE
:将数据标准化,使每列数据的方差为1。这对于具有不同尺度的变量非常有用,确保不同变量在PCA中具有相同的权重。
# 使用PCA模型预测主成分值
pcaPredict = predict(data.pca)
predict(data.pca)
:应用PCA模型,计算每个样本的主成分值(即每个样本在新的主成分坐标空间中的投影)。输出是一个矩阵,每一列是一个主成分,每一行是一个样本。第一列是 PC1
,代表样本在第一个主成分方向上的投影。第二列是 PC2
,代表样本在第二个主成分方向上的投影。
# 创建一个新的数据框,将PC1、PC2和样本类型组合
PCA = data.frame(PC1 = pcaPredict[,1], PC2 = pcaPredict[,2], Type = Type)
这行代码创建了一个新的数据框 PCA
,其中包含以下三列:PC1
:每个样本在第一个主成分方向上的得分(投影)。PC2
:每个样本在第二个主成分方向上的得分(投影)。Type
:样本类型信息,即之前从数据框rt
的第一列提取的分组标签。它通常用于区分不同组的样本(例如不同实验组)。
数据准备总结:
data.pca
:PCA模型,包含主成分分析的结果。pcaPredict
:每个样本在PCA空间中主成分的投影,包含所有主成分(PC1、PC2等)。PCA
:最终的数据框,包含每个样本的主成分得分(PC1、PC2)以及样本的分组信息(Type
),为后续的可视化准备好了数据。
接下来,可以使用 ggplot2
对 PCA 结果进行可视化,展示不同样本组在PC1和PC2平面中的分布情况。
定义颜色
这段代码的目的是根据样本的分组数量动态地生成颜色向量,用于后续的PCA结果可视化。具体解释如下:
# 设置默认颜色为红色和蓝色
col = c("red", "blue")
这行代码先定义了一个初始的颜色向量 col
,其中包含红色 ("red"
) 和蓝色 ("blue"
)。如果样本只有两个分组(比如对照组和实验组),这两个颜色将用于绘制图形。
# 如果分组数多于两个,动态生成颜色
if (length(levels(factor(Type))) > 2) {
col = rainbow(length(levels(factor(Type))))
}
length(levels(factor(Type))) > 2
:首先,factor(Type)
将Type
(样本分组信息)转换为因子,levels()
获取不同分组的种类,length()
计算分组的数量。这部分逻辑检查样本分组的数量。如果分组数量大于2,就执行以下动态颜色生成。 col = rainbow(length(levels(factor(Type))))
:如果分组数多于两个,使用rainbow()
函数生成一个彩虹色谱的颜色向量,颜色数量等于分组数量。这确保了不同的组别有不同的颜色。
解释总结:
如果样本的分组数量只有两个,则颜色将是预定义的红色和蓝色。 如果分组数量大于两个,则生成对应分组数量的彩虹颜色,确保每个组有不同的颜色。
绘制
这段代码的目的是使用ggplot2
绘制PCA图,并根据样本分组(Type
)对点进行着色,最终将图形保存为PDF文件。以下是逐行解释:
# 打开PDF设备,准备保存图像
pdf(file = outFile, height = 4.5, width = 5.5)
这行代码设置PDF输出设备,定义输出文件名为 outFile
(之前定义为"PCA.pdf"
)。设置PDF文件的高度为4.5英寸,宽度为5.5英寸。
# 绘制PCA图
p = ggplot(data = PCA, aes(PC1, PC2)) +
geom_point(aes(color = Type)) +
scale_colour_manual(name = var, values = col) +
theme_bw() +
theme(plot.margin = unit(rep(1.5, 4), 'lines')) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())
逐行解释:
ggplot(data = PCA, aes(PC1, PC2))
:
使用 ggplot()
创建一个基础图层,指定数据框为PCA
,并设置主成分1(PC1
)作为x轴,主成分2(PC2
)作为y轴。
geom_point(aes(color = Type))
:
添加点图( geom_point()
),每个点代表一个样本。aes(color = Type)
:根据样本的分组信息(Type
)对点进行着色,确保不同组的样本用不同颜色表示。
scale_colour_manual(name = var, values = col)
:
手动设置颜色比例尺。 name = var
:将颜色图例的标题设置为var
(之前提取的第一列的列名,通常是分组信息的名称)。values = col
:将之前生成的颜色向量col
应用于不同的分组,这确保每个组使用定义好的颜色(如红、蓝或彩虹色)。
theme_bw()
:
使用 theme_bw()
,这是ggplot2
中的一个主题,提供一个白色背景和较简洁的外观。
theme(plot.margin = unit(rep(1.5, 4), 'lines'))
:
设置图形的边距为1.5行的宽度,确保图形不会被剪切。 unit(rep(1.5, 4), 'lines')
表示所有边距都设置为1.5行的宽度。
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())
:
移除网格线。 panel.grid.major = element_blank()
:移除主要网格线。panel.grid.minor = element_blank()
:移除次要网格线,使图形更简洁。
# 打印图像
print(p)
print(p)
:将生成的PCA图像p
输出到当前的PDF设备(outFile
)。
# 关闭PDF设备,保存绘图
dev.off()
dev.off()
:关闭PDF设备,完成文件的保存,图像已写入到指定的PDF文件中。
总结
这段代码使用ggplot2
生成了一个PCA图,根据样本分组信息(Type
)对样本点进行着色,并通过PDF保存图像。绘图中还手动设置了颜色,调整了边距和网格线,使图形更清晰简洁。
本文作者:充电宝团队
现在:
长按扫码关注:科研生信充电宝
10元赞赏本文,即喜欢作者~
即可直接解锁:
《R语言小白绘图系列|第43弹·主成分分析PCA图》对应资源哦~
看到这里你还不心动吗?
赶紧关注、转发、点赞、分享,领取你的专属福利吧~
好啦,以上就是今天推文的全部内容啦!
版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本公众号不拥有所有权,也不承担相关法律责任。
如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:kysxcdb@163.com 进行举报,一经查实,本公众号将立刻删除涉嫌侵权内容。