4.14 | 实战十四 | 10X | HCA计划的38万骨髓细胞
刘小泽写于2020.7.22

1 前言

前面的种种都是作为知识储备,但是不实战还是记不住前面的知识 这是第十四个实战练习,不过这次的练习对电脑要求比较高

单细胞领域不得不提的HCA计划

细胞类型多种多样
细胞是生命最基本的单位,一般人至少有37兆2000亿个细胞,但现有的研究一般是组织层面,对细胞内部机制理解的还不是很深入。人体内的细胞有多少种类?这是一个非常基础的问题。美国国立卫生研究院给出了一个答案:200种,包括像神经元细胞、心脏细胞、肌肉细胞等几大类。然而,如果你去问一个免疫学家,他会告诉你光免疫细胞就至少有200种;如果你去问一个专门研究T细胞的免疫学家,他会告诉你光T细胞就至少有200种。Regev说她自己光讲人体细胞种类就要花15分钟,并且一个细胞的种类可以不断地往下划分,亚型下面还有亚型,仅视网膜组织就至少包括100种不同种类的神经元。更棘手的是,有些种类的细胞会在一定条件下转化为其他种类的细胞,并且每个亚型的细胞会根据不同环境呈现出不同的状态。
细胞图谱的重要性
一个完整的人体细胞图谱将赋予我们每种细胞类型唯一的“身份证”,可以帮助解释不同类型的细胞如何协作并形成组织的。另外与疾病相关的基因在哪些细胞更活跃,不同细胞类型产生的机理又是怎样的呢?
HCA计划的开启
2016年Chan Zuckerberg Initiative(CZI)基金会计划在未来十年内投入30亿美元支持科学研究,其中最瞩目的就是“人类细胞图谱计划”(the Human Cell Atlas)【可与“人类基因组计划”相媲美】。2017年10月,HCA正式公布了首批拟资助的38个项目,将为40万亿个细胞绘制图谱,其中清华大学教授张学工负责的项目作为其中唯一一个由中国科学家承担的项目,从全球范围内征集的近500个项目中脱颖而出。
2018年3月8日,Sanger研究所在其官网宣布了人类发育细胞图谱计划(HDCA)的最新成果研究团队从捐赠的人类发育组织(包括肝脏、皮肤、肾脏、胎盘)中分离出超25万个细胞,并利用强大的单细胞基因组测序工具获取了人类早期发育,以及影响健康或者导致疾病的信息。HDCA是HCA的重要一部分,旨在构建参与人类发育的所有重要细胞的基因组参考图谱。该项目聚焦的其他主要领域包括,改善对血细胞如何形成,以及免疫系统如何发挥功能的理解。
另外,2018年,美国费城儿童医院和辛辛那提儿童医院领导的国际研究团队建议在HCA联盟中建立一个纵向的儿童研究分支,并在HCA白皮书中概述了儿童细胞图谱计划(Pediatric Cell Atlas,PCA),以在儿童健康和人类发展背景下,展开针对儿童独特生物学特征的跨学科研究。
HCA的主要内容
    编目所有人体细胞类型(如免疫细胞、脑细胞)及其子类型;
    绘制不同细胞类型在组织和人体中的分布图;
    区分细胞状态(如免疫细胞在被病原体激活前后的状态);
    捕捉细胞转换过程的关键特征(如干细胞细胞激活和分化);
    追踪细胞谱系历史(如骨髓前体干细胞到功能性的红细胞)

数据准备

