指定通路绘制gsea图热图和火山图

2022-07-26 10:23:09 浏览数 (1)

前面在 所有的肿瘤都有恶性增殖的特性吗,我们发现了绝大部分癌症都有MKI67和TOP2A这样的细胞增殖通路相关基因的高表达,最后的gsea分析结果里面展示的通路包括:

代码语言:javascript复制
2.4 Replication and repair
03030 DNA replication
03410 Base excision repair
03420 Nucleotide excision repair
03430 Mismatch repair
03440 Homologous recombination
03450 Non-homologous end-joining
03460 Fanconi anemia pathway


4.2 Cell growth and death
04110  Cell cycle

但是我们直接是对gsea分析结果的最终es值在可视化,所以是行是通路,列是癌症的,数值是gsea的es打分的矩阵。对初学者来说, 跳过了大量细节,所以跟这个教程会比较吃力,有粉丝就提问了希望可以对这些通路在在具体的癌症里面细化展示,比如绘制gsea图,热图和火山图。

gsea分析大家都没有问题:

代码语言:javascript复制

nrDEG=DEG_limma_voom[,c(1,4)]
colnames(nrDEG)=c('log2FoldChange','pvalue')
head(nrDEG) 

library(org.Hs.eg.db)
library(clusterProfiler)
gene <- bitr(rownames(nrDEG), fromType = "SYMBOL",
             toType =  "ENTREZID",
             OrgDb = org.Hs.eg.db)
gene$logfc <- nrDEG$log2FoldChange[match(gene$SYMBOL,rownames(nrDEG))]
head(gene)
geneList=gene$logfc
names(geneList)=gene$ENTREZID 
geneList=sort(geneList,decreasing = T)
head(geneList)

R.utils::setOption( "clusterProfiler.download.method",'auto' )
library(clusterProfiler)
kk_gse <- gseKEGG(geneList     = geneList,
                  organism     = 'hsa',
                  nPerm        = 1000,
                  minGSSize    = 10,
                  pvalueCutoff = 0.9,
                  verbose      = FALSE)
tmp=kk_gse@result
kk=DOSE::setReadable(kk_gse, OrgDb='org.Hs.eg.db',keyType='ENTREZID')
tmp=kk@result
pro='test_gsea'
write.csv(kk@result,paste0(pro,'_kegg.gsea.csv'))

对上面的结果,进行查看统计学显著的上下调通路。

代码语言:javascript复制
# 这里如果找不到显著下调的通路,可以选择调整阈值,或者其它。
kk_gse=kk
down_kegg<-kk_gse[kk_gse$pvalue<0.1 & kk_gse$enrichmentScore < -0.5,];down_kegg$group=-1
up_kegg<-kk_gse[kk_gse$pvalue<0.1 & kk_gse$enrichmentScore > 0.5,];up_kegg$group=1

save(up_kegg,kk,file = 'up_kegg.by.gsea.Rdata') 

首先批量针对每个通路绘制gsea图:

代码语言:javascript复制
pro='gsea'
lapply(1:nrow(up_kegg), function(i){ 
  gseaplot2(kk,up_kegg$ID[i],
            title=up_kegg$Description[i],pvalue_table = T)
  ggsave(paste0(pro,'_up_kegg_',
                gsub('/','-',up_kegg$Description[i]),
                '.pdf'))
})

然后 批量针对每个通路绘制热图,需要提取每个通路里面的基因列表:

代码语言:javascript复制
lapply(1:nrow(up_kegg), function(i){ 
 cg = strsplit(up_kegg$core_enrichment[i],'/')[[1]]
 
 dat=log2(edgeR::cpm(exprSet) 1)
 dat[1:4,1:4] 
 table(group_list)
library(pheatmap)
 pheatmap(dat[cg,],show_colnames =F,show_rownames = F) #对那些提取出来的1000个基因所在的每一行取出,组合起来为一个新的表达矩阵
 n=t(scale(t(dat[cg,]))) # 'scale'可以对log-ratio数值进行归一化
 n[n>2]=2 
 n[n< -2]= -2
 n[1:4,1:4]
 pheatmap(n,show_colnames =F,show_rownames = F)
 ac=data.frame(group=group_list)
 rownames(ac)=colnames(n) 
 pheatmap(n,show_colnames =F,show_rownames = T,
          annotation_col=ac)
 pheatmap(n,show_colnames =F,show_rownames = T,
          annotation_col=ac,
          filename =  paste0(pro,'_up_kegg_pheatmap_',
                                      gsub('/','-',up_kegg$Description[i]),
                                      '.pdf')) 
 }) 

然后 批量针对每个通路绘制火山图,把每个通路里面的基因列表标记在火山图里面,这个时候仍然是分成两步走,首先绘制一个火山图 (不同的包做差异分析得到的矩阵列名不一样,下面是DEseq2的结果举例哦 ):

