R语言中如何进行PCA分析?利用ggplot和prcomp绘制基因表达量分析图(上)

简介: R语言中如何进行PCA分析?利用ggplot和prcomp绘制基因表达量分析图

学习笔记的主要内容是在R语言中利用ggplot2进行PCA分析和绘图,包括简单分析与操作流程,对比不同方式得到的结果差异,提供脚本代码供练习(下载链接见文末)

PCA分析的原理

在处理基因差异表达数据时,有时候需要分析其中因素的影响最大,判断结果的关系,这个时候可以用PCA分析法,之前发过一篇PCA分析的简介和数学原理解析,如果有兴趣点击这里查看,今天的笔记主要围绕实际操作过程进行分享。笔者学习时参考易汉博的教程,感觉这个教程挺好的,推荐给大家,也可以在学习过程中一起交流。

PCA分析示例

创建演示数据

count <- 100 #设置变量个数为100
Ge_1a <- rnorm(count,4,0.6) #生成100个服从均值为4标准差为0.6正态分布的数字
Ge_1b <- rnorm(count,19,0.4)
gro_a <- rep('a',count) #生成100个a,代表a组
gro_b <- rep('b',count)

演示数据为Ge_1的表达量(每个基因包括两组类型的值各100个,且两个组的表达量有差异),接下来创建根据数据创建矩阵,设置样本的名称标签,添加新列R,并生成一个表格输出基因在200个样本中的表达量,每一行为一个样品,每一列为基因的表达值。

c_data <- data.frame(Ge_1=c(Ge_1a,Ge_1b),
                     Group=c(gro_a,gro_b))
label <- c(paste0(gro_a,1:count),paste0(gro_b,1:count))
row.names(c_data) <- label
c_data$R <- rep(0,count*2)
kable(headTail(c_data),booktabs=TRUE,
      caption="Expr Profile For Ge_1 in 200 samples")

生成了200行3列的表格数据,结果如下:

Table: Expr Profile For Ge_1 in 200 samples
|     |Ge_1  |Group |R   |
|:----|:-----|:-----|:---|
|a1   |4.77  |a     |0   |
|a2   |4.13  |a     |0   |
|a3   |4.15  |a     |0   |
|a4   |4.04  |a     |0   |
|...  |...   |NA    |... |
|b97  |18.93 |b     |0   |
|b98  |18.06 |b     |0   |
|b99  |18.74 |b     |0   |
|b100 |19.52 |b     |0   |

加载R包

library(knitr)
library(psych)
library(reshape2)
library(ggplot2)
library(ggbeeswarm)
library(scatterplot3d)
library(useful)
library(ggfortify)

需要加载上述R包,如果没有请先安装后载入R包。

绘制图像

p <- ggplot(c_data,aes(Ge_1,R)) + geom_quasirandom(
  aes(color=factor(Group))) +theme(legend.position = c(0.5,0.8)) +
  theme(legend.title = element_blank()) +
  scale_fill_discrete(name="Group") +
  theme(axis.line.y=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        axis.title.y=element_blank()) +
  ylim(-0.5,5) + xlim(0,25)
p

利用ggplot函数进行绘图,发现200个样本在Ge1基因表达量上分为了两类(原因是刚刚生成数据时分成了两个不同类型的组,表达量存在差异)

添加一个基因

刚刚是只有Ge1的情况,接下来再创建一个Ge_2(方法和刚刚类似),看看两个基因时情况会发生什么变化?创建一组均值为6标准差为0.3的正态分布随机数据,并设置行名构建矩阵,输出表达矩阵。需要注意的是:Ge_2的表达量保持稳定(a组和b组的表达水平相当),不像Ge_1存在表达量差异。

