火山图大家应该是也基本上都没有问题,下面的MA图其实跟火山图非常的类似,两者都是log2FC信息,不同的是火山图展现P值,而MA图展现的是表达量情况!
- 火山图是为了说明log2FC比较大的一般来说具有统计学显著性
- 而MA图是为了说明log2FC无论大小,都不应该与表达量有相关性。
我们通常呢,挑选差异基因,会选择那些log2FC比较大而且具有统计学显著性的上下调基因,不过加上MA图,就可以进一步挑选那些表达量也比较高的,因为这样的基因呢,容易去实验验证。而且呢,通常情况下常识会告诉我们高表达量基因更容易发挥作用。
图例:
- (C) Differential gene expression between primary polyp calicoblasts and adult colony calicoblasts. Significant genes are shown in purple (adjusted p value <1e5, Fisher exact test).
- (D) Gene Ontology analysis for differentially expressed genes between polyp and adult calicoblasts.
当然了,也可以对kegg进行同样的分析,上下调基因独立进行富集注释:
来源文献:Liu et al. J Hematol Oncol (2021) 14:6 https://doi.org/10.1186/s13045-020-01021-x ,不过要画出上面的图还是有一点难度的, 如果你一直看的是我的代码,你会发现出图简直是不忍直视:
我的代码是:
## KEGG pathway analysis
### 做KEGG数据集超几何分布检验分析,重点在结果的可视化及生物学意义的理解。
if(T){
### over-representation test
kk.up <- enrichKEGG(gene = gene_up,
organism = 'hsa',
universe = gene_all,
pvalueCutoff = 0.9,#根据实际情况调整
qvalueCutoff =0.9)#根据实际情况调整
head(kk.up)[,1:6]
dotplot(kk.up );ggsave('kk.up.dotplot.png')
kk.down <- enrichKEGG(gene = gene_down,
organism = 'hsa',
universe = gene_all,
pvalueCutoff = 0.9,#根据实际情况调整
qvalueCutoff =0.9)#根据实际情况调整
head(kk.down)[,1:6]
dotplot(kk.down );ggsave('kk.down.dotplot.png')
kk.diff <- enrichKEGG(gene = gene_diff,
organism = 'hsa',
pvalueCutoff = 0.05)#根据实际情况调整
head(kk.diff)[,1:6]
dotplot(kk.diff );ggsave('kk.diff.dotplot.png')
kegg_diff_dt <- as.data.frame(kk.diff)
kegg_down_dt <- as.data.frame(kk.down)
kegg_up_dt <- as.data.frame(kk.up)
down_kegg<-kegg_down_dt[kegg_down_dt$pvalue<0.05,];down_kegg$group=-1
up_kegg<-kegg_up_dt[kegg_up_dt$pvalue<0.05,];up_kegg$group=1
## 原来的画图函数
source('functions.R')
g_kegg=kegg_plot(up_kegg,down_kegg)
print(g_kegg)
ggsave(g_kegg,filename = 'kegg_up_down.png')
### GSEA
kk_gse <- gseKEGG(geneList = geneList,
organism = 'hsa',
nPerm = 1000,#根据实际情况调整
minGSSize = 10,#根据实际情况调整
pvalueCutoff = 0.9,##根据实际情况调整
verbose = FALSE)
head(kk_gse)[,1:6]
gseaplot(kk_gse, geneSetID = rownames(kk_gse[1,]))
down_kegg<-kk_gse[kk_gse$pvalue<0.05 & kk_gse$enrichmentScore < 0,];down_kegg$group=-1
up_kegg<-kk_gse[kk_gse$pvalue<0.05 & kk_gse$enrichmentScore > 0,];up_kegg$group=1
g_kegg=kegg_plot(up_kegg,down_kegg)
print(g_kegg)
ggsave(g_kegg,filename = 'kegg_up_down_gsea.png')
}
然后很久以前的一个学徒在我的绘图代码上面进行了修饰:
### Update: Xiaojie Liang
### Date: 2021-07-12 23:38:07
### Email: liangxiaojiecom@163.com
### ---------------
library(ggthemes)
library(ggplot2)
go.kegg_plot <- function(up.data,down.data){
# up.data <- up.data
# down.data <- down.data
dat=rbind(up.data,down.data)
colnames(dat)
dat$p.adjust = -log10(dat$p.adjust)
dat$p.adjust=dat$p.adjust*dat$group
dat=dat[order(dat$p.adjust,decreasing = F),]
gk_plot <- ggplot(dat,aes(reorder(Description, p.adjust), y=p.adjust)) +
geom_bar(aes(fill=factor((p.adjust>0)+1)),stat="identity", width=0.7, position=position_dodge(0.7)) +
coord_flip() +
scale_fill_manual(values=c("#0072B2", "#B20072"), guide=FALSE) +
labs(x="", y="" ) +
theme_pander() +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
#axis.ticks.x = element_blank(),
axis.line.x = element_line(size = 0.3, colour = "black"),#x轴连线
axis.ticks.length.x = unit(-0.20, "cm"),#修改x轴刻度的高度,负号表示向上
axis.text.x = element_text(margin = margin(t = 0.3, unit = "cm")),##线与数字不要重叠
axis.ticks.x = element_line(colour = "black",size = 0.3) ,#修改x轴刻度的线
axis.ticks.y = element_blank(),
axis.text.y = element_text(hjust=0),
panel.background = element_rect(fill=NULL, colour = 'white')
)
}
效果如下:
啊,扯远了,我们这个教程其实是想征集大家的代码,关于上下调基因各自独立进行GO数据库的3分类富集后的可视化:
首先进行上下调基因的ID转换
前面的表达量矩阵差异分析代码我这里就不再赘述啦,我们分析已经拿到了 gene_up 和 gene_down 这两个变量(简单的向量而已)代表的上下调差异基因哦!
library(org.Hs.eg.db)
#把SYMBOL转换ENTREZID,这里会损失一部分无法匹配到的
gene_up=as.character(na.omit(AnnotationDbi::select(org.Hs.eg.db,
keys = gene_up,
columns = 'ENTREZID',
keytype = 'SYMBOL')[,2]))
gene_down=as.character(na.omit(AnnotationDbi::select(org.Hs.eg.db,
keys = gene_down,
columns = 'ENTREZID',
keytype = 'SYMBOL')[,2]))
通常使用clusterProfiler包做GO和KEGG数据库富集需要的是 ENTREZID的ID系统,所以转换一下。
然后上下调基因独立进行GO数据库富集
代码仍然是很简单:
library(clusterProfiler)
#对正相关基因进行富集分析
go <- enrichGO(gene_up, OrgDb = "org.Hs.eg.db", ont="all")
library(ggplot2)
library(stringr)
barplot(go, split="ONTOLOGY")+ facet_grid(ONTOLOGY~., scale="free")+
ggsave('gene_up_GO_all_barplot.png')
go=DOSE::setReadable(go, OrgDb='org.Hs.eg.db',keyType='ENTREZID')
write.csv( go@result,file = 'gene_up_GO_all_barplot.csv')
#对负相关基因进行富集分析
go <- enrichGO(gene_down, OrgDb = "org.Hs.eg.db", ont="all")
barplot(go, split="ONTOLOGY")+ facet_grid(ONTOLOGY~., scale="free")+
ggsave('gene_down_GO_all_barplot.png')
go=DOSE::setReadable(go, OrgDb='org.Hs.eg.db',keyType='ENTREZID')
write.csv( go@result,file = 'gene_down_GO_all_barplot.csv')
这样有了最原始的图,如何绘制成为文章开头的美图呢?
学徒作业
看我六年前的表达芯片的公共数据库挖掘系列推文 :
- 解读GEO数据存放规律及下载,一文就够
- 解读SRA数据库规律一文就够
- 从GEO数据库下载得到表达矩阵 一文就够
- GSEA分析一文就够(单机版+R语言版)
- 根据分组信息做差异分析- 这个一文不够的
- 差异分析得到的结果注释一文就够
完成数据集:https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE97251 的表达量矩阵差异分析 :
GSM2560200 plasmaRNA_health H13
GSM2560201 plasmaRNA_health H5
GSM2560202 plasmaRNA_health H8
GSM2560203 plasmaRNA_OSCC X474
GSM2560204 plasmaRNA_OSCC X574
GSM2560205 plasmaRNA_OSCC X602
这个数据集是很简单的两个分组,芯片平台是 Agilent-079487 Arraystar Human LncRNA microarray V4
如果确实感兴趣也可以去和原文对比:Screening and validation of plasma long non-coding RNAs as biomarkers for the early diagnosis and staging of oral squamous cell carcinoma. Oncol Lett 2021 Feb;21(2):172. PMID: 33552289
我需要大家完成文章开头的美图,并且给出来代码!