对应原版教程第9章:http://bioconductor.org/books/release/OSCA/overview.html 在scRNA-seq中,根据成千上万个基因表达信息(维度)定义细胞间的距离是令人头痛的,最大程度不丢失有效信息的前提下,进行降维处理对于后续的cluster分群非常有必要;尤其对于我们只能观察到低维信息,提供可视化的方法。
笔记要点
runPCA()
函数sce.zeisel
# class: SingleCellExperiment
# dim: 19839 2816
#获得高变基因
library(scran)
dec.zeisel <- modelGeneVarWithSpikes(sce.zeisel, "ERCC")
top.zeisel <- getTopHVGs(dec.zeisel, n=2000)
library(scater)
sce.zeisel <- runPCA(sce.zeisel, subset_row=top.zeisel)
ReduceDims
的slot里reducedDimNames(sce.zeisel)
#[1] "PCA"
dim(reducedDim(sce.zeisel, "PCA"))
#[1] 2816 50
reducedDim(sce.zeisel, "PCA")[1:10,1:6]
10个细胞的前6个主成分的指标
percent.var <- attr(reducedDim(sce.zeisel), "percentVar")
# [1] 24.5181077 7.1739169 4.8484962 2.7507716 2.3263866 1.4646539 1.0064506
# [8] 0.9452909 0.8281589 0.7215028 0.5226110 0.4959496 0.4708611 0.4485736
# [15] 0.4059012 0.3924625 0.3512433 0.3220025 0.3009666 0.2864609 0.2743744
# [22] 0.2523282 0.2360735 0.2284612 0.2105227 0.2088941 0.1931187 0.1874229
# [29] 0.1809175 0.1704797 0.1636240 0.1594421 0.1556688 0.1519302 0.1479599
# [36] 0.1436477 0.1391318 0.1368290 0.1341435 0.1314207 0.1300718 0.1237573
# [43] 0.1208721 0.1195724 0.1170765 0.1139158 0.1131542 0.1120158 0.1114791
# [50] 0.1105582
sum(percent.var)
#[1] 55.35963
sum(percent.var[1:10])
#[1] 46.58374
plot(percent.var, log="y", xlab="PC", ylab="Variance explained (%)")
主成分的方差解释率
findElbowPoint()
函数自动鉴别chosen.elbow <- PCAtools::findElbowPoint(percent.var)
chosen.elbow
# 7
plot(percent.var, xlab="PC", ylab="Variance explained (%)")
abline(v=chosen.elbow, col="red")
denoisePCA()
函数,需要提供计算hvg时的方差分解结果以及hvgsce.pbmc #获取见原教程
#class: SingleCellExperiment
#dim: 33694 3985
dec.pbmc <- modelGeneVarByPoisson(sce.pbmc)
top.pbmc <- getTopHVGs(dec.pbmc, prop=0.1)
set.seed(1001)
dec.pbmc <- modelGeneVarByPoisson(sce.pbmc)
top.pbmc <- getTopHVGs(dec.pbmc, prop=0.1)
library(scran)
set.seed(111001001)
denoised.pbmc <- denoisePCA(sce.pbmc, technical=dec.pbmc, subset.row=top.pbmc)
ncol(reducedDim(denoised.pbmc))
# 9
因为考虑到需要将方差分解为biological与technical var两部分的正确划分。作者认为
modelGeneVar()
方法可能会低估了生物水平差异性,而modelGeneVarByPossion()
/modelGeneVarWithSpikes()
方法相对来说更能反应真实的分布情况。因此denoisePCA()
与后两种方差分解方法搭配使用,效果最佳~
getClusteredPCs()
函数pcs <- reducedDim(sce.zeisel)
choices <- getClusteredPCs(pcs)
val <- metadata(choices)$chosen
plot(choices$n.pcs, choices$n.clusters,
xlab="Number of PCs", ylab="Number of clusters")
abline(a=1, b=1, col="red") # n=m
abline(v=val, col="grey80", lty=2)
最后作者还介绍了基于随机矩阵理论(RMT)的两种方法,的确是看不太明白,暂时不做记录了。有兴趣的朋友可以参考原教程。
二维平面是对于我们人类可接受的表征细胞间距离的可视化方式。因此,尽管上一步PCA已经降至50个维度以内,但在可视化呈现方面,仍需采取一定手段。
plotReducedDim(sce.zeisel, dimred="PCA", colour_by="level1class")
#利用已有的level1class注释来辅助佐证我们的可视化效果
sed.seed(1)
sce.zeisel <- runTSNE(sce.zeisel, dimred="PCA")
plotReducedDim(sce.zeisel, dimred="TSNE", colour_by="level1class")
set.seed(1)
sce.zeisel <- runUMAP(sce.zeisel, dimred="PCA")
plotReducedDim(sce.zeisel, dimred="UMAP", colour_by="level1class")
综合考虑t-SNE与UMAP,虽然实现算法不同,但二者都是旨在维持高位空间中,邻近细胞的距离不变,在二维空间中可视化。但对于相距较远的细胞的二维呈现是没有参考意义的,切记决不能用于衡量cluster的相似性。可用于在之后的分群结果中,观察同一cluster内的细胞是否为距离相近的细胞。至于选择哪一种方法,各有优劣,可以都尝试一下,看看哪种展示方式更适合叙述接下来的生物学故事。
往期回顾
如果你对单细胞转录组研究感兴趣,但又不知道如何入门,也许你可以关注一下下面的课程