GEO挖掘实战二、差异分析及富集分析

「生信技能树」三阴性乳腺癌表达矩阵探索 系列笔记
GEO挖掘实战一、初步探索数据 -
GEO挖掘实战二、差异分析及富集分析 -
GEO挖掘实战三、GSVA -
GEO挖掘实战四、TNBC相关探索 -

在之前的步骤中,已经准备好表达矩阵与分组信息;并且在两组分组存在一定区分度。接下来就可进行差异分析。得到差异基因结果后可绘制火山图、热图;进行富集分析(ORF,GSEA)等。

4、limma差异分析

芯片数据的差异分析一般使用limma包

4.1

#可选
#先随便选择一个探针在两组样本间的分布进行可视化
rm(list = ls())
load('exp_group.Rdata')
library(ggpubr)
bp=function(g){
  df <- data.frame(gene=g,group=group_list)
  ggboxplot(df, x='group', y='gene',
            color = "group", palette = 'jco',
            add = "jitter") +  #散点图抖动
    stat_compare_means()  #添加p值
}
bp(exp[2,])
4-1

4.2、limma差异分析

library(limma)
design <- model.matrix(~factor(group_list))
fit=lmFit(exp, design)
fit=eBayes(fit)
options(digits = 4)
deg <- topTable(fit,coef=2,adjust='BH',number = Inf)
head(deg,3)
t.test(exp[rownames(deg)[1],]~group_list)
bp(exp[rownames(deg)[1],])


4-2

如上图,logFC即logFoldchange,为raw counts变化倍数的log值。由于数据已经是log后的所有是两组对应的均值的差值。
此外根据logFC的正负性,我们能够判断这里是TNBC与nonTNBC相比。若想修改比较顺序,简单的方法是直接取logFC的相反数即可

4-3

TCGA学习02:差异分析 - 的笔记中是limma配合edgeR包差异分析的pipeline,二者区别暂时还未弄清。

4.3、探针名转化

  • 差异分析后,围绕差异基因,探究其背后的生物意义。这里就要即将探针名转换成有意义的基因ID
  • 芯片探针ID转换可参考用R获取芯片探针与基因的对应关系三部曲-bioconductor | 生信菜鸟团
  • 首先了解芯片平台信息,再下载对应R包,最后转化ID即可。


    4.3-1

    4.3-2
if (!require("hgu133plus2.db"))
  BiocManager::install("hgu133plus2.db")
ls('package:hgu133plus2.db')
ids <- toTable(hgu133plus2SYMBOL)
#得到这个平台里,所有探针与基因名(symbol格式)的对应关系
ide <- toTable(hgu133plus2ENTREZID)
head(ids);dim(ids)
head(ide);dim(ide)
deg$probe_id=rownames(deg)
deg <- merge(deg, ids, by='probe_id')
deg <- merge(deg, ide, by='probe_id')
head(deg)

save(deg, file = 'deg.Rdata')
rm(list = ls())

此外知道symbol等标准基因ID后,也可通过clusterProfiler包进行基因名间的转换。例如
4.3-3

5、差异分析结果可视化

5.1、火山图

load('deg.Rdata')
head(deg)
deg$change=as.factor(
  ifelse(deg$P.Value>0.01, 'stable', 
          ifelse(deg$logFC>1.5,'UP',
                 ifelse(deg$logFC< -1.5,'DOWN','stable'))
         )
  )
table(deg$change)
deg$'-log10(pvalue)' <- -log10(deg$P.Value)
head(deg)
ggscatter(deg, x="logFC", y="-log10(pvalue)",
          color="change",size = 0.7,
          label = "symbol", repel = T, #自动调整标签位置
          label.select = c("AGR3","CYP4Z1","PROM1","SHC4"))

save(deg,file = "deg.Rdata")
rm(list = ls())
5.1

此外也可利用ggplot绘制,可参考TCGA学习02:差异分析 -

5.2、热图

  • 绘制热图根据差异探针,选取表达矩阵的子集;
  • 这里我们分别选取上调、下调的top100基因绘图。
load("deg.Rdata")
head(deg)
tmp <- deg$logFC; names(tmp) <- deg$probe_id
head(tmp)
cg_up <- names(head(sort(tmp,decreasing = T),100))
cg_down <- names(head(sort(tmp),100))

load("exp_group.Rdata")
n=t(scale(t(exp[c(cg_up,cg_down),])))
n[n>2]=2; n[n< -2]= -2
n[1:4,1:4]
group_dat <- data.frame(group=group_list, row.names = colnames(exp))
library(pheatmap)
pheatmap(n,
         show_rownames = F,
         show_colnames = F,
         #cluster_cols = F,
         annotation_col = group_dat)
5.2

6、富集分析