> count <- 100
> Ge_2a <- rnorm(count,6,0.3)
> Ge_2b <- rnorm(count,6,0.3)
> c2_data <- data.frame(Ge_1=c(Ge_1a,Ge_1b),Ge_2=c(Ge_2a,Ge_2b),
+                       Group=c(gro_a,gro_b))
> row.names(c2_data) <- label
> kable(headTail(c2_data),booktabs=T,
+                caption="Expression for Ge_1 and Ge_2 in 200 samples")
Table: Expression for Ge_1 and Ge_2 in 200 samples
|     |Ge_1  |Ge_2 |Group |
|:----|:-----|:----|:-----|
|a1   |4.77  |5.71 |a     |
|a2   |4.13  |5.65 |a     |
|a3   |4.15  |6.38 |a     |
|a4   |4.04  |5.88 |a     |
|...  |...   |...  |NA    |
|b97  |18.93 |6.06 |b     |
|b98  |18.06 |6.29 |b     |
|b99  |18.74 |5.78 |b     |
|b100 |19.52 |5.87 |b     |

利用ggplot函数作图,数据为c2data,此时能显示出Ge1Ge2的分布情况,可以看出在Ge_1(x轴)上分成了两类,而Ge_2上分类趋势很小(因为Ge_2本身就没什么差异分组)

p <- ggplot(c2_data,aes(Ge_1,Ge_2)) +
  geom_point(aes(color=factor(Group))) +
  theme(legend.position = c(0.5,0.8)) +
  theme(legend.title = element_blank()) +
  ylim(0,10)+xlim(0,25)
p

再添加一个基因

刚刚是两个基因,现在再加一个Ge_3,这个基因的表达量差异设置的更大一些,设置该基因分成两个组,而且每个组的表达量也存在两种类型,所以这个基因对样本分类的作用更大。

> count <- 100
> Ge_3a <- c(rnorm(count/2,6,0.4),rnorm(count/2,14,0.3))
> Ge_3b <- c(rnorm(count/2,14,0.3),rnorm(count/2,4,0.4))
> data_3 <- data.frame(Ge_1=c(Ge_1a,Ge_1b),
+                      Ge_2=c(Ge_2a,Ge_2b),
+                      Ge_3=c(Ge_3a,Ge_3b),
+                      Group=c(gro_a,gro_b))
> data_3 <- as.data.frame(data_3)
> data_3$Group <- as.factor(data_3$Group)
> row.names(data_3) <- label
> 
> kable(headTail(data_3),booktabs=T,caption = "Expression 3 Genes in 200 samples")
Table: Expression 3 Genes in 200 samples
|     |Ge_1  |Ge_2 |Ge_3 |Group |
|:----|:-----|:----|:----|:-----|
|a1   |4.77  |5.71 |5.61 |a     |
|a2   |4.13  |5.65 |6.38 |a     |
|a3   |4.15  |6.38 |6.47 |a     |
|a4   |4.04  |5.88 |5.82 |a     |
|...  |...   |...  |...  |NA    |
|b97  |18.93 |6.06 |3.57 |b     |
|b98  |18.06 |6.29 |4.37 |b     |
|b99  |18.74 |5.78 |4.18 |b     |
|b100 |19.52 |5.87 |4.82 |b     |

生成一组颜色变量,用于区分不同类别。每个数据向底面做垂直投影,可以看出在x轴方向(Ge_1)和z轴(Ge_3)上投影时在不同位置分成两类,而在y轴(Ge_2)上投影位于同一区域,所以可以看出Ge_2对样本分类的贡献度最小。

colorl <- c("#E19F90", "#96B4E9")
colors <- colorl[as.numeric(data_3$Group)]
scatterplot3d(data_3[,1:3],color=colors,xlim=c(0,24),
              ylim=c(0,24),zlim=c(0,24),type="h",
              angle=45,pch=16)
legend("top",legend=levels(data_3$Group),col=colorl,
       pch=16,xpd=T,horiz=T)

通过上面的演示,已经基本了解PCA的作用了,通过PCA分析能将不同基因在不同样本中的表达量分成几类,接下来,用简单的例子来演示流程。

