这部分代码是我综合了好几篇帖子手打的代码
主要参考的是单细胞绘图之GSEA & GSVA
再调用GSVA函数出问题时主要参考:
https://github.com/rcastelo/GSVA/issues/172
接着单细胞测序—标准流程代码(3)—marker 基因富集分析_差异基因,继续分析
gesa_gsva_bymyself.R
rm(list=ls())
options(stringsAsFactors = F)
source('scRNA_scripts/lib.R')
library(clusterProfiler)
library(enrichplot)
getwd()
d='gesa_gsva_bymyself/'
dir.create(d)
setwd(d)
# 数据导入
sce = readRDS('../2-harmony/sce.all_int.rds')
load('../phe.Rdata')
sce$celltype=phe$celltype
sce$group=sce$stim
table(sce$celltype,sce$group )
######## GSEA #####
table(sce@meta.data$celltype)
cells_sub <- subset(sce@meta.data,celltype %in% c("CD4 Naive T"))
scRNA_sub <- subset(sce,cells = row.names(cells_sub))
#logfc.threshold设置很小,因为GSEA尽量要所有的基因
sub.markers <- FindMarkers(scRNA_sub,group.by = 'group',
ident.1 = 'CTRL',ident.2='STIM',logfc.threshold=0.01)
sub.markers.sig <- subset(sub.markers,p_val_adj<0.05 & avg_log2FC > 0.5)
# GSEA
mydata <- data.frame(Gene = rownames(sub.markers),
logFC = sub.markers$avg_log2FC) %>% arrange(desc(logFC))
genelist <- bitr(mydata$Gene,fromType = "SYMBOL",toType = "ENTREZID",OrgDb = "org.Hs.eg.db") %>%
inner_join(mydata,by=c("SYMBOL"="Gene")) %>%arrange(desc(logFC))
gsea_input <- genelist$logFC
names(gsea_input) <- genelist$ENTREZID
head(gsea_input)
geneset <- read.gmt("../c5.go.bp.v2024.1.Hs.entrez.gmt")
gg <- GSEA(gsea_input,TERM2GENE = geneset,verbose = F,
pvalueCutoff = 0.1,pAdjustMethod = "BH")
sortgg <- gg[order(gg@result$NES,decreasing = T),]
sortgg <- sortgg[sortgg$p.adjust < 0.05,]
#这里取前3个通路进行绘图
head(sortgg)
geneset_plot <- c("GOBP_UROGENITAL_SYSTEM_DEVELOPMENT",
"GOBP_CELL_CELL_JUNCTION_ASSEMBLY",
"GOBP_CELL_CELL_JUNCTION_ORGANIZATION")
mycol <- pal_nejm()(8)
gseaplot2(gg,
geneSetID =geneset_plot,
color = mycol[c(1:3)],
title='Specific GO_BP',
rel_heights = c(1.3,0.3,0.6),
pvalue_table = F)
ggsave("gsea.pdf",width = 10,height = 10)
save(gg,sortgg,file = "gsea.Rdata")
代码解释
同样的在数据导入部分,我认为可以直接直接load,降维聚类分群注释后的seurat对象(sce.all.int),这样的效果和上述三行的效果一致。
接下来,如本次以对照组(CTRL
)与刺激组(STIM
)中的CD4 Naive T细胞亚群为例,进行GSEA分析,后续重要关注哪两个分组或哪些细胞亚群,修改对应的代码即可。
提取CD4 Naive T细胞亚群的差异表达基因:
subset
提取细胞类型为CD4 Naive T
的亚群。FindMarkers
函数找到对照组(CTRL
)与刺激组(STIM
)之间的差异表达基因。为了保证GSEA能使用所有基因,logfc.threshold
设置为0.01(阈值非常低)。准备GSEA输入数据:
mydata
。bitr
函数将基因符号(SYMBOL)转换为基因的Entrez ID,并与logFC数据合并。gsea_input
,其中基因的Entrez ID为向量的名字,logFC为向量的值。执行GSEA分析:
read.gmt
加载GO生物过程(BP)基因集。这里我是按照视频里去官网https://www.gsea-msigdb.org/gsea/msigdb/human/collections.jsp#C5下载了对应的GO BP gmt文件。
这段代码是有优化的空间的,应该可以用clusterProfiler这个包直接分析,这里还没有研究,之后有时间再优化吧
GSEA
函数进行富集分析,设定p值阈值为0.1,p值校正方法为Benjamini-Hochberg。绘制GSEA结果:
gseaplot2
绘制GSEA结果图,并保存为PDF文件。save
函数保存GSEA分析的结果到文件gsea.Rdata
。gsea.pdf
脚本接上
######## GSVA #####
expr <- as.data.frame(scRNA_sub@assays$RNA@data)
expr$ID <- rownames(expr)
s2e <- bitr(expr$ID,
fromType = "SYMBOL",
toType = "ENTREZID",
OrgDb = "org.Hs.eg.db")
expr <- inner_join(expr,s2e,by=c("ID"="SYMBOL"))
rownames(expr) <- expr$ENTREZID
expr[1:3,1:3]
expr[1:5,c((ncol(expr)-1),ncol(expr))]
#删除最后两列,即SYMBOL,ENTREZID两列
#这对表达矩阵来说,这两列并不需要
expr <- expr[,-c((ncol(expr)-1),ncol(expr))]
geneset <- read.gmt("../c2.cp.kegg_medicus.v2024.1.Hs.entrez.gmt")
geneset_list <- split(geneset$gene,geneset$term)
library(GSVA)
expr <- as.matrix(expr)
#gsva1 <- gsva(gsvaParam(xpr,geneset_list,kcdf="Gaussian",method = "gsva",parallel.sz = 12))
gsva1 <- gsva(gsvaParam(expr, geneset_list))
meta <- as.data.frame(scRNA_sub@meta.data[,c("orig.ident", "group","celltype")])
mydata <- t(as.data.frame(gsva1)) %>% as.data.frame()
mydata <- merge(meta,mydata,by.x = 0,by.y = 0)
rownames(mydata) <- mydata$Row.names
mydata <- mydata[,c(-1,-2,-4)]
#差异分析
library(limma)
group_list <- factor(mydata$group)
design <- model.matrix(~0+group_list)
colnames(design) <- levels(group_list)
rownames(design) <- rownames(mydata)
contrast.matrix <- makeContrasts('STIM-CTRL',levels = design)
fit <- lmFit(t(mydata[,-1]),design = design)
fit2 <- contrasts.fit(fit,contrast.matrix)
fit2 <- eBayes(fit2)
alldiff = topTable(fit2,coef =1,n = Inf)
sigdiff <- subset(alldiff,abs(logFC)>0.5 & adj.P.Val < 0.05)
save(alldiff,sigdiff,file = "GSVA.Rdata")
#Heatmap
alldiff <- alldiff[order(abs(alldiff$logFC),decreasing = T),]
plotdata <- t(mydata[,rownames(alldiff[1:20,])])
library(ComplexHeatmap)
library(circlize)
Group <- c('#D2691E','#DDA0DD')
names(Group) <- c('STIM','CTRL')
Top <- HeatmapAnnotation(Group=factor(mydata$group),
annotation_legend_param = list(labels_gp = gpar(fontsize = 10),
title_gp = gpar(fontsize=10,fontface = "bold"),ncol=1),
border = T,
col = list(Group=Group),
show_annotation_name = TRUE,
annotation_name_side = "left",
annotation_name_gp = gpar(fontsize=10))
pdf(file = 'GSVA_heatmap.pdf',width=8,height = 6)
Heatmap(plotdata,
name="Scores",
top_annotation = Top,
cluster_rows = FALSE,
col = colorRamp2(c(-1,0,1),c('#008B8B','#F5F5F5','#DC143C')),
color_space = "RGB",
cluster_columns = FALSE,border =T,
row_names_side ='left',
column_order=NULL,
show_column_names =FALSE,
row_names_gp = gpar(fontsize = 8),
column_split = c(rep(1,table(mydata$group)[1]),rep(2,table(mydata$group)[2])),
gap = unit(4,"mm"),
use_raster=FALSE,
column_title = NULL,
column_title_gp = gpar(fontsize = 10),
show_heatmap_legend = TRUE,
heatmap_legend_param=list(labels_gp = gpar(fontsize = 10),
title_gp = gpar(fontsize=10,fontface = "bold")))
dev.off()
代码解释
这段代码主要进行GSVA(Gene Set Variation Analysis)分析,识别在不同条件下基因集活性的变化,并生成热图展示基因集的差异表达情况。以下是代码的逐步解释:
expr
数据框的一列。term
)进行分类,生成每个通路包含的基因列表。这一步是参考了github的报错,gsva更新了调用方式,导致之前的许多代码报错。要加上gsvaParam参数。
Group
颜色,用于表示分组信息。Heatmap
函数绘制热图,显示基因集的活性评分,按分组对数据进行分列,颜色从青色(低表达)到红色(高表达)渐变。GSVA_heatmap.pdf
文件。总结来说,这段代码进行了基因集变异分析(GSVA),找出了在不同组别(STIM vs. CTRL)之间显著差异的基因集,并将前20个基因集的活性评分通过热图可视化。
GSVA_heatmap.pdf
这个热图的代码存在一些问题,调试了一会,还是不理想,暂时先搁置在这里,以后有机会在评论区补充。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。