Monocle2 | 单细胞测序的拟时序分析(细胞轨迹分析)

Python017

Monocle2 | 单细胞测序的拟时序分析(细胞轨迹分析),第1张

伪时间是衡量单个细胞在细胞分化等过程中取得了多大进展的指标。在许多生物学过程中,细胞并不是完全同步的。在细胞分化等过程的单细胞表达研究中,捕获的细胞在分化方面可能分布广泛。也就是说,在同一时间捕获的细胞群中,有些细胞可能已经很长时间了,而有些细胞甚至还没有开始这个过程。当您想要了解在细胞从一种状态转换到另一种状态时所发生的调节更改的顺序时,这种异步性会产生主要问题。跟踪同时捕获的细胞间的表达可以产生对基因动力学一个大致的认识,该基因表达的明显变异性将非常高。Monocle根据每个cell在学习轨迹上的进展对其进行排序,从而缓解了由于异步而产生的问题。Monocle不是跟踪表达式随时间变化的函数,而是跟踪沿轨迹变化的函数,我们称之为伪时间。伪时间是一个抽象的分化单位:它只是一个cell到轨迹起点的距离,沿着最短路径测量。轨迹的总长度是由细胞从起始状态移动到结束状态所经历的总转录变化量来定义的。

还是老规矩,跟着官网学习Monocle2的使用方法。官网如下:

单细胞基因表达研究使人们能够在复杂的生物过程和高度异质性的细胞群中描述转录调控。这些研究有助于发现识别特定亚型细胞的基因,或标记生物过程中的中间状态,以及在两种不同的细胞命运之间过渡态的基因。在许多单细胞研究中,单个细胞是以不同步的方式执行基因表达过程。实际上,每个细胞都是正在研究的转录过程中的一个瞬间。Monocle包是分析单细胞测序的工具。 Monocle引入了在伪时间(拟时间)内对单个细胞排序的策略,利用单个细胞的非同步进程,将它们置于与细胞分化等生物学过程相对应的轨迹上。****Monocle利用先进的机器学习技术(反向图嵌入)从单细胞数据中学习显式的主图来对细胞进行排序,这可以强大而准确地解决复杂的生物过程。 Monocle也可以进行聚类(即使用t-SNE和密度峰值聚类)。Monocle也可以进行差异基因表达测试,使人们能够识别在不同状态下差异表达的基因,沿着生物过程以及不同的细胞命运时基因表达的变化。Monocle是专为单细胞RNA-Seq研究设计的,但也可以用于其他分析。

Monocle 2包括新的和改进的算法,用于对细胞进行分类和计数,执行细胞亚群之间的差异表达分析,以及重建细胞轨迹。Monocle 2也被重新设计,可以很好地完成包含数万个或更多细胞的大型单细胞RNA-Seq数据分析。

Monocle perform three main types of analysis:

首先,Monocle 2使用一种简单的、无偏的和高度可扩展的统计程序来选择具有轨迹进展特征的基因。然后,它采用了一类流形学习算法,旨在在高维单细胞RNA-seq数据中嵌入一个主图。以前的方法是通过启发式分析细胞之间的成对距离来推断分支结构,而Monocle 2可以使用这张图来直接识别发育的命运决定。我们已经通过广泛的基准测试证明,Monocle 2优于其他工具,如Wishbone,而不需要用户指定轨迹的结构。

Monocle 2的算法是再2017年发表在nature methods 上,文章链接如下

