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、探針名轉化

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

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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容