我们这里使用的数据是:10X技术得到的人类约380,000个骨髓细胞
1
# 如果要自己下载
2
# library(HCAData)
3
# sce.bone <- HCAData('ica_bone_marrow')
4
load('sce.bone.new.RData')
5
sce.bone
6
# class: SingleCellExperiment
7
# dim: 33694 378000
8
# metadata(0):
9
# assays(1): counts
10
# rownames(33694): ENSG00000243485
11
# ENSG00000237613 ... ENSG00000277475
12
# ENSG00000268674
13
# rowData names(2): ID Symbol
14
# colnames(378000):
15
# MantonBM1_HiSeq_1-AAACCTGAGCAGGTCA-1
16
# MantonBM1_HiSeq_1-AAACCTGCACACTGCG-1 ...
17
# MantonBM8_HiSeq_8-TTTGTCATCTGCCAGG-1
18
# MantonBM8_HiSeq_8-TTTGTCATCTTGAGAC-1
19
# colData names(1): Barcode
20
# reducedDimNames(0):
21
# altExpNames(0):
Copied!
数据初探
1
# 这里的数据大小41M
2
object.size(counts(sce.bone))
3
# 41741200 bytes
4
5
# 真实文件大小700多M
6
file.info(path(counts(sce.bone)))$size
7
# [1] 769046295
8
9
# 其中包含供体信息
10
head(sce.bone$Barcode)
11
# [1] "MantonBM1_HiSeq_1-AAACCTGAGCAGGTCA-1"
12
# [2] "MantonBM1_HiSeq_1-AAACCTGCACACTGCG-1"
13
# [3] "MantonBM1_HiSeq_1-AAACCTGCACCGGAAA-1"
14
# [4] "MantonBM1_HiSeq_1-AAACCTGCATAGACTC-1"
15
# [5] "MantonBM1_HiSeq_1-AAACCTGCATCGATGT-1"
16
# [6] "MantonBM1_HiSeq_1-AAACCTGCATTCCTGC-1"
17
18
# 提取供体信息
19
sce.bone$Donor <- sub("_.*", "", sce.bone$Barcode)
20
table(sce.bone$Donor)
21
#
22
# MantonBM1 MantonBM2 MantonBM3 MantonBM4 MantonBM5
23
# 48000 48000 48000 48000 48000
24
# MantonBM6 MantonBM7 MantonBM8
25
# 42000 48000 48000
Copied!
ID转换
还是要获得染色体信息
1
library(EnsDb.Hsapiens.v86)
2
rowData(sce.bone)$Chr <- mapIds(EnsDb.Hsapiens.v86, keys=rownames(sce.bone),
3
column="SEQNAME", keytype="GENEID")
4
5
# 其中包括13个线粒体信息
6
table(grepl('MT',rowData(sce.bone)$Chr))
7
#
8
# FALSE TRUE
9
# 33681 13
Copied!
整合行名
1
library(scater)
2
rownames(sce.bone) <- uniquifyFeatureNames(rowData(sce.bone)$ID,
3
names = rowData(sce.bone)$Symbol)
Copied!

2 质控

使用线粒体信息进行过滤,并且因为数据量很大,可以调用多线程
1
library(BiocParallel)
2
# 调用8线程
3
bpp <- MulticoreParam(8)
4
5
start=Sys.time()
6
sce.bone <- unfiltered <- addPerCellQC(sce.bone, BPPARAM=bpp,
7
subsets=list(Mito=which(rowData(sce.bone)$Chr=="MT")))
8
end=Sys.time()
9
(end-start)
10
# Time difference of 2.167978 mins
Copied!
过滤掉了6万多个细胞
1
colSums(as.matrix(qc))
2
# low_lib_size low_n_features
3
# 33997 42756
4
# high_subsets_Mito_percent discard
5
# 44105 61275
Copied!
作图
1
unfiltered$discard <- qc$discard
2
3
gridExtra::grid.arrange(
4
plotColData(unfiltered, x="Donor", y="sum", colour_by="discard") +
5
scale_y_log10() + ggtitle("Total count"),
6
plotColData(unfiltered, x="Donor", y="detected", colour_by="discard") +
7
scale_y_log10() + ggtitle("Detected features"),
8
plotColData(unfiltered, x="Donor", y="subsets_Mito_percent",
9
colour_by="discard") + ggtitle("Mito percent"),
10
ncol=2
11
)
Copied!
再看看线粒体含量与文库大小的关系
1
plotColData(unfiltered, x="sum", y="subsets_Mito_percent",
2
colour_by="discard") + scale_x_log10()
Copied!