文章中的核心理论为:每个细胞都可以表示为高维空间中的一个点,在高维空间中,每个维对应着一个有序基因的表达水平。高维数据首先通过几种降维方法,如PCA(默认)、扩散映射等,投射到低维空间。 Monocle 2然后在自动选择的一组数据质心上构造一棵生成树。 然后, 该算法将细胞移动到它们最近的树的顶点,更新顶点的位置以适应细胞,学习新的生成树,并迭代地继续这个过程,直到树和细胞的位置已经收敛。在这个过程中,Monocle 2保持了高维空间和低维空间之间的可逆映射,从而既学习了轨迹,又降低了数据的维数。****一旦Monocle 2学会了树,用户就会选择一个tip作为根。计算每个单元的伪时间作为其沿树到根的测地线距离,并根据主图自动分配其分枝。 因为monocle2学习树结构,与其他方法相比,分支结构自动出现。当它更新细胞位置并细化树时,monocle2简化了轨迹的结构,修剪了小的分支,这样最终的轨迹只保留了描述细胞状态显著差异的分支。

Monocle需要在R语言环境下运行。官网给出的都是R-3.4比较老的版本,现在都是R-3.6或者R-4.0以上版本。我们可以直接在Bioconductor中安装Monocle 2

查看系统中安装的这个包的版本文档

当然也可以在GitHub上安装最新版的Monocle2。

有时我们添加的特性需要你安装某些额外的软件包。当您尝试上面的命令时,可能会看到错误。您可以通过输入(例如)来在错误消息中安装包。

最后检查一下是否安装成功

方法一: 将Seurat object中数据提取来创建

FPKM/TPM值通常是对数正态分布的,而UMIs或读计数使用负二项更好地建模。要处理计数数据,请将负二项分布指定为newCellDataSet的expressionFamily参数:

稀疏矩阵用negbinomial.size(),

FPKM值用tobit(),

logFPKM值用gaussianff()

方法二: 直接读取表达矩阵来创建

方法三: 将Seurat对象直接转化为CellDataSet对象

如果我们想要从Seurat对象或SCESet中导入所有的插槽,我们可以设置参数'import_all'为TRUE。#(默认为FALSE或只保留最小数据集)

size facotr帮助我们标准化细胞之间的mRNA的差异。

离散度值可以帮助我们进行后续的差异分析。

大多数单细胞工作流程至少会包含一些由死细胞或空孔组成的库。同样重要的是要删除doublets:由两个或多个细胞意外生成的库。这些细胞可以破坏下游步骤,如伪时间排序或聚类。要知道一个特定的基因有多少个表达,或者一个给定的细胞有多少个基因表达,通常是很方便的。Monocle提供了一个简单的函数来计算这些统计数据。

Monocle官网教程提供了4个分类方法:

1、Classifying cells by type

Monocle提供了一个简单的系统,根据您选择的标记基因的表达来标记细胞。您只需提供一组函数,Monocle就可以使用这些函数对每个单元格进行注释。例如,您可以为几种单元格类型中的每种类型提供一个函数。这些函数接受每个单元格的表达式数据作为输入,并返回TRUE以告诉Monocle某个单元格满足函数定义的条件。所以你可以有一个功能,对表达成肌细胞特异性基因的细胞来说是真的,另一个功能对成纤维细胞特异性基因来说是真的,等等。

2、Clustering cells without marker genes

Monocle提供了一种算法,可以用来计算“未知”单元格的类型。该算法在函数clusterCells中实现,根据全局表达式轮廓将单元格分组在一起。这样的话,如果你的细胞表达了许多特定于成肌细胞的基因,但恰好缺少MYF5,我们仍然可以识别它为成肌细胞。clusterCells可以在无监督的方式下使用,也可以在半监督的“”模式下使用,这允许使用一些专家知识来辅助算法。我们先来看看无监督模式。

第一步是决定哪些基因用于细胞聚类。我们可以使用所有的基因,但是我们会包含很多基因,这些基因的表达水平不足以提供有意义的信号。包括它们只会给系统增加噪音。我们可以根据平均表达水平筛选基因,我们还可以选择在细胞间异常可变的基因。这些基因往往对细胞状态有很高的信息量。

