单细胞数据的降维
博文名称:Reduce Dimensions for Single Cell
博文链接:https://towardsdatascience.com/reduce-dimensions-for-single-cell-4224778a2d67
发表时间:Aug 21, 2019
From Becht et al., Nature Biotechnology 2019
这是《生命科学的数学统计和机器学习》专栏中的第8篇文章,我试图涵盖生物信息学、生物医学、遗传学、进化科学等常见的分析技术。 今天我们将讨论应用于单细胞基因组数据的降维技术。 其中,我们将比较线性降维和非线性降维技术,以了解为什么tSNE和UMAP成为单细胞生物学的黄金标准。
单细胞数据的非线性结构 (Non-Linear Structure of Single Cell Data)
单细胞基因组数据是一种高维数据,大约有20 000 维,对应于蛋白质编码基因。 因此,为了简化数据复杂性并克服维度诅咒(维灾),可以从分析中消除冗余基因(redundant genes)。排除冗余基因并将数据投影到一个潜在空间(latent space),使该空间中数据的隐藏结构变得清晰透明是降维的目标。
从原始表达矩阵到潜在特征的处理过程:from Wang et al., Nature Methods 14, p. 414–416 (2017)主成分分析(Principal Component Analysis, PCA)是一种基本的线性降维技术,由于单细胞的高度非线性结构,已被广泛认为不适用于单细胞数据。直觉来看,单细胞的非线性主要来自基因表达式矩阵中由dropout效应而引起的大量的随机零值。通常,单个细胞数据在表达式矩阵中具有60-80%的零元素。这样的话,单个细胞数据就类似于图像数据,例如,对于手写数字MNIST数据集的图像,我们有86%的像素为零值。
MNIST手写数字数据集的tSNE非线性降维
表达矩阵中的大量随机零值使得数据的行为类似于非线性Heaviside阶跃函数,即无论“非零”有多少,基因表达都是零或非零。让我们展示针对癌症相关成纤维细胞 (CAF) 单细胞数据集的进行的基本线性和非线性降维技术。
线性降维技术
我们先从线性降维技术开始。在这里,我们读取单细胞CAFs表达数据,并进行log-transform处理,log-transform被视为是对数据进行归一化的方法。通常,列是基因,行是细胞,最后一列是CAFs数据集中发现的4个细胞群(cluster)的 ID,即该细胞的cluster名称。
import numpy as np
import pandas as pd
expr = pd.read_csv('CAFs.txt',sep='\t')
print("\n" + "Dimensions of input file: " + str(expr.shape) + "\n")
print("\n" + "Last column corresponds to cluster assignments: " + "\n")
print(expr.iloc[0:4, (expr.shape[1]-4):expr.shape[1]])
X = expr.values[:,0:(expr.shape[1]-1)]
Y = expr.values[:,expr.shape[1]-1]
X = np.log(X + 1)
现在我们将使用scikit-learn流形学习库(scikit-learn manifold learning)应用最主流的线性降维技术。 查看我的github站点获得完整的脚本,为了简单起见,这里只显示线性判别分析 (Linear Discriminant Analysis,LDA) 的代码:
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
model = LinearDiscriminantAnalysis(n_components = 2, priors = None, shrinkage = 'auto',
solver = 'eigen', store_covariance = False, tol = 0.0001)
lda = model.fit_transform(X, Y)
plt.scatter(lda[:, 0], lda[:, 1], c = Y, cmap = 'viridis', s = 1)
plt.xlabel("LDA1", fontsize = 20); plt.ylabel("LDA2", fontsize = 20)
feature_importances = pd.DataFrame({'Gene':np.array(expr.columns)[:-1],
'Score':abs(model.coef_[0])})
print(feature_importances.sort_values('Score', ascending = False).head(20))
CAFs单细胞数据集应用线性降维技术
我们可以立即得出结论,线性降维技术并不能完全解决单细胞数据中的异质性问题。 例如,黄色的一小群细胞似乎没有与其他3个细胞群区分开。 唯一的例外是LDA 图,但这并不是真正的无监督学习方法,因为与其他方法相比,它通过细胞标签(cluster信息)来构建类别之间最可分离的潜在特征。 因此,线性降维技术擅长保留数据的全局结构(所有数据点之间的连接),而对于单细胞数据似乎更重要的是保持数据的局部结构(相邻点之间的连接)。图片来源
MDS试图保持全局结构,而LLE则保持数据的局部结构
探索如何将数据如何转化为潜在的低维特征呈现真的很有趣,每一种降维技术都值得发表自己的文章。想想为什么基本上每种降维技术都只适用于某一特定研究领域,而在其他领域却不常见,这也很有趣。例如,独立成分分析(Independent Component Analysis,ICA)用于信号处理,非负矩阵分解(Non-Negative Matrix Factorization,NMF)用于文本挖掘,非度量多维缩放(NMDS)在宏基因组分析等中非常常见,但很少看到NMF用于RNA测序数据分析。
非线性降维技术
我们转向非线性降维技术,检查它们是否能够解决单细胞数据中的所有隐藏结构。同样,可以在github上找到完整的代码,为了简单起见,这里只展示了tSNE算法的代码,已知该算法难以处理真正的高维数据,因此通常只在20–50个预降维数据上运行,例如PCA。
from sklearn.manifold import TSNE
from sklearn.decomposition import PCA
X_reduced = PCA(n_components = 30).fit_transform(X)
model = TSNE(learning_rate = 10, n_components = 2, random_state = 123, perplexity = 30)
tsne = model.fit_transform(X_reduced)
plt.scatter(tsne[:, 0], tsne[:, 1], c = Y, cmap = 'viridis', s = 1)
plt.title('tSNE on PCA', fontsize = 20)
plt.xlabel("tSNE1", fontsize = 20)
plt.ylabel("tSNE2", fontsize = 20)
在这里我们看到,大多数非线性降维技术通过保留数据的局部结构(相邻点之间的连接)成功地解决了黄色小细胞群。例如,局部线性嵌入(Locally Linear Embedding,LLE)通过一组局部线性平面逼近非线性流形,而这对于重建稀有细胞群(例如黄色小细胞群)至关重要。最好的可视化来自 tSNE 和 UMAP。tSNE 捕获局部结构以及LLE,在这种特定情况下似乎对原始表达式数据有效,但是使用PCA进行预降维通常会提供更为精简和独特的聚类。相比之下,UMAP保留了局部和全局数据结构,并基于拓扑数据分析,其中流形表示为基本单纯形(Simplex)单元的集合,这确保了数据点之间的距离在高维流形中看起来并不完全相等,但类似于2D 空间的距离分布。换言之,UMAP是一次优雅的尝试,旨在打破维度诅咒,我将在另一篇文章中专门介绍UMAP背后的数学。
总结
在这篇文章中,我们了解到单细胞基因组数据具有非线性结构(non-linear structure ),这是由dropout效应导致表达矩阵中大量随机零值的原因。 线性流形学习(linear manifold learning)技术保留了数据的全局结构,但是不能完全解析所有存在的细胞群。 相比之下,保持数据点之间的局部连通性(LLE、tSNE、UMAP)是单细胞基因组数据成功降维的关键因素。
基本概念
1. 流形学习方法(Manifold Learning)
简称流形学习,自2000年在著名的科学杂志《Science》被首次提出以来,已成为信息科学领域的研究热点。在理论和应用上,流形学习方法都具有重要的研究意义。假设数据是均匀采样于一个高维欧氏空间中的低维流形,流形学习就是从高维采样数据中恢复低维流形结构,即找到高维空间中的低维流形,并求出相应的嵌入映射,以实现维数约简或者数据可视化。它是从观测到的现象中去寻找事物的本质,找到产生数据的内在规律。
目的:在保持流形上点的某些几何性质特征的情况下,找出一组对应的内蕴坐标(intrinsic coordinate),将流形尽量好的展开在低维平面上,这种低维表示也叫内蕴特征(intrinsic feature),外围空间的维数叫观察维数,其表示叫自然坐标,在统计上称为observation。
寻找一种映射,从高维空间中恢复出低维流形来,从而利用流形的低维坐标表示高位空间的数据点,实现数据降维的目的。
2. 流形学习的分类
分线性和非线性两种;
线性的流形学习方法:主成份分析(PCA)
非线性的流形学习方法:等距映射(Isomap)、拉普拉斯特征映射(Laplacian eigenmaps,LE)、局部线性嵌入(Locally-linear embedding,LLE),tSNE,UMAP