RNA速率:细胞内部的指南针
博文名称:RNA Velocity: The Cell’s Internal Compass
博文链接:https://towardsdatascience.com/rna-velocity-the-cells-internal-compass-cf8d75bb2f89
发表时间:Sep 1, 2021
单细胞RNA测序 (scRNA-seq) 在过去十年中彻底改变了我们研究细胞生物学的方式,单细胞基因组学领域迎来了快速发展。scRNA-seq使我们能够分析单个细胞的转录组,从而全面了解它们的功能和身份。 转录组是指细胞的所有信使核糖核酸 (mRNA) 分子的集合。在过去的一年中,你可能经常听说过mRNA,许多COVID-19疫苗都依赖于这种分子。mRNA是基因的读出和转录。这些分子携带有关细胞用来构建蛋白质的目的基因的信息。在mRNA的COVID-19疫苗中,它们携带有关如何制造针对SARS-CoV2病毒的良性蛋白质的信息,有效地教会我们的身体如何抵抗感染。这些mRNA 分子的产生称为转录,这些分子有时也相应地称为转录本。你经常会听到生物学家将mRNA丰度更广泛地称为基因表达。你可以把它想象成建造宜家(IKEA)的家具:指令是转录的mRNA分子,相应的蛋白质是家具。然而,在mRNA被翻译之前,它必须经历一个额外的步骤。那些不编码蛋白质的mRNA分子片段称为内含子。这些内含子在蛋白质翻译之前会被去除,这个过程称为剪接。mRNA其余部分称为外显子。
image.png你可以将转录组信息视为细胞指纹,通过识别它将其与其他细胞区分开来(例如,红细胞与神经元)。通过对数十万个细胞的转录组进行测序,我们可以构建一个完整的、高维的细胞状态图,这些细胞状态在干细胞转变为更特化的细胞(如神经元)、表征癌症肿瘤以及区分患者的健康和患病组织。单细胞测序因此产生了GB级数据需要分析和理解,由于我们的数据集有很多维度,每个维度对应一个基因,这可能会变得复杂。 这看起来很酷,对吧? 但是,这种方法有一个严重的缺点。 这些测序实验会杀死实验过程中的细胞,阻止我们在以后的时间点再次对这些细胞进行重新测序。 因此,我们只剩下细胞mRNA丰度的静态快照,这使得推断其未来的基因表达具有挑战性。 我们如何解决这个问题?
这就是RNA速率的用武之地。 RNA速率是一种简单而强大的方法,可以让我们预测细胞未来的基因表达。前面我们提到的mRNA可以通过剪接(spliced)和未剪接(unspliced)转录本来区分。虽然剪接转录本是大多数scRNA-seq实验的主要读数,但也检测了未剪接转录本的表达。使用这些额外的信息,我们可以建立一个简单的数学模型来预测未来的剪接表达。
image.png image.png其中u是未剪接的mRNA分子数,s是剪接后的 mRNA 分子数,α是转录速率,β是未剪接到剪接的剪接速率,γ是剪接后mRNA产物的降解速率。
绝大多数情形下的RNA-seq实验所测得的由转录本片段数所代表的基因表达量实际上仅是基因转录、RNA剪接、RNA降解等一系列胞内化学反应达到稳态时的RNA分子总丰度。
根据给定细胞的特定基因的未来mRNA表达与当前mRNA之间的差异,我们可以推导出基因表达变化的度量。这些可以针对给定细胞的所有基因进行聚合,以创建细胞未来转录组的向量,代表所述细胞变化的速度和方向——因此称为 RNA 速率。一种常见的可视化方法是将向量场叠加到嵌入图中的细胞上,如下所示:
在PCA图中神经发育过程的细胞RNA 速率来自 La Manno 等人,Nature 560:494–498(2018)
这是经历神经发育的细胞的PCA图 - 大脑中神经元(红色)由称为径向神经胶质(蓝色)的干细胞样细胞产生。每个点代表一个细胞,上面叠加了一个 RNA 速率向量,预测细胞转变。注意这些箭头为何在中间阶段(神经母细胞和未成熟神经元)变长——这表明基因表达的动态变化,因为神经元的基因被打开,而径向神经胶质细胞的基因被关闭。随着这些细胞成功转变为神经元,箭头迅速缩短,反映了这些细胞基因表达的“减速”。你可以将这些箭头视为类似于细胞的指南针:一个内部的GPS,可以确定细胞想要成为神经元时需要去的方向。
RNA 速率有两种主要模型:稳态模型(steady-state model)和动态模型(dynamical model)。稳态模型是在Nature 上发表的原始模型,如上图所示。该模型假设通用的、转录组范围内的剪接率,并且基因表达遵循稳态:即,当ds/dt=0时,速度估计为与γ拟合的剪接分子与未剪接分子的比率的偏差,由u = γs.。我在下面有一个例子:
该图根据SOX2基因转录的剪接与未剪接分子计数绘制了先前显示的神经发生PCA中的单个细胞,SOX2是放射状胶质细胞的标记(蓝色)。实线是从广义线性回归模型导出的u=γs拟合。这条线(u>γs)以上的细胞被认为具有正速度。这意味着未剪接SOX2 mRNA分子的产生超过其拼接对应物的降解:我们有SOX2 mRNA的净产出。相比之下,黑线(u<γs)以下的细胞具有负速度:降解的SOX2多于产生的SOX2,导致净损失。直线上的细胞速度为零,因为它们没有偏离未拼接与拼接mRNA分子的γ拟合比率。
相比之下,动态模型直接求解每个基因的完整转录动力学,而不是进行转录组范围的假设。它不是尝试将数据拟合到回归模型中,而是使用期望最大化算法(Expectation Maximization,EM)来估计参数,该算法使用最大似然来迭代逼近α、β和γ,并学习给定基因的剪接/未剪接轨迹。这为每个基因分配了如下似然函数:
而
image.png
分别代表观察到的细胞i中特定基因的未剪接和剪接mRNA分子,而xₜᵢ 表示时间t时的未剪接/剪接分子i基于推断的参数集 θ = (α, β, γ) 。具有高可能性的基因被认为是引起人们兴趣的生物现象—在我们的例子中,神经发生neurogenesis—动态变化的主要因素。但是,算了吧,让我们看看它的实际效果!
现在让我们自己尝试RNA速率,请使用以下任一pip安装包 scvelo:
pip install -U scvelo
如果你更喜欢conda,您可以通过bioconda渠道进行安装,如下所示:
conda install -c bioconda scvelo
你还需要scanpy,可以从conda-forge安装它。这是一个流行的Python单细胞分析库。
conda install -c conda-forge scanpy
我们将使用上面描述的人类神经发育数据集作为示例,我将通过案例说明和比较稳态模型和动态模型。该数据集包含1720个细胞,代表神经发育过程中的四种主要细胞类型:放射状胶质细胞(radial glia)、成神经细胞(neuroblasts)、未成熟神经元(immature neurons)和神经元(neurons)。
首先,我们将从网上下载数据集:
from urllib.request import urlretrieve
urlretrieve("http://pklab.med.harvard.edu/velocyto/hgForebrainGlut/hgForebrainGlut.loom", "data/hgForebrainGlut.loom")
然后,导入我们的包
import numpy as np
import pandas as pd
import scanpy as sc
import scvelo as scv
# scv.logging.print_version()
scv.settings.verbosity = 3 # show errors(0), warnings(1), info(2), hints(3)
scv.settings.presenter_view = True # set max width size for presenter view
scv.settings.set_figure_params('scvelo') # for beautified visualization
我们将我们的数据集读入一个Annotated Data (anndata) 对象。这是一种在Python中存储用于分析的单细胞数据的流行方法:
adata = scv.read('data/hgForebrainGlut.loom')
adata.var_names_make_unique()
# standard pre-processing for scRNA-seq
scv.pp.filter_and_normalize(adata, min_shared_counts=20, n_top_genes=2000) #this filters cells with low counts of spliced/unspliced mRNA molecules, and keeps the top 2000 highly variable genes
scv.pp.moments(adata, n_pcs=30, n_neighbors=30) #this calculates second-order moments that will be used for solving the stochastic model of RNA velocity
现在我们将计算RNA速率。 scvelo为此使用两个函数:scv.tl.velocity() 计算每个基因的速度,scv.tl.velocity_graph() 输出基于速度和潜在细胞状态转换之间的余弦相似度的速度图。 换句话说,它测量细胞基因表达的变化与其预测速度向量的匹配程度,该向量可用于推导出转移概率。 我们还将数据中的数字聚类标签更改为论文中定义的细胞类型。
## This section is for changing the nomenclature of the predefined numerical clusters in the original file
new_cluster_names = [
'Radial glia 1', 'Radial glia 2',
'Neuroblast',
'Immature Neuron 1', 'Immature Neuron 2',
'Neuron 1', 'Neuron 2']
# adata.rename_categories('Clusters', new_cluster_names)
adata.obs.Clusters = adata.obs.Clusters.astype('category')
adata.obs.Clusters= adata.obs.Clusters.cat.rename_categories(new_cluster_names)
newNames = np.array(adata.obs['Clusters'])
for i in range(len(adata.obs['Clusters'])):
if (adata.obs['Clusters'][i] == 'Immature Neuron 1' or adata.obs['Clusters'][i] == 'Immature Neuron 2'):
newNames[i] = 'Immature Neuron'
elif (adata.obs['Clusters'][i] == 'Radial glia 1' or adata.obs['Clusters'][i] == 'Radial glia 2'):
newNames[i] = 'Radial glia'
elif (adata.obs['Clusters'][i] == 'Neuron 1' or adata.obs['Clusters'][i] == 'Neuron 2'):
newNames[i] = 'Neuron'
adata.obs['Cell_types'] = newNames
scv.tl.velocity(adata, mode='deterministic')
scv.tl.velocity_graph(adata)
sc.tl.pca(adata)
scv.pl.velocity_embedding(adata, arrow_length=3, color = 'Cell_types', legend_loc = 'on data', arrow_size=1.4, dpi=150)
scv.pl.velocity_embedding_stream(adata, color = "Cell_types", size = 20,alpha =0.9, save="scvelo_velocity-embedding-stream-cluster.png", figsize=(7,7), dpi=600, legend_fontsize = 8, show=False, title='')
下面为我们提供了PCA 图,类似于论文中的图:
说明:我在服务器测试了该案例,代码运行有点小问题,我更改了,另外出图也不一致,应该是scvelo版本的问题。左图是文章的原图;右图是我生成的RNA速率图。
如你所见,每个细胞上都叠加了一个箭头,用于预测其未来的转录组。这些方向一致的箭头给了我们一种全局方向感,显示了从径向神经胶质细胞到神经元的线性进展。 但是,你可能已经注意到,一些绿色的神经母细胞(neuroblasts)似乎正在恢复为放射状胶质细胞。 在一些神经元中也有类似的现象,尽管程度较轻。 这些回流可归因于两个主要原因:1) 如前所述,原始RNA速率模型的稳态假设不能准确反映更多瞬态细胞群,例如神经母细胞; 2)scRNA-seq非常稀疏。 基因很容易逃避测序平台的检测,导致“丢失”(drop-out),这些mRNA测量值被错误地记录为零。 规避这种情况的一种方法是使用缺值填补(imputation),我们通过计算推断缺失值。 一种类似的方法是通过数据平滑来消除由固有稀疏性产生的噪声,原始论文的作者通过 k-最近邻池化来做到这一点。 这些方法中的每一种都有缺点,并且关于是否应该将它们完全用于scRNA-seq分析的争论也是如此,因为结果可能会产生误导。 出于本文的目的,我将继续以原始形式呈现数据集。
我们可以通过生成相位图进一步探索细胞的基因特异的速率变化:
scv.pl.velocity(adata, var_names='SOX2', color = 'Cell_types', colorbar=True)
scv.pl.velocity(adata, var_names='SOX2', color = 'Cell_types', colorbar=True, save="steady-state.png")
image.png
最左侧是SOX2表达的剪接与未剪接图,是放射状胶质细胞的标志物。 每个点都是一个按细胞类型着色的细胞(蓝色代表放射状胶质细胞,绿色代表神经母细胞,深金色代表未成熟神经元,红色代表神经元)。 如前所述,确定性模型通过假设稳态模型来求解未来表达量。 这条黑线代表 ds/dt 稳态解的回归拟合,用 u = γs 表示。 假定这条线以上的细胞具有正速率:SOX2 被上调,这些细胞中产生的净产量超过其降解。 我们看到一些放射状胶质细胞似乎显示出这种现象,如右侧的表达图所示,上面PCA图中的细胞根据它们的SOX2表达水平进行着色。 然而,大多数正在关闭SOX2活性(由中间图中的负速度表示),因为它们开始分化,正如在其他细胞类型中SOX2的零速度所证明的那样:它们不再为它转录或降解mRNA分子 ,这解释了这些细胞类型中的最低表达水平。
如前所述,虽然功能强大,但稳态模型的局限性在于它假设稳态表达水平和恒定剪接速率。 在更复杂的系统中,具有多个最终状态(即干细胞可以最终分化为不同的细胞)和异质亚群,这种假设可能会失败并产生错误的解释。 这就是前面提到的动态模型的用武之地。我们可以使用以下代码实现动态模型:
scv.tl.recover_dynamics(adata) # this line takes about two minutes to run
scv.tl.velocity(adata, mode='dynamical')
scv.tl.velocity_graph(adata)
scv.pl.velocity_embedding(adata, arrow_length=3, color = 'Cell_types', legend_loc = 'on data', arrow_size=1.4, dpi=150)
scv.pl.velocity_embedding(adata, arrow_length=3, color = 'Cell_types', legend_loc = 'on data', arrow_size=1.4, dpi=150, save="dynamical-state.png")
image.png
在这里,我们观察到neuroblasts相邻细胞之间在方向上有更大的一致性(尽管成神经细胞之间在方向上仍然存在分歧,这可以通过数据平滑来解决),有明显的主导趋势朝向神经元。 使用每个基因的似然估计,我们可以提取表现出最显著的动态行为的基因:
top_genes = adata.var['fit_likelihood'].sort_values(ascending=False).index[:100]
adata.var['fit_likelihood'].sort_values(ascending=False)[:15] # Look at the likelihoods for the top 15 genes
NPAS3 0.994760
CREB5 0.896914
FOS 0.882965
SLC1A3 0.806150
SYT1 0.749349
MYT1L 0.737498
MAPT 0.687999
GLI3 0.663777
DOK5 0.656130
LINC01158 0.651856
RBFOX1 0.608533
TCF4 0.592459
FRMD4B 0.580061
HMGN3 0.577301
ZBTB20 0.575223
Name: fit_likelihood, dtype: float64
scv.pl.scatter(adata, basis='RBFOX1', color = 'Cell_types')
scv.pl.scatter(adata, basis='RBFOX1', color = 'Cell_types', save="RBFOX1.png")
image.png
image.png
该图显示了基因RBFOX1的未剪接/剪接的轨迹,图中的点根据细胞类型着色(蓝色代表放射状胶质细胞,绿色代表神经母细胞,深金色代表未成熟神经元,红色代表神经元),以及学习来自EM算法的动力学拟合曲线,用紫色曲线表示。 你可以看到实线如何提供比虚线稳态模型更好的拟合,随着细胞从径向胶质细胞到神经元,未剪接mRNA相对于剪接mRNA的转录迅速增加,表明该基因在神经元中被激活,而在放射状胶质细胞中则不活跃。 我们可以观察到几个基因在神经发生的不同部分上调和下调的类似动态,如下所示:
scv.pl.scatter(adata, basis=top_genes[:6], ncols = 3, color = 'Cell_types', figsize = (14,14))
scv.pl.scatter(adata, basis=top_genes[:6], ncols = 3, color = 'Cell_types', figsize = (14,14), save="top_genes.png")
image.png
最后的思考
scRNA-seq的一个主要缺点是它只产生细胞转录组的快照;你无法重新对你的样本进行连续测序。RNA速率是规避这一限制的有效方法,通过利用 RNA生物学来推断未来的基因表达,绘制细胞的内在的转录指南并为你的数据提供发育方向。这可以用来说明细胞到达特定终点的不同途径,基因表达变化的速度,构建干细胞如何变得更加特化的整体轨迹,等等。然而,它并非没有自身的局限性。 如前所述,scRNA-seq数据通常是稀疏且嘈杂的。 另外,对于描述良好的生物过程来说,RNA速率随后可能是不直观的,或者根本不正确的。 虽然缺值填补(imputation)和数据平滑( data smoothing)等方法可以帮助纠正这些问题,但应谨慎使用它们,因为它们容易消除实际生物噪声,从而提供“有价值”的见解,例如向我们数据集中不存在的细胞的潜在转变。
尽管如此,它是一种强大的方法,为理解高维生物数据提供了很多清晰度,并且随着数据科学领域的不断发展,这种方法将继续得到进一步完善。 这十年单细胞基因组学的目标之一是有效整合测量细胞不同特性(例如,RNA、蛋白质、表观遗传学等)的高维数据集。 可以扩展 RNA 速率等方法来了解这些不同模式之间的关系,从而对细胞间的转换做出强有力的推断,从而微调细胞的指南针。
参考文献:
[1] G. La Manno, R. Soldatov, A. Zeisel, E. Braun, H. Hochgerner, V. Petukhov, K. Lidschreiber, M. E. Kastriti, P. Lönnerberg, A. Furlan, J. Fan, L. E. Borm, Z. Liu, D. van Bruggen, J. Guo, X. He, R. Barker, E. Sundström, G. Castelo-Branco, P. Cramer, I. Adameyko, S. Linnarsson, and P. V. Kharchenko, RNA velocity of single cells, (2018), Nature
[2] V. Bergen, M. Lange, S. Peidli, F. Alexander Wolf & F. J. Theis, Generalizing RNA velocity to transient cell states through dynamical modeling, (2020), Nature Biotechnology
[3] V. Bergen, R. Soldatov, P. V. Kharchenko, F. J. Theis, RNA velocity — current challenges and future perspectives, (2021), Molecular Systems Biology