setOrderingFilter函数标记了在随后对clusterCells的调用中用于聚类的基因,尽管我们可以根据需要提供其他基因列表。plot_ordering_genes函数显示了基因表达的变异性(离散性)如何依赖于细胞间的平均表达。红线表示基于这种关系的单片体对色散的预期。我们标记用于聚类的基因显示为黑点,而其他基因显示为灰点。

Monocle使用t-SNE来给细胞聚类可视化

指定10个cluster

3、Clustering cells using marker genes

首先,我们将选择一组不同的基因用于细胞聚类。在我们挑选高表达和高度可变的基因之前。现在,我们将挑选与标记共变异的基因。从某种意义上说,我们将建立一个大的基因列表来作为标记,这样即使一个细胞没有MYF5,它也可以被其他基因识别为成肌细胞。

函数markerDiffTable接受CellDataSet和CellTypeHierarchy,并根据提供的函数将所有单元格分类为类型。然后在识别不同基因类型之间差异表达的基因之前,它去除了所有“未知”和“不明确”的功能。同样,您可以提供要从该测试中排除的影响的剩余模型。然后函数返回一个测试结果的数据帧,您可以使用它来选择要用于聚类的基因。通常情况下,最好挑选最适合每种细胞类型的前10或20个基因。这确保了聚类基因不受一种细胞类型标记的支配。如果可能的话,通常需要为每种类型创建一个平衡的标记面板。Monocle提供了一个方便的功能,可以根据基因在每种类型中的表达受限程度来对基因进行排序。

4、Imputing cell type

注意,我们已经减少了成肌细胞群中“污染”成纤维细胞的数量,反之亦然。但是“未知”细胞呢?如果为clusterCells提供CellTypeHierarcy,Monocle将使用它对整个簇进行分类,而不仅仅是单个细胞。基本上,clusterCells的工作原理与以前完全相同,只是在构建集群之后,它会统计每个集群中每种细胞类型的频率。当一个簇由超过一定百分比(在本例中为10%)的特定类型组成时,簇中的所有单元格都被设置为该类型。如果一个集群由多个单元类型组成,则整个集群都被标记为“不明确”。如果没有高于阈值的单元类型,则集群被标记为“未知”。因此,Monocle可以帮助您在缺少标记数据的情况下估算每个细胞的类型。

在发育过程中,为了对刺激做出反应,在整个生命周期中,细胞从一种功能“状态”过渡到另一种功能“状态”。处于不同状态的细胞表达不同的基因,产生蛋白质和代谢物的动态重复,从而完成它们的工作。当细胞在不同的状态间移动时,会经历一个转录重组的过程,一些基因被沉默,而另一些则被激活。这些瞬态通常很难描述,因为在更稳定的端点状态之间净化细胞可能很困难或不可能。单细胞RNA-Seq可以让你看到这些状态而不需要纯化。然而,要做到这一点,我们必须确定每个细胞的可能状态范围。

Monocle介绍了利用RNA-Seq进行单细胞轨迹分析的策略。Monocle不是通过实验将细胞净化成离散状态,而是使用一种算法来学习每个细胞作为动态生物过程的一部分必须经历的基因表达变化序列。一旦掌握了基因表达变化的整体“轨迹”,Monocle就可以将每个细胞放置在轨迹中的适当位置。然后,你可以使用Monocle的差异分析工具来寻找在轨迹过程中受调控的基因,如“寻找随假时间变化的基因”一节所述。如果这个过程有多个结果,Monocle将重建一个“分支”轨迹。这些分支与细胞的“决定”相对应,Monocle提供了强有力的工具来识别受它们影响并参与制造它们的基因。在“分析单细胞轨迹中的分支”部分中,可以看到如何分析分支。Monocle依靠一种称为反向图嵌入的机器学习技术来构造单细胞轨迹.

Step 1: 选择定义过程的基因

