4.4 实战四 | 10X | 过滤后的PBMC

刘小泽写于2020.7.19

1 前言

这次使用的数据是来自Zheng et al. 2017 的三个PBMC数据,而且这个数据是经过前期过滤的

准备数据

library(TENxPBMCData)
all.sce <- list(
    pbmc3k=TENxPBMCData('pbmc3k'),
    pbmc4k=TENxPBMCData('pbmc4k'),
    pbmc8k=TENxPBMCData('pbmc8k')
)

all.sce
# $pbmc3k
# class: SingleCellExperiment 
# dim: 32738 2700 
# metadata(0):
#   assays(1): counts
# rownames(32738): ENSG00000243485 ENSG00000237613 ...
# ENSG00000215616 ENSG00000215611
# rowData names(3): ENSEMBL_ID Symbol_TENx Symbol
# colnames: NULL
# colData names(11): Sample Barcode ... Individual
# Date_published
# reducedDimNames(0):
#   altExpNames(0):
#   
#   $pbmc4k
# class: SingleCellExperiment 
# dim: 33694 4340 
# metadata(0):
#   assays(1): counts
# rownames(33694): ENSG00000243485 ENSG00000237613 ...
# ENSG00000277475 ENSG00000268674
# rowData names(3): ENSEMBL_ID Symbol_TENx Symbol
# colnames: NULL
# colData names(11): Sample Barcode ... Individual
# Date_published
# reducedDimNames(0):
#   altExpNames(0):
#   
#   $pbmc8k
# class: SingleCellExperiment 
# dim: 33694 8381 
# metadata(0):
#   assays(1): counts
# rownames(33694): ENSG00000243485 ENSG00000237613 ...
# ENSG00000277475 ENSG00000268674
# rowData names(3): ENSEMBL_ID Symbol_TENx Symbol
# colnames: NULL
# colData names(11): Sample Barcode ... Individual
# Date_published
# reducedDimNames(0):
#   altExpNames(0):

多个数据集的批量处理,重点就是列表list和for循环的熟练使用,还有相关的apply家族函数。而且每个结果数据也要对应放在一个新列表中,比如下面质控使用的stats <- high.mito <- list() ,就是新建了两个空列表,然后把结果放进去

2 批量质控

数据备份

把unfiltered数据主要用在质控的探索上

还是先通过线粒体含量计算质控结果,然后根据这个结果进行过滤,一个for循环搞定

看一下根据线粒体过滤的结果

批量作图(也是把作图结果放进list,方便后期批量导出)

3 批量归一化

这里使用的是最简单的方法logNormCounts(),就是用某个细胞中每个基因或spike-in转录本的表达量除以这个细胞计算的size factor,最后还进行一个log转换,得到一个新的矩阵:logcounts 【不过这个名字并不是很贴切,只是因为拼写简单,真实应该是:log-transformed normalized expression values。而不是单纯字面意思取个log】

看到这里,可能会想,为什么没计算size factor就直接进行了logNormCounts?

前面提到的操作,一般都是:

看一下logNormCounts的帮助文档就能明白了,逻辑很清楚:

  • 函数默认的参数是:size_factors=NULL,如果没有计算size factor更新给函数,那么函数会执行normalizeCounts 的操作

  • 再来看normalizeCounts会有什么操作:如果没有提供size factor,它会根据数据类型去自己计算size factor

    • 对于count矩阵和SummarizedExperiment数据类型,会通过librarySizeFactors计算

    • 对于SingleCellExperiment这种数据类型,它会首先在数据中寻找size factor是否存在,如果找不到,也是会使用librarySizeFactors

也就是说,如果我们不提前计算,就会自动帮我们用最简单的librarySizeFactors计算,并添加到我们的数据中。正是因为我们只需要最简单的方法,所以才可以不提供。如果要使用去卷积方法,还是要自己先计算好

最后看下结果

4 批量找表达量高变化基因

同样也是使用了最简单的计算方法

作图

  • 每个点表示一个基因

  • 图中蓝线指的是:技术因素导致的偏差

  • 纵坐标表示总偏差:它等于技术偏差+生物因素偏差

因此,要衡量一个基因的生物因素偏差大小,就看对应的纵坐标减去对应的蓝线的值

5 批量降维

这里将每个PBMC数据单独进行降维,而并没有把它们混合起来再分析

关于降维方法,这里选择是与PCA近似的SVD算法(singular value decomposition,奇异值分解),scater或scran都可以直接通过函数计算SVD,利用参数BSPARAM=传递一个BiocSingularParam对象到runPCA

  • SVD是一种矩阵分解方法,相当于因式分解,目的纯粹就是将一个矩阵拆分成多个矩阵相乘的形式

  • 对于稀疏矩阵来说,SVD算法更适用,这样对于大数据来说节省了很大空间

这里使用SVD其实还是为了帮助更好地进行PCA,支持4种方式:

  • ExactParam: exact SVD with runExactSVD.

  • IrlbaParam: approximate SVD with irlba via runIrlbaSVD.

  • RandomParam: approximate SVD with rsvd via runRandomSVD.

  • FastAutoParam: fast approximate SVD, chosen based on the matrix representation.

6 批量聚类

使用基于图形的聚类,最基础的想法是:我们首先构建一个图,其中每个节点都是一个细胞,它与高维空间中最邻近的细胞相连。连线基于细胞之间的相似性计算权重,权重越高,表示细胞间关系更密切。如果一群细胞之间的权重高于另一群细胞,那么这一群细胞就被当做一个群体 “communiity”。

作图

7 数据整合

前面只是批量进行了各个数据集的分析,现在要把它们整合起来再分析一下

找共有基因

对每个数据批量取子集

把三个数据当做一个数据的三个批次,重新进行归一化

根据重新归一化的结果,再次找HVGs

这次是把3个批次放在一起再找的

对一个大数据进行降维

结合:单细胞交响乐10-数据集整合后的批次矫正 中的【第4部分 MNN矫正】

fastMNN先进行PCA降维,以加速下面的聚类环节

检查一下结果,使用lost.var ,值越大表示丢失的真实生物异质性越多

  • It contains a matrix of the variance lost in each batch (column) at each merge step (row).

  • Large proportions of lost variance (>10%) suggest that correction is removing genuine biological heterogeneity.

对一个大数据进行聚类

可视化

最后更新于

这有帮助吗?