图书馆(base64enc)图书馆(ggplot2)#将阴影Biobase::exprssuppressPackageStartupMessages({图书馆(readxl)图书馆(命运)图书馆(Biobase)})# setHook (on.rgl。close', function(...) {# name <- tempfile()# par3d(windowreck = c(0,0,1200,1200))# Sys.sleep (1)## rgl。快照(文件名= paste0(名称,'.png'))# # rgl。Postscript (filename = paste0(name, '.pdf'), fmt='pdf') #不适用于球体## publish_mimebundle(列表(# 'image/png' = base64encode(paste0(name, '.png'))# #, 'application/pdf' = base64encode(paste0(name, '.pdf'))#))#},“取代”)
扩散图是由谱法引入的非线性降维方法Coifman et al. (2005).扩散图基于距离度量(扩散距离),这在概念上与分化细胞如何遵循嘈杂的扩散动力学相关,从多能状态向更分化的状态移动。
R包命运实现中提出的扩散图的公式哈格威尔第,比特纳和泰斯(2015)它特别适合于分析来自时间过程实验的单细胞基因表达数据。它含蓄地沿着细胞的发育路径安排细胞,分化事件发生的分叉。
我们特别关注哈格威尔第,比特纳和泰斯(2015)并提出了R中扩散图的实现,该扩散图受采样密度异质性的影响较小,因此能够识别丰富和罕见的细胞群。此外,命运实现复杂的噪声模型,反映由于单细胞qPCR数据的退出事件造成的零膨胀/审查,并允许缺失值。最后,从实现上进一步完善哈格威尔第,比特纳和泰斯(2015),并实现最近邻近似,能够处理高达300.000个单元格的非常大的数据集。
对于那些熟悉R和数据预处理的人,我们推荐这一节策划.
本插图中的所有代码都可以通过编辑(装饰图案(命运))
作为一个例子,我们在下面介绍对数据的预处理Guo等(2010).该数据集由Biomark RT-qPCR系统生成,包含442个小鼠胚胎干细胞在7个不同发育时间点(从合子到囊胚)的48个基因的Ct值。
从全能的1细胞阶段开始,细胞在转录景观中平滑地向滋养外胚层谱系或内细胞群过渡。随后,细胞从内部细胞群向内胚层或外胚层谱系过渡。这种从一种发育状态到另一种发育状态的平稳过渡,包括两个分叉事件,反映在细胞的表达谱中,并且可以使用可视化命运.
从。下载表S4发布网站将给你一个电子表格“mmc4.xls”,从中可以加载数据:
## #小猫咪:9×9 # #细胞Actb Ahcy Aqp3 Atp12a Bmp4 Cdx2 Creb312 Cebpa # # <空空的> <双> <双> <双> <双> <双> <双> <双> <双> 28 # # 1 1 c 1 14.0 19.3 23.9 21.3 - 20.8 28 # # 28日2 1 c 2 13.7 - 18.6 28日28日28日23.4 - 20.9 28 # # 3 1 c 3 28 28 13.4 18.2 26.2 22.9 19.6 28 # # 4 1 c 13.7 - 18.6 28日28日28日23.3 - 20.7 28 # # 5 1 c 5 28 24.2 21.8 23.7 13.5 18.6 24.2 28 # # 6 1 c 6 12.9 17.4 25.5 28日28日21.9 - 21.3 28 # # 7 1 c 7 28 28日22.7 - 21.1 13.0 17.4 23.9 28 # # 8 1 c 8 12.8 18.4 23.7 28日28日24.1 - 19.8 28 # # 9 1 c 9 21.9 13.3 18.3 28 28 2821.228
值28是假设28个循环次数的后台表达式。
为了在不破坏注释的情况下轻松地清理和规范化数据,我们将data.frame
变成生物导体ExpressionSet
使用作为。ExpressionSet
函数从命运打包,并将其分配给名称ct
:
图书馆(命运)图书馆(Biobase)# as.data.frame#不支持readxl的“tibbles”ct < -作为。ExpressionSet(as.data.frame(raw_ct))ct
## ExpressionSet (storageMode: lockedEnvironment) ## assayData: 48个特征,442个样本##元素名称:exprs ## protocolData: none ##表型数据## sampleNames: 1 2…442 (442 total) ## varLabels: Cell ## varMetadata: labelDescription ## featureData: none ##实验者数据:使用“实验者数据(对象)”##注释:
的优势ExpressionSet
在data.frame
像规范化表达式这样的任务既更快,又不会因为对非表达式的列应用“规范化”而意外地破坏注释。处理单独表达式的方法矩阵
和注释data.frame
要求您在添加或删除两个变量上的样本时要小心,而ExpressionSet
在内部为你做。
对象内部存储特征×样本的表达式矩阵,可检索使用exprs (ct)
,和注释data.frame
的样本×注释为phenoData (ct)
.注释可以直接通过ct美元列
而且ct[['列']]
.请注意,与通常的样本×特征相比,表达式矩阵是转置的data.frame
.
我们删除所有值大于background表达式的单元格,表示不可用数据点(NA
).我们还从1细胞期胚胎中取出细胞,因为它们被系统地不同地处理(Guo et al. 2010).
为此,我们通过从“cell”注释列中提取细胞数量,为每个样本添加一个包含胚胎细胞阶段的注释列:
然后,我们使用新的注释列创建两个过滤器:
#细胞来自2+细胞胚胎have_duplications < -ct$num_cells>1#值<= 28的单元格normal_vals < -应用(exprs(ct),2,函数(smp)所有(smp< =28))
我们可以使用这两个过滤器的组合来排除未分裂的细胞和包含高于基线的Ct值的细胞,并将结果存储为cleaned_ct
:
最后我们继续Guo等(2010)并通过内源性对照Actb和Gapdh减去每个细胞的平均表达量,使每个细胞正常化。请注意,尚不清楚如何将sc-qPCR数据归一化,因为管家基因的表达也是随机的。因此,如果进行这样的内务归一化,取几个基因的平均值是至关重要的。
管家< -c(“Actb”,“Gapdh”)#管家基因名称标准化< -colMeans(exprs(cleaned_ct)(管家,))guo_norm < -cleaned_ctexprs(guo_norm) < -exprs(guo_norm)-的标准化
由此产生的ExpressionSet
包含清洗后保留的所有细胞归一化Ct值。
使用我们的包创建扩散图所需的数据是cell×gene矩阵
或data.frame
,或ExpressionSet
(它有一个gene×cellexprs
矩阵)。为了创建一个DiffusionMap
对象时,只需将其中一种格式作为参数提供给DiffusionMap
函数。在a的情况下data.frame
,每个浮点列被解释为表达式级别,而不同类型的列(例如。因素
,字符
或整数
)被假定为注释并被忽略。请注意,单细胞RNA-seq计数数据应该使用方差稳定转换(例如log或rlog)进行转换;qPCR数据的Ct刻度已经是对数的(每增加1个Ct对应转录本翻倍)。
为了创建一个扩散图来绘制,您必须调用DiffusionMap
,可选带有参数。如果单元格的数量足够小(< ~1000),则不需要指定类似k
(对于k个最近的邻居)。
如果您从这里开始阅读,请执行数据(guo.norm)
加载在上一节中创建的数据集。
简单地调用情节
在结果对象上dif
将可视化扩散组件:
扩散图很好地说明了胚胎发育最初几天的分支。
包含细胞阶段的注释列可以用来注释我们的扩散图。使用注释如下上校
参数将自动使用当前的R调色板为地图上色。使用面板(颜色)
全局配置或情节(…,pal = colors)
一块地。
调色板(cube_helix(6))#配置调色板情节(dm,pch =20.,# PCH的漂亮点col_by =“num_cells”,#或“col”与一个矢量或一个颜色legend_main =“细胞阶段”)
三个分支出现在地图上,分叉发生在16细胞期和32细胞期。扩散图能够根据细胞的表达谱来排列细胞:分裂最多和最少的细胞出现在不同分支的尖端。
为了显示2D图,我们提供了一个包含两个扩散分量号(这里是1和2)的向量作为第二个参数。
扩散映射由称为扩散分量的特征向量和相应的特征值组成。默认情况下,返回前20个。
您还可以将包用于交互图,例如rgl
以类似的方式,通过直接子集dc使用特征向量(dif)
:
图书馆(rgl)plot3d(特征向量(dm),1:3.],坳=log2(guo_norm$num_cells),类型=“年代”,半径=. 01)view3d(θ=10,φ=30.,变焦=.8)#现在使用您的鼠标旋转窗口中的情节rgl.close()
对于大众来说ggplot2
包中,有内置的支持形式巩固。DiffusionMap
方法,该方法允许使用DiffusionMap对象作为数据
参数中的ggplot
而且qplot
功能。但是常规的情节
函数已返回ggplot
对象。
作为美学,所有扩散组件、基因表达和注释都是可用的。如果你计划做很多情节,创建一个data.frame
首先通过使用as.data.frame (dif)
或巩固(dif)
,将其分配给一个变量名,并使用它来绘图。
可视化最重要的参数,会变暗
,将在下一节中描述。v1中的一个重要参数,σ\ (\ \),在它自己的小插图“全球西格玛”中有解释。
其他参数将在本节的末尾进行解释。
会变暗
扩散映射由特征向量(我们称之为扩散分量)和扩散距离矩阵的相应特征值组成。后者表示扩散分量的重要性,即特征向量近似数据的程度。特征向量的意义越来越小。
后来的dc通常变得嘈杂且不那么有用:
待办事项:宽阔的地块
如果自动排除数据帧的分类和积分特征还不够,还可以提供变量名或索引的向量var
参数。如果你发现计算时间或使用的内存太大,参数k
允许您通过限制计算和存储的转换数量来降低质量/运行时+内存比率。如果您的单元格少于几千个,则通常不需要它。的n.eigs
参数指定返回的扩散组件的数量。
如需更多信息,请咨询帮助(DiffusionMap)
.
命运特别适合于基因表达数据,因为它能够处理缺失和不确定的数据。
RT-qPCR等平台无法检测到低于一定阈值的表达值。为了解决这个问题,命运允许审查特定的值。在这种情况下Guo等(2010),仅统计了28个qPCR循环。所有需要超过28个循环的转录本都在这个值下分组在一起。基因Aqp3说明了这一点:
对于我们的审查噪声模型,我们需要确定检测的极限(LoD)。虽然大多数研究人员使用28的全局LoD,反映了qPCR机器的总体敏感性,但存在不同的策略来定量建立这种基因依赖的LoD。例如,大量数据的稀释序列可用于建立LoD,这样当Ct值低于LoD时,qPCR反应将以指定的概率被检测到。在这里,我们使用Guo等人提供的稀释序列,首先确定一个基因上的LoD为最大的Ct值小于28。然后我们按照手册来做应用指南:单细胞数据分析并确定一个全局LoD作为基因LoD的中位数。我们使用表S7中的稀释级数(mmc6.xls
).如果你的速度有问题read.xlsx
,考虑以TAB分隔值格式存储数据,并使用read.delim
或阅读。ExpressionSet
.
稀释< -read_xls(“mmc6.xls”1 l)稀释$细胞< -零#删除注释列get_lod < -函数(基因)基因[[马克斯(哪一个(基因! =28))))钟表< -应用(稀释,2get_lod)lod < -天花板(中位数(钟表))lod
## [1]
LoD为25,平台可以执行的最大循环次数(40),定义了表示审查模型中审查值的可能范围的不确定性范围。使用归一化向量的平均值,我们可以调整不确定性范围和审查值,使其更接近于其他值,以改善数据点之间的距离测量:
lod_norm < -天花板(中位数(钟表)-的意思是(标准化))max_cycles_norm < -天花板(40-的意思是(标准化))列表(lod_norm =lod_norm,max_cycles_norm =max_cycles_norm)
# # # # $ lod_norm [1] max_cycles_norm美元10 # # # # # # 25 [1]
然后,我们还需要将应该截尾的归一化值(即LoD之后没有检测到表达式的所有数据点)设置为这个特殊值,因为循环阈值处的值由于归一化而发生了变化。
此版本的数据集可用为数据(郭)
从命运包中。
现在我们称之为DiffusionMap
使用审查模型的函数:
thresh_dm < -DiffusionMap(郭,censor_val =lod_norm,censor_range =c(lod_norm max_cycles_norm),verbose =假)情节(thresh_dm1:2,col_by =“num_cells”,legend_main =“细胞阶段”)
与没有审查模型的扩散图相比,这张图包含了更多的数据点,看起来更加均匀。
基因表达实验可能无法产生一些数据点,通常表示为“不可用”(NA
).通过调用DiffusionMap(…,missings = c(total.minimum, total.maximum))
,您可以为缺失的值模型指定参数。
在数据中Guo等(2010)没有缺失值发生,我们说明的能力命运人为地将999的ct值(即40个周期后未检测到数据点的表达)处理为缺失值。这纯粹是为了说明,在实践中,这些值应该像前一节所述的那样被审查。
#删除无分隔单元格的行ct_w_missing < -ct (ct,$num_cells>1 l]#并替换大于基线的值exprs(ct_w_missing) [exprs(ct_w_missing)>28) < -NA
然后我们对这个版本的数据进行归一化:
自立门户< -colMeans(exprs(ct_w_missing)(管家,),na。rm =真正的)w_missing < -ct_w_missingexprs(w_missing) < -exprs(w_missing)-自立门户exprs(w_missing) [is.na(exprs(ct_w_missing))) < - - - - - -lod_norm
最后,我们创建了一个包含缺失值模型和之前的审查模型的扩散图:
dif_w_missing < -DiffusionMap(w_missingcensor_val =lod_norm,censor_range =c(lod_norm max_cycles_norm),missing_range =c(1,40),verbose =假)情节(dif_w_missing1:2,col_by =“num_cells”,legend_main =“细胞阶段”)
这个结果看起来与我们之前的扩散图非常相似,因为只添加了6个额外的数据点。但是,如果您的平台创建了更多的缺失值,那么包含缺失值将更有用。
为了将细胞投射到现有的扩散图中,例如比较由同一平台测量的两个实验,或者向现有的扩散图中添加新数据,我们实现了dm.predict
.它计算新旧数据中数据点之间的转换概率,并使用现有的扩散组件将细胞投射到扩散图中。
作为一个例子,我们假设我们从一个64个细胞期胚胎的实验中创建了一个扩散图:
让我们将32个细胞状态胚胎的表达与现有的图谱进行比较。我们使用dm.predict
使用旧数据中的现有扩散组件为新单元创建扩散组件:
通过提供更多的
而且col.more
参数说明情节
函数中,我们分别显示了旧数据和新数据的前两个dc:
显然,32和64细胞状态的胚胎在图中占据了相似的区域,而来自64细胞状态的细胞则进一步发育。
数据的一些属性可能会产生不理想的结果。本节将介绍一些处理这些问题的策略:
预处理:如果你的数据中的方差对均值有很强的依赖性(对于scRNA-Seq计数数据),在运行之前使用方差稳定转换,如平方根或(正则化的)对数命运.
离群值:如果扩散分量强烈地将一些异常值与其余单元分隔开,使得它们之间的距离比其余单元内的距离大得多(即几乎是两个离散值),则考虑删除这些异常值并重新计算映射,或简单地选择不同的扩散分量。这可能也是一个好主意,检查异常值是否也存在于PCA图中,以确保它们与生物学无关。
大型数据集:如果内存不足,且没有内存更大的机器可用,则k
参数可以减小。此外(特别是对于>50万个单元格),还可以对数据进行低采样(可能以密度依赖的方式)。
“Large-p-small-n”数据例如,对于scRNA-Seq,可能有必要首先对数据进行主成分分析(PCA)(例如使用prcomp
或princomp
),并从主成分计算扩散成分(通常使用前50个成分会产生良好的结果)。
柯夫曼,r.r., S.拉丰,A. B.李,M.马吉奥尼,B.纳德勒,F.华纳,S. W.朱克。2005。几何扩散作为调和分析和数据结构定义的工具:扩散图。PNAS.http://www.pnas.org/content/102/21/7426.long.
郭国吉,迈克尔·胡斯,佟国清,王朝阳,孙丽丽,尼尔·d·克拉克,保罗·罗布森。2010。从受精卵到囊胚的单细胞基因表达分析揭示了细胞命运决定的决议。细胞发育18(4): 675-85。https://doi.org/10.1016/j.devcel.2010.02.012.
哈格威尔第,拉莉,弗洛里安·比特纳,法比安·j·泰斯,2015。区分数据的高维单细胞分析的扩散图生物信息学,没有。在修订。