相关文章
|
3月前
|
数据采集 机器学习/深度学习 数据可视化
R语言从数据到决策:R语言在商业分析中的实践
【9月更文挑战第1天】R语言在商业分析中的应用广泛而深入,从数据收集、预处理、分析到预测模型构建和决策支持,R语言都提供了强大的工具和功能。通过学习和掌握R语言在商业分析中的实践应用,我们可以更好地利用数据驱动企业决策,提升企业的竞争力和盈利能力。未来,随着大数据和人工智能技术的不断发展,R语言在商业分析领域的应用将更加广泛和深入,为企业带来更多的机遇和挑战。
|
2月前
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
58 3
|
7月前
|
数据可视化 数据挖掘 API
【R语言实战】聚类分析及可视化
【R语言实战】聚类分析及可视化
|
3月前
|
数据采集 数据可视化 数据挖掘
R语言在金融数据分析中的深度应用:探索数据背后的市场智慧
【9月更文挑战第1天】R语言在金融数据分析中展现出了强大的功能和广泛的应用前景。通过丰富的数据处理函数、强大的统计分析功能和优秀的可视化效果,R语言能够帮助金融机构深入挖掘数据价值,洞察市场动态。未来,随着金融数据的不断积累和技术的不断进步,R语言在金融数据分析中的应用将更加广泛和深入。
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
R语言在数据科学中的应用实例:探索与预测分析
【8月更文挑战第31天】通过上述实例,我们展示了R语言在数据科学中的强大应用。从数据准备、探索、预处理到建模与预测,R语言提供了完整的解决方案和丰富的工具集。当然,数据科学远不止于此,随着技术的不断发展和业务需求的不断变化,我们需要不断学习和探索新的方法和工具,以更好地应对挑战,挖掘数据的潜在价值。 未来,随着大数据和人工智能技术的普及,R语言在数据科学领域的应用将更加广泛和深入。我们期待看到更多创新的应用实例,为各行各业的发展注入新的动力。
|
4月前
|
数据采集 存储 数据可视化
R语言时间序列分析:处理与建模时间序列数据的深度探索
【8月更文挑战第31天】R语言作为一款功能强大的数据分析工具,为处理时间序列数据提供了丰富的函数和包。从数据读取、预处理、建模到可视化,R语言都提供了灵活且强大的解决方案。然而,时间序列数据的处理和分析是一个复杂的过程,需要结合具体的应用场景和需求来选择合适的方法和模型。希望本文能为读者在R语言中进行时间序列分析提供一些有益的参考和启示。
|
4月前
|
资源调度 数据挖掘
R语言回归分析:线性回归模型的构建与评估
【8月更文挑战第31天】线性回归模型是统计分析中一种重要且实用的工具,能够帮助我们理解和预测自变量与因变量之间的线性关系。在R语言中,我们可以轻松地构建和评估线性回归模型,从而对数据背后的关系进行深入的探索和分析。
|
4月前
|
机器学习/深度学习 数据采集
R语言逻辑回归、GAM、LDA、KNN、PCA主成分分类分析预测房价及交叉验证
上述介绍仅为简要概述,每个模型在实施时都需要仔细调整与优化。为了实现高度精确的预测,模型选择与调参是至关重要的步骤,并且交叉验证是提升模型稳健性的有效途径。在真实世界的房价预测问题中,可能还需要结合地域经济、市场趋势等宏观因素进行综合分析。
91 3
|
7月前
|
数据采集 数据可视化
利用R语言进行因子分析实战(数据+代码+可视化+详细分析)
利用R语言进行因子分析实战(数据+代码+可视化+详细分析)
|
7月前
|
Web App开发 数据可视化 数据挖掘
利用R语言进行聚类分析实战(数据+代码+可视化+详细分析)
利用R语言进行聚类分析实战(数据+代码+可视化+详细分析)