3 归一化

这里为了减少计算量,使用原来计算好的文库size factor,不需要重复计算
1
sce.bone <- logNormCounts(sce.bone, size_factors = sce.bone$sum)
2
summary(sizeFactors(sce.bone))
3
## Min. 1st Qu. Median Mean 3rd Qu. Max.
4
## 0.05 0.47 0.65 1.00 0.89 42.38
Copied!

4 找高变异基因

将供体作为批次信息加入到构建模型中,这一步依然需要多线程处理
1
library(scran)
2
start=Sys.time()
3
dec.bone <- modelGeneVar(sce.bone, block=sce.bone$Donor, BPPARAM=bpp)
4
end=Sys.time()
5
(end-start) # Time difference of 10.58185 mins
6
7
top.bone <- getTopHVGs(dec.bone, n=5000)
Copied!

5 矫正批次效应

1
library(batchelor)
2
library(BiocNeighbors)
3
4
set.seed(1010001)
5
merged.bone <- fastMNN(sce.bone, batch = sce.bone$Donor, subset.row = top.bone,
6
BSPARAM=BiocSingular::RandomParam(deferred = TRUE),
7
BNPARAM=AnnoyParam(),
8
BPPARAM=bpp)
9
10
reducedDim(sce.bone, 'MNN') <- reducedDim(merged.bone, 'corrected')
Copied!
看下结果:lost.var 值越大表示丢失的真实生物异质性越多
1
## MantonBM1 MantonBM2 MantonBM3 MantonBM4 MantonBM5 MantonBM6 MantonBM7
2
## [1,] 0.010616 0.008241 0.000000 0.000000 0.000000 0.000000 0.000000
3
## [2,] 0.007894 0.007741 0.023662 0.000000 0.000000 0.000000 0.000000
4
## [3,] 0.005834 0.003823 0.005423 0.025272 0.000000 0.000000 0.000000
5
## [4,] 0.003482 0.002868 0.002581 0.003067 0.027117 0.000000 0.000000
6
## [5,] 0.005287 0.003544 0.003173 0.005702 0.006551 0.031890 0.000000
7
## [6,] 0.004601 0.004535 0.004533 0.004067 0.004934 0.005547 0.034452
8
## [7,] 0.002610 0.002238 0.003135 0.002799 0.001963 0.002697 0.002404
9
## MantonBM8
10
## [1,] 0.00000
11
## [2,] 0.00000
12
## [3,] 0.00000
13
## [4,] 0.00000
14
## [5,] 0.00000
15
## [6,] 0.00000
16
## [7,] 0.04033
Copied!

6 降维聚类

降维

这么大的细胞数据,一般会使用UMAP
1
set.seed(01010100)
2
sce.bone <- runUMAP(sce.bone, dimred="MNN",
3
BNPARAM=AnnoyParam(),
4
BPPARAM=bpp,
5
n_threads=bpnworkers(bpp))
Copied!
另外关于tSNE和UMAP的对比
    SNE does not preserve global data structure, meaning that only within cluster distances are meaningful while between cluster similarities are not guaranteed. But UMAP Can Preserve Global Structure
    tSNE does not scale well for rapidly increasing sample sizes in scRNAseq.
    UMAP is faster than tSNE when it concerns a) large number of data points, b) number of embedding dimensions greater than 2 or 3, c) large number of ambient dimensions in the data set
    UMAP的改进:UMAP overall follows the philosophy of tSNE, but introduces a number of improvements such as another cost function and the absence of normalization of high- and low-dimensional probabilities.
    总结:Despite tSNE served the Single Cell research area for years, it has too many disadvantages such as speed and the lack of global distance preservation

聚类