推断单细胞轨迹是一个机器学习问题。第一步是选择Monocle将用作机器学习方法输入的基因。这叫做特征选择,它对轨迹的形状有很大的影响。在单细胞RNA-Seq中,低水平表达的基因通常非常嘈杂,但有些基因包含有关细胞状态的重要信息。单核细胞通过检测这些基因在细胞群体中的表达模式来对细胞进行排序。Monocle寻找以“有趣的”(即不只是嘈杂的)方式变化的基因,并用它们来构造数据。Monocle为您提供了多种工具来选择基因,这些基因将产生一个健壮、准确和具有生物学意义的轨迹。你可以使用这些工具来执行一个完全“无监督”的分析,在这个分析中,Monocle不知道你认为哪个基因是重要的。或者,你可以利用marker gene知识来定义生物学进展,从而形成Monocle的轨迹。我们认为这种模式是“半监督”的分析。

Monocle官网教程提供了4个选择方法:

前三种都是无监督分析方法,细胞发育轨迹生成完全不受人工干预;最后一种是半监督分析方法,可以使用先验知识辅助分析。

理想情况下,我们希望尽可能少地使用正在研究的系统生物学的先验知识。我们希望从数据中发现重要的排序基因,而不是依赖于文献和教科书,因为这可能会在排序中引入偏见。我们将从一种更简单的方法开始,但是我们通常推荐一种更复杂的方法,称为“dpFeature”。

Step 2: 降维

下一步,我们将把空间缩小到一个二维空间,当Monocle对细胞进行排序时,我们将能够很容易地可视化和解释这些空间。

Step 3: 按照轨迹排序细胞

如果你的树上有一堆状态,那就很难弄清楚每个状态都落在树上的什么地方了。有时,可以方便地“分面”轨迹图,以便更容易地查看每个状态的位置.

如果你没有时间序列,你可能需要利用你对系统的生物学知识,根据特定标记基因的表达位置来设置根。例如,在这个实验中,一个高度增殖的祖细胞群正在产生两种类型的有丝分裂后细胞。因此,根部应该有表达高水平增殖标记的细胞。我们可以使用抖动图来判断哪种状态对应于快速扩散:

官方给出的差异分析有三大方法,我们重点关注第三个:****根据伪时间功能寻找差异基因

1、Basic Differential Analysis

2、Finding Genes that Distinguish Cell Type or State

3、Finding Genes that Change as a Function of Pseudotime

Monocle的主要工作是通过生物过程(如细胞分化)将细胞按顺序排列,而不知道要提前查看哪些基因。一旦这样做了,你就可以分析细胞,找到随着细胞进展而变化的基因。例如,你可以发现随着细胞“成熟”而显著上调的基因。让我们来看看一组对肌肉生成很重要的基因:

这个sm.ns函数指出Monocle应该通过表达式值拟合自然样条曲线,以帮助它将表达式的变化描述为进程的函数。让我们加入基因注释,这样就很容易看出哪些基因是重要的。

** 研究时间序列基因表达研究时出现的一个常见问题是:“哪些基因遵循相似的动力学趋势”?Monocle可以通过对具有相似趋势的基因进行分组来帮助你回答这个问题,所以你可以分析这些基因组,看看它们有什么共同点。Monocle提供了一种方便的方法来可视化所有假时间依赖性基因。函数plot_pseudotime_heatmap采用CellDataSet对象(通常只包含重要基因的子集),并生成平滑的表达曲线,非常类似于plot_genes_in_pseudotime。然后,它对这些基因进行聚类,并使用pheatmap软件包进行绘图。这让你可以想象出基因模块在不同的时间内共同变化。**

通常,单细胞轨迹包括分支。这些分支的产生是因为细胞执行不同的基因表达程序。在发育过程中,当细胞做出命运选择时,分支出现在轨迹中:一个发育谱系沿着一条路径前进,而另一个谱系产生第二条路径。Monocle包含分析这些分支事件的广泛功能。