代码语言:javascript复制

## for volcano
logFC_cutoff <- with(DEG_DEseq2,mean(abs( log2FoldChange))   2*sd(abs( log2FoldChange)) );logFC_cutoff
logFC_cutoff
logFC_t=3

DEG_DEseq2$change = as.factor(ifelse(DEG_DEseq2$pvalue < 0.05 & abs(DEG_DEseq2$log2FoldChange) > logFC_t,
                                   ifelse(DEG_DEseq2$log2FoldChange > logFC_t ,'up','down'),'not')
)
table(DEG_DEseq2$change)
 
library(ggplot2)
library(ggstatsplot)
library(ggsci)
p_v = ggplot(data=DEG_DEseq2, 
              aes(x=log2FoldChange, y=-log10(pvalue), 
               color=change))  
  geom_point(alpha=0.4, size=1.75)  
  xlab("logFC")   
  ylab("-log10 pvalue")   
  theme_ggstatsplot() 
  geom_vline(xintercept= 0,lty=4,col="grey",lwd=0.8)  
  theme(plot.title = element_text(size=12,hjust = 0.5),
        panel.grid = element_line(colour = 'white')) 
  scale_color_manual(values=c("#34bfb5", "#828586","#ff6633")
  ) 
dev.off()
p_v
ggsave(p_v,filename = 'step4_deg_volcano.png',height = 6,width = 5)

然后循环感兴趣的每个 通路,去叠加到上面的火山图里面 :

代码语言:javascript复制

lapply(1:nrow(up_kegg), function(i){ 
  cg = strsplit(up_kegg$core_enrichment[i],'/')[[1]]
  cgd = DEG_DEseq2[cg,] 
  head(cgd)
  cgd$gene = rownames(cgd)
  p_v    ggrepel::geom_text_repel(data=cgd,
                                  aes(x=log2FoldChange, 
                                      y=-log10(padj),
                                      label= gene) ,
                                  min.segment.length = 0, 
                                  max.overlaps=30
  )
  ggsave(paste0(pro,'_up_kegg_volcano_',
                gsub('/','-',up_kegg$Description[i]),
                '.pdf')) 
})

我们来展示一下前面在 所有的肿瘤都有恶性增殖的特性吗提到的细胞周期通路看看。代码如下所示:

代码语言:javascript复制

pro='BRCA'
brca_gsea = gsea_list[[pro]]
brca_gsea = brca_gsea [match(cg,brca_gsea$Description),]
brca_gsea 
brca_deg = deg_list[[pro]]
load('Rdata/TCGA-BRCA.htseq_counts.Rdata')
group_list = ifelse(
  as.numeric(substring(colnames(pd_mat),14,15)) < 10,
  'tumor','normal'
)
table(group_list)

lapply(1:nrow(brca_gsea), function(i){ 
  cg = strsplit(brca_gsea$core_enrichment[i],'/')[[1]]
  
  dat=log2(edgeR::cpm(pd_mat) 1)
  dat[1:4,1:4] 
  library(pheatmap)
  pheatmap(dat[cg,],show_colnames =F,show_rownames = F) #对那些提取出来的1000个基因所在的每一行取出,组合起来为一个新的表达矩阵
  n=t(scale(t(dat[cg,]))) # 'scale'可以对log-ratio数值进行归一化
  n[n>2]=2 
  n[n< -2]= -2
  n[1:4,1:4]
  pheatmap(n,show_colnames =F,show_rownames = F)
  ac=data.frame(group=group_list)
  rownames(ac)=colnames(n) 
  pheatmap(n,show_colnames =F,show_rownames = T,
           annotation_col=ac)
  pheatmap(n,show_colnames =F,show_rownames = T,
           annotation_col=ac,
           filename =  paste0(pro,'_up_kegg_pheatmap_',
                              gsub('/','-',brca_gsea$Description[i]),
                              '.pdf')) 
}) 
 

可以看到,虽然一千多个肿瘤样品跟一百多个正常样品进行差异分析,确实细胞增殖相关的基因是统计学显著的高表达,但也有异质性,并不是所有的肿瘤个体都是恶性增殖,其实我们推翻了前面的结论。我们前面在 所有的肿瘤都有恶性增殖的特性吗,得到的结论其实是绝大部分肿瘤从整体上来说,恶性增殖都是大概率事件:

肿瘤不同病人基因异质性

好比我们说北京人都很有钱,并不是说每个北京人都是富人,只不过是北京这个地区相比其它城市来说,整体上富裕的人比较多而已。我们说北京的高考比较容易,也不是说每个人都能上清华北大,其内部也需要竞争。同理,肿瘤确实是有一个很显著的特征就是恶性增殖,但是并不是每个肿瘤类型的每个肿瘤样品都是如此。

es

0 人点赞