单细胞GSVA分析该用什么数据?

2021-03-25 12:31:52 浏览数 (2)

经常有人问我单细胞GSVA分析应该用Seurat对象中的哪个数据,因为我此前的推文《单细胞转录组高级分析五:GSEA与GSVA分析》用的counts数据,后面有一篇推文《非人物种的GSEA&GSVA分析》用的是data数据。还有人推荐用scale.data,据说运行起来比counts数据快不少。很多人对此迷惑了,到底该用那个数据呢?

测试数据来源

测试数据来源于10x genomics官网的示例数据集。

数据下载链接:

代码语言:javascript复制
https://cf.10xgenomics.com/samples/cell-exp/3.0.2/5k_pbmc_v3_nextgem/5k_pbmc_v3_nextgem_filtered_feature_bc_matrix.h5

保存文件名:pbmc.h5

运行时间对比

代码语言:javascript复制
library(Seurat)
library(tidyverse)
library(GSVA)
library(msigdbr)

## 创建Seurat对象
#sc <- Read10X_h5("/home/james5woo/project/2020/2009_18pkgs/garnett/garnett_demo/pbmc.h5")
sc <- Read10X_h5("pbmc.h5")
sc <- sc[,sample(colnames(sc),1000)]  #将细胞数量随机抽样到1000个细胞
sc <- CreateSeuratObject(sc, project = "pbmc", min.cells = 10) #按较高标准过滤基因,主要是提高gsva的计算速度
dim(sc)
#[1] 12564  1000
sc <- NormalizeData(sc) %>% FindVariableFeatures() %>% ScaleData()

## 准备gsva分析的基因集(hallmark)
genesets <- msigdbr(species = "Homo sapiens", category = "H") %>% select("gs_name","gene_symbol") %>% as.data.frame()
genesets <- split(genesets$gene_symbol, genesets$gs_name)

## 测试counts数据
expr <- as.matrix(sc@assays$RNA@counts)
system.time({res.counts = gsva(expr, genesets, method="ssgsea", parallel.sz=10)}) 
#   用户    系统    流逝 
#196.838 533.948 207.484 

## 测试data数据
expr <- as.matrix(sc@assays$RNA@data)
system.time({res.data = gsva(expr, genesets, method="ssgsea", parallel.sz=10)}) 
#   用户    系统    流逝 
#195.250 501.749 197.244

## 测试scaledata数据
expr <- as.matrix(sc@assays$RNA@scale.data)
system.time({res.scaledata = gsva(expr, genesets, method="ssgsea", parallel.sz=10)}) 
#  用户    系统    流逝 
#63.273 414.530 144.077

## 再次测试scaledata数据
sc2 <- ScaleData(sc, features = rownames(sc))
expr <- as.matrix(sc2@assays$RNA@scale.data)
system.time({res.scaledata2 = gsva(expr, genesets, method="ssgsea", parallel.sz=10)}) 
#   用户    系统    流逝 
#235.689 721.989 272.767

从上面记录的运行时间来看,scale.data数据CPU的计算时间(63.273s)相比counts和data数据快了不少,这是因为默认的scale.data数据只有2000个基因。对所有基因scale之后再次测试scale.data数据,CPU的计算时间变成了235.689s,相比counts数据和data数据没有任何优势。

小结:scale.data数据并不能加快GSVA的运行时间

分析结果对比

为了客观地对比不同数据运行GSVA之后的差异,我用pearson相关性热图给大家展示。**从左上到右下的对角线代表相同细胞用不同数据运行GSVA分析后结果的相关性。**为了节省计算时间,我只取了前100个细胞计算相关性。

1、counts数据与data数据的结果对比,相同细胞的pearson相关性等于1,说明运行结果完全相同。

2、counts数据与2000个基因的scale.data数据的结果对比,相同细胞的pearson相关性很低。

3、counts数据与所有基因的scale.data数据的结果对比,相同细胞的pearson相关性不高。

小结:GSVA分析使用counts数据和data数据没有差别,但是使用scale.data数据会影响结果

减少基因数量可行吗?

写这篇推文时我突发奇想:使用高变基因来做GSVA分析可行吗?

代码语言:javascript复制
# 筛选高变基因运行GSVA
EXPR <- as.matrix(sc@assays$RNA@counts)
for(i in seq(2000, 8000, 2000)){
  HVGs <- FindVariableFeatures(sc, nfeatures = i) %>% VariableFeatures()
  expr <- EXPR[HVGs,]
  res.hvg = gsva(expr, genesets, method="ssgsea", parallel.sz=10)
  coorda <- psych::corr.test(as.data.frame(res.counts[,1:100]), as.data.frame(res.hvg[,1:100]), method="pearson")
  pheatmap::pheatmap(coorda$r, cluster_rows = F, cluster_cols = F, display_numbers = F, show_rownames = F, 
                     show_colnames = F, filename = paste0("AllGenes_vs_",i,"HVGs.png"), width = 8, height = 7)
}

原始表达矩阵与2000高变基因表达矩阵的GSVA结果相关性

原始表达矩阵与4000高变基因表达矩阵的GSVA结果相关性

原始表达矩阵与6000高变基因表达矩阵的GSVA结果相关性

原始表达矩阵与8000高变基因表达矩阵的GSVA结果相关性

小结:不能使用高变基因的表达矩阵代替原始表达矩阵做GSVA分析

交流探讨:如果您阅读此文有所疑惑,或有不同见解,亦或其他单细胞需求,可以点击阅读原文联系。

往期回顾

RNA Velocity and Beyond 系列1—Introduction

scRNA plus||单细胞结合传统测序技术之路

毛囊间充质祖细胞功能障碍导致与年龄相关的脱发

明码标价之转录组常规测序服务(仅需799每个样品)




如果你对单细胞转录组研究感兴趣,但又不知道如何入门,也许你可以关注一下下面的课程

  • 2021生信学习班起航,先送福利
  • 96核心384G内存的超级服务器(共享)使用权一年
  • 数据挖掘班开年寄语

0 人点赞