以Steve Quake's的实验室进行的实验为例,Barbara Treutlein团队从发育中的小鼠肺中捕获了细胞。他们在发育早期捕获细胞,后来当肺中同时含有两种主要类型的上皮细胞(AT1和AT2)时,细胞就要决定变成AT1或AT2。Monocle可以将这个过程重构为一个分支轨迹,允许您对决策点进行非常详细的分析。下图显示了使用部分数据重建的Monocle轨迹。有一个分支,标记为“1”。当细胞从树的左上角经过树枝的早期发育阶段时,哪些基因会发生变化?哪些基因在分枝间有差异表达?为了回答这个问题,Monocle为您提供了一个特殊的统计测试:分支表达式分析建模,或BEAM。BEAM(Branched expression analysis modeling)是一种统计方法,用于寻找以依赖于分支的方式调控的基因。

BEAM进行统计分析

该热图显示的是同一时间点两个谱系的变化。热图的列是伪时间的点,行是基因。从热图中间往右读,是伪时间的一个谱系;往左是另一个谱系。基因是被按照等级聚类的,所以你看到的基因表达模式和谱系的表达模式是非常相似的。

We can plot a couple of these genes, such as Pdpn and Sftpb (both known markers of fate in this system), using the plot_genes_branched_pseudotime function, which works a lot like the plot_genes_in_pseudotime function, except it shows two kinetic trends, one for each lineage, instead of one.

相关资料:

官网

monocle2 拟时间分支点分析结果解读

单细胞分析实录(15): 基于monocle2的拟时序分析

Monocle2包学习笔记(四):Differential Expression Analysis

最合适的格式是EPS。导出的pdf文件,也可以用AI打开进行类似的编辑,支持带有透明度的图片。第一步,声明四个向量id、name、age和score,分别利用c()函数给这四个向量赋值;然后使用data.frame()函数生成数据帧,赋值给student并打印结果,第二步,获取第二列到第四列的数据元素,显示结果为name、age和score三列,第三步,获取数据帧的某一行数据,可以使用student,第四步,如果想要获取某一列的数据,可以利用student,第五步,利用向量函数获取数据帧中的某个或几个的属性值,可以使用数据帧[c(属性)]。

