「生信技能树」三阴性乳腺癌表达矩阵探索 系列笔记
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.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],])
如上图,logFC即logFoldchange,为raw counts变化倍数的log值。由于数据已经是log后的所有是两组对应的均值的差值。
此外根据logFC的正负性,我们能够判断这里是TNBC与nonTNBC相比。若想修改比较顺序,简单的方法是直接取logFC的相反数即可
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())
此外也可利用
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)
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