之前学习RNA-seq转录组学习时,对富集分析的概念与流程有过一定的了解。主要分为ORF与GESA两类,都可用clusterProfiler包完成。在曾老师的视频中后者是使用了MsigDB的数据集进行分析的。
-RNA-seq学习:No.5富集分析--ORF过表达 -
-RNA-seq学习:No.6富集分析--GESA -

6.1 ORF过表达富集分析

主要需要上下调基因的ENTREZID

rm(list=ls())
library(clusterProfiler)
load('deg.Rdata')
gene_up <- deg[deg$change=="UP","gene_id"]
gene_down <- deg[deg$change=="DOWN","gene_id"]

##kegg.up
kk.up <- enrichKEGG(gene = gene_up,
                    organism = "hsa",
                    pvalueCutoff = 0.9,
                    qvalueCutoff = 0.9)
head(kk.up)
kegg_up_dt <- as.data.frame(kk.up)
##kegg.down
kk.down <- enrichKEGG(gene = gene_down,
                    organism = "hsa",
                    pvalueCutoff = 0.9,
                    qvalueCutoff = 0.9)
head(kk.down)
kegg_down_dt <- as.data.frame(kk.down)
kegg_plot <- function(up_kegg,down_kegg){
dat=rbind(up_kegg,down_kegg)
dat$pvalue <- -log10(dat$pvalue)
dat$pvalue <- dat$pvalue*dat$group
dat=dat[order(dat$pvalue,decreasing = F),]
ggplot(dat, aes(x=reorder(Description,order(pvalue,decreasing= F)),y=pvalue, fill=group)) + 
  #x轴按对应的pvalue值从大到小排列pathway的Description
  geom_bar(stat='identity') +
  #设置柱状图高低直接为数值大小,而不是counts
  scale_fill_gradient(low="blue",high = "red", guide = F) +
  scale_x_discrete(name="pathway names") +
  #针对字符型轴标签注释
  scale_y_continuous(name="log10P-value") +
  #针对连续型轴标题注释
  coord_flip() + theme_bw() + theme(plot.title = element_text(hjust = 0.5)) +
  ggtitle("pathway enrichment")
}
up_kegg <- kegg_up_dt[kegg_up_dt$pvalue<0.05,];up_kegg$group <- -1
down_kegg <- kegg_down_dt[kegg_down_dt$pvalue<0.05,];down_kegg$group <- 1
kegg_plot(up_kegg,down_kegg)
  • 分别查看上下调基富集到哪些通路里。


    6.1

此外还有 go的富集分析大同小异,这里不做介绍,可参考上面的链接。

6.2 GSEA的FCS富集分析(基于MsigDB数据库)

(1)genelist

需要准备genelist数值型字符串,即为logFC值,从大到小排列;并以ENTREZID/SYMBOL命名。

rm(list = ls())
load("deg.Rdata")
head(deg);table(deg$change)
dat <- deg[deg$change %in% c("DOWN","UP"), c('logFC','gene_id')]
dim(dat);head(dat)
genelist <- dat$logFC
names(genelist) <- dat$gene_id
genelist <- sort(genelist, decreasing = T)

(2)下载MsigDB

  • GSEA | MSigDB https://www.gsea-msigdb.org/gsea/msigdb/index.jsp
    需要注册一个邮箱,才能下载。这里我们用的ENTREZID,故下载对应的版本即可,保存到自己工作目录的一个子目录即可。
d <- "./msigdb/"
gmts <- list.files(d, pattern = 'all')
gmts
#[1] "c1.all.v7.1.entrez.gmt" "c2.all.v7.1.entrez.gmt" "c3.all.v7.1.entrez.gmt"
#[4] "c4.all.v7.1.entrez.gmt" "c5.all.v7.1.entrez.gmt" "c6.all.v7.1.entrez.gmt"
#[7] "h.all.v7.1.entrez.gmt" 

(3)富集分析

if (!require("BiocManager"))
  install.packages("BiocManager")
if (!require("GSEABase"))
  BiocManager::install("GSEABase")
gsea_results <- lapply(gmts, function(gmtfile){
  geneset <- read.gmt(file.path(d,gmtfile))
  print(paste0("Now process the ", gmtfile))
  egmt <- GSEA(genelist, 
               TERM2GENE = geneset, 
               pvalueCutoff = 0.05) #默认值,导致有的数据库就没有富集到,可适当调大)
  head(egmt)
  return(egmt)
})
gsea_results_df <- lapply(gsea_results, function(x){
  cat(paste(dim(x@result)), '\n')
  x@result
}) #得到的list包含各个result

gsea_results_df <- do.call(rbind,gsea_results_df) #合并list里的所有result

gseaplot(gsea_results[[2]],gsea_results[[2]]@result$ID[3])
gsea_results[[2]]@result$ID[3]

如下图,可看出差异基因在这个geneset里主要富集下调了。更多解读可见上文的笔记链接。此外clusterfile包也可做GSEA分析,主要是go、kegg数据库。


6.2

你可能感兴趣的:(GEO挖掘实战二、差异分析及富集分析)