使用R语言进行协整关系检验协整检验是为了检验非平稳序列的因果关系,协整检验是解决伪回归为问题的重要方法。首先回归伪回归例子:伪回归Spurious regression伪回归方程的拟合优度、显著性水平等指标都很好,但是其残差序列是一个非平稳序列,拟合一个伪回归:#调用相关R包library(lmtest)library(tseries)#模拟序列set.seed(123456)e1=rnorm(500)e2=rnorm(500)trd=1:500y1=0.8*trd+cumsum(e1)y2=0.6*trd+cumsum(e2)sr.reg=lm(y1~y2)#提取回归残差error=residuals(sr.reg)#作残差散点图plot(error, main="Plot of error")#对残差进行单位根检验adf.test(error)## Dickey-Fuller = -2.548, Lag order = 7, p-value = 0.3463## alternative hypothesis: stationary#伪回归结果,相关参数都显著summary(sr.reg)## Residuals:## Min 1Q Median 3Q Max## -30.654 -11.526 0.359 11.142 31.006## Coefficients:## Estimate Std. Error t value Pr(>|t|)## (Intercept) -29.32697 1.36716 -21.4 <2e-16 ***## y2 1.44079 0.00752 191.6 <2e-16 ***## Residual standard error: 13.7 on 498 degrees of freedom## Multiple R-squared: 0.987, Adjusted R-squared: 0.987## F-statistic: 3.67e+04 on 1 and 498 DF, p-value: <2e-16dwtest(sr.reg)## DW = 0.0172, p-value <2.2e-16恩格尔-格兰杰检验Engle-Granger第一步:建立两变量(y1,y2)的回归方程,第二部:对该回归方程的残差(resid)进行单位根检验其中,原假设两变量不存在协整关系,备择假设是两变量存在协整关系。利用最小二乘法对回归方程进行估计,从回归方程中提取残差进行检验。set.seed(123456)e1=rnorm(100)e2=rnorm(100)y1=cumsum(e1)y2=0.6*y1+e2# (伪)回归模型lr.reg=lm(y2~y1)error=residuals(lr.reg)adf.test(error)## Dickey-Fuller = -3.988, Lag order = 4, p-value = 0.01262## alternative hypothesis: stationaryerror.lagged=error[-c(99,100)]#建立误差修正模型ECM.REGdy1=diff(y1)dy2=diff(y2)diff.dat=data.frame(embed(cbind(dy1, dy2),2))#emed表示嵌入时间序列dy1,dy2到diff.datcolnames(diff.dat)=c("dy1","dy2","dy1.1","dy2.1")ecm.reg=lm(dy2~error.lagged+dy1.1+dy2.1, data=diff.dat)summary(ecm.reg)## Residuals:## Min 1Q Median 3Q Max## -2.959 -0.544 0.137 0.711 2.307## Coefficients:## Estimate Std. Error t value Pr(>|t|)## (Intercept) 0.0034 0.1036 0.03 0.97## error.lagged -0.9688 0.1585 -6.11 2.2e-08 ***## dy1.1 0.8086 0.1120 7.22 1.4e-10 ***## dy2.1 -1.0589 0.1084 -9.77 5.6e-16 ***## Residual standard error: 1.03 on 94 degrees of freedom## Multiple R-squared: 0.546, Adjusted R-squared: 0.532## F-statistic: 37.7 on 3 and 94 DF, p-value: 4.24e-16par(mfrow=c(2,2))plot(ecm.reg)Johansen-Juselius(JJ)协整检验法,该方法是一种用向量自回归(VAR)模型进行检验的方法,适用于对多重一阶单整I(1)序列进行协整检验。JJ检验有两种:特征值轨迹检验和最大特征值检验。我们可以调用urca包中的ca.jo命令完成这两种检验。其语法:ca.jo(x, type = c("eigen", "trace"), ecdet = c("none", "const", "trend"), K = 2,spec=c("longrun", "transitory"), season = NULL, dumvar = NULL)其中:x为矩阵形式数据框;type用来设置检验方法;ecdet用于设置模型形式:none表示不带截距项,const表示带常数截距项,trend表示带趋势项。K表示自回归序列的滞后阶数;spec表示向量误差修正模型反映的序列间的长期或短期关系;season表示季节效应;dumvar表示哑变量设置。set.seed(12345)e1=rnorm(250,0,0.5)e2=rnorm(250,0,0.5)e3=rnorm(250,0,0.5)#模拟没有移动平均的向量自回归序列;u1.ar1=arima.sim(model=list(ar=0.75), innov=e1, n=250)u2.ar1=arima.sim(model=list(ar=0.3), innov=e2, n=250)y3=cumsum(e3)y1=0.8*y3+u1.ar1y2=-0.3*y3+u2.ar1#合并y1,y2,y3构成进行JJ检验的数据库;y.mat=data.frame(y1, y2, y3)#调用urca包中cajo命令对向量自回归序列进行JJ协整检验vecm=ca.jo(y.mat)jo.results=summary(vecm)#cajorls命令可以得到限制协整阶数的向量误差修正模型的最小二乘法回归结果vecm.r2=cajorls(vecm, r=2)vecm.r2## Call:lm(formula = substitute(form1), data = data.mat)## Coefficients:## y1.d y2.d y3.d## ect1 -0.33129 0.06461 0.01268## ect2 0.09447 -0.70938 -0.00916## constant 0.16837 -0.02702 0.02526## y1.dl1-0.22768 0.02701 0.06816## y2.dl1 0.14445 -0.71561 0.04049## y3.dl1 0.12347 -0.29083 -0.07525## $beta## ect1 ect2## y1.l2 1.000e+00 0.0000## y2.l2 -3.402e-18 1.0000## y3.l2 -7.329e-01 0.2952