因为这里的细胞数量实在太大,因此可以先借用kmeans方法对它们聚类,比如先聚成1000个小类,然后再对每个小类进行graph-based聚类
1
set.seed(1000)
2
clust.bone <- clusterSNNGraph(sce.bone, use.dimred="MNN",
3
use.kmeans=TRUE, kmeans.centers=1000)
4
colLabels(sce.bone) <- factor(clust.bone)
5
table(colLabels(sce.bone))
6
##
7
## 1 2 3 4 5 6 7 8 9 10 11 12
8
## 21938 42850 19861 38064 38024 71978 19237 24627 7583 16361 3179 13023
Copied!
做个热图
1
tab <- table(Cluster=colLabels(sce.bone), Donor=sce.bone$Donor)
2
library(pheatmap)
3
pheatmap(log10(tab+10), color=viridis::viridis(100))
Copied!
看到每个cluster中都会有几个不同的样本,这也符合预期,因为所有的样本都是来自不同供体的重复,它们实际都是骨髓细胞

7 找marker基因

1
markers.bone <- findMarkers(sce.bone, block = sce.bone$Donor,
2
direction = 'up', lfc = 1, BPPARAM=bpp)
Copied!
然后检查第5群细胞
1
top.markers <- markers.bone[["5"]]
2
best <- top.markers[top.markers$Top <= 10,]
3
lfcs <- getMarkerEffects(best)
4
5
library(pheatmap)
6
pheatmap(lfcs, breaks=seq(-5, 5, length.out=101))
Copied!
看到LYZ、S100A8、VCAN基因高表达,说明cluster5可能是单核细胞(Monocyte)

8 细胞类型注释

使用参考数据集帮助注释,只不过这里并不是对每个细胞单独操作,因为数量太太。而是基于12个已经分好的cluster的总体表达量进行注释,提高了注释速度,但同样牺牲了研究cluster内部细胞异质性的机会。适用于快速注释细胞类群
1
se.aggregated <- sumCountsAcrossCells(sce.bone, id=colLabels(sce.bone))
2
3
library(SingleR)
4
hpc <- HumanPrimaryCellAtlasData()
5
anno.single <- SingleR(se.aggregated, ref = hpc, labels = hpc$label.main,
6
assay.type.test="sum")
Copied!
看一下结果,包含12行也就是12个分群结果,看到利用参考注释的方法,cluster5也是被注释到了Monocyte这个细胞类型
1
anno.single
2
## DataFrame with 12 rows and 5 columns
3
## scores first.labels tuning.scores
4
## <matrix> <character> <DataFrame>
5
## 1 0.388013:0.636789:0.754052:... CMP 0.554195:0.4238259
6
## 2 0.326563:0.692156:0.661226:... NK_cell 0.579208:0.4459558
7
## 3 0.323785:0.668599:0.743138:... Pre-B_cell_CD34- 0.488346:0.0719803
8
## 4 0.346204:0.637353:0.615021:... T_cells 0.628161:0.3531725
9
## 5 0.297369:0.638962:0.745831:... Pre-B_cell_CD34- 0.548995:0.2633979
10
## ... ... ... ...
11
## 8 0.313537:0.773897:0.672663:... B_cell 0.722126:-0.288616
12
## 9 0.346503:0.703506:0.670777:... Pro-B_cell_CD34+ 0.774848: 0.710191
13
## 10 0.313591:0.774162:0.668809:... B_cell 0.719013:-0.281128
14
## 11 0.369873:0.720021:0.654892:... B_cell 0.523979: 0.326187
15
## 12 0.403994:0.603811:0.697425:... MEP 0.430493: 0.286268
16
## labels pruned.labels
17
## <character> <character>
18
## 1 CMP CMP
19
## 2 T_cells T_cells
20
## 3 Monocyte Monocyte
21
## 4 T_cells T_cells
22
## 5 Monocyte Monocyte
23
## ... ... ...
24
## 8 B_cell B_cell
25
## 9 Pro-B_cell_CD34+ Pro-B_cell_CD34+
26
## 10 B_cell B_cell
27
## 11 B_cell NA
28
## 12 BM & Prog. BM & Prog.
Copied!
最近更新 1yr ago