内容

1介绍

RNA Droplet-based单细胞测序(scRNA-seq)技术允许研究人员获得transcriptome-wide对成千上万的细胞表达谱。简单地说,每一个细胞都封装在一个在油水乳液液滴,连同一个珠包含反转录引物和一个独一无二的条形码序列。反转录后在液滴内部,每个细胞的cDNA标签与条码(称为“细胞条形码”)。液滴破裂收益率的cDNA图书馆准备和测序。Debarcoding执行的序列可以获得每个细胞的表达谱。

这个方案实现了一些基本工具来处理这些数据经过量化的表达。特别是,我们专注于10倍基因组平台,提供负载的函数矩阵独特的分子标识符(UMI)计数以及原始的分子信息。函数也可用于将采样UMI数矩阵或原始读取;为区分细胞空滴,基于UMI计数;和消除的影响条形码交换Illumina公司4000测序仪。

2阅读在10倍基因组数据

2.1从UMI数矩阵

CellRanger管道从10 x基因组学将处理的原始测序数据并生成一个矩阵UMI计数。这个矩阵的每一行对应一个基因,而每一列对应一个条形码。这是保存在一个为每个样本目录,通常命名基因组<输出> /细节/ filtered_gene_bc_matrices / < >1如果你使用“过滤”矩阵,每一列对应一个假定的细胞。如果你使用“原始”矩阵,装载所有的条形码,没有区别是由细胞和空的水滴。。我们模拟了使用模拟数据目录下面一个例子:

#生成文件。示例(write10xCounts回声= FALSE) dir.name < - tmpdir list.files (dir.name)
# #[1]“条形码。tsv”基因。tsv matrix.mtx”

matrix.mtx文件包含UMI计数,而其他两个文件包含细胞条形码和基因注释。我们可以使用的这个加载到内存中read10xCounts函数,它返回一个SingleCellExperiment对象包含了所有的相关信息。这包括条形码序列为每个细胞(列),以及每个基因的标识符和符号(行)。

南加州爱迪生公司< - read10xCounts南加州爱迪生公司(dir.name)
# #类:SingleCellExperiment # #暗淡:100 10 # #元数据(1):# #样品化验(1):计数# # rownames (100): ENSG00001 ENSG00002……构成了rowData名字ENSG000099 ENSG0000100 # #(2):标识符号# # colnames:零# # colData名称(2):样本条形码# # reducedDimNames (0): # # mainExpName:零# # altExpNames (0):

加载项本身作为一个稀疏矩阵,明确dgCMatrix矩阵包中。这样可以减少内存使用量只存储非零项,用于稀疏scRNA-seq数据大量的辍学生。

类(计数(sce))
# # [1]“dgCMatrix”# # attr(“包”)# #[1]“矩阵”

用户还可以一次加载多个样本,通过提供一个特征向量read10xCounts。这将返回一个单一的SingleCellExperiment所有个人矩阵结合的列。显然,这才有意义使用同一组基因在样品。

2.2从分子信息文件

CellRanger还将产生一个分子信息文件(molecule_info.h5),其中包含…嗯,记录的信息分子。这包括UMI序列2读者不熟悉umi,他们允许读取不同的PCR扩增子明确分配给相同的原始的分子。,细胞条形码序列,指定的基因,然后读取的分子的数量。出于演示的目的,我们创建一个示例分子信息文件如下:

set.seed (1000) mol.info.file < - DropletUtils::: simBasicMolInfo (tempfile ()) mol.info.file
# # [1]“/ tmp / RtmpSkQdfN / file300aaab680396”

我们可以随后这些信息加载到R会话使用read10xMolInfo功能:

mol.info < - read10xMolInfo mol.info (mol.info.file)
# # # #元数据DataFrame 9532行5列# #细胞umi gem_group基因读# # <人物> <整数> <整数> <整数> <整数> # # 80506 TGTT 18 8 # # 2 CAAT 722585 1 233634 6 # # 3 AGGG 1 4 6 # # 4完成516870 1 887407 9 # # 5 ATAG 1 6 12 # #………………# # 9528机智1043995 1 9 12 # # 9529 GCTG 907401 1 20 13 # # 9530阿塔255710 1 672962年10 # # 9531 GCAC 13日20 11 # # 9532 TGAA基因1 1 6 # # # # 482852 # # [1]“ENSG1”“ENSG2”“ENSG3”“ENSG4”“ENSG5”“ENSG6”“ENSG7”“ENSG8”# # [9]“ENSG9”“ENSG10”“ENSG11”“ENSG12”“ENSG13”“ENSG14”“ENSG15”“ENSG16”# # [17]“ENSG17”“ENSG18”“ENSG19”“ENSG20”

此信息可以用于质量控制的目的,尤其是当底层读计数是必需的,例如,调查测序饱和。注意,函数将自动猜条形码序列的长度,这不是正式定义的分子信息文件。对于大多数实验中,猜测是正确的,但用户可以强制函数使用一个已知的条码的长度barcode.length论点。

3将采样的读取

给非常不同的测序深度的多个批次,它可以有利于downsample最深最浅的批次的批次与覆盖。这避免了噪声技术的差异,可以通过批量驱动集群。的天窗包提供了一些实用程序downsample数矩阵,但是,从技术角度讲,将采样在读取更合适,因为它概括每细胞不同的测序深度的影响。这可以通过应用downsampleReads函数包含读计数的分子信息文件:

set.seed (100)。抽样< - downsampleReads (mol.info.file,道具= 1)之和(no.sampling)
# # 9532年[1]
与。抽样< - downsampleReads (mol.info.file,道具= 0.5)和(with.sampling)
# # 9457年[1]

上面的代码将downsample读取50%的原始森林覆盖整个实验。然而,函数将返回一个矩阵UMI计数,所以最后总数实际上可能不会降低如果库测序饱和!用户应该使用downsampleMatrix ()相反,如果他们想要保证类似将采样后的总数。

4计算条形码排名

有用的诊断droplet-based数据条码等级图,显示了(日志)UMI总数为每个条码在轴和轴上的(日志)排名。这实际上是一个转置经验累积与对数转换轴密度图。是有用的,因为它允许用户在条形码检验总数的分布,关注那些最大的计数。为了演示,让我们模拟了一个计算矩阵:

set.seed(0)我的。计数< - DropletUtils::: simCounts ()

我们计算统计使用barcodeRanks函数,然后创建如下所示的图。

br。< - barcodeRanks (my.counts) #做一个阴谋。情节(br。美元的地位,br。总美元,日志=“xy”, xlab =“排名”,ylab =“总”)o < -订单(br.out排名美元)行(br。美元地位[o], br。安装[o],美元=“红色”)abline上校(h =元数据(br.out) $膝盖,坳=“dodgerblue”, lty = 2) abline (h =元数据(br.out) $拐点,坳=“forestgreen”, lty = 2)传说(“bottomleft lty = 2,坳= c (“dodgerblue”、“forestgreen”),传说= c(“膝盖”,“拐点”))

曲线上的膝盖和拐点的两个组件之间的过渡总计数分布。这是假定为代表的区别空滴小RNA和cell-containing滴更RNA,尽管更严格的方法来区分这两个可能性是下面要讨论的。

5检测空滴

空的水滴从环境解决方案通常包含RNA,导致debarcoding后非零项。的emptyDrops函数是用来区分空液滴和细胞。它是通过测试每一个条形码的表达谱显著偏离环境概要文件。给定一个矩阵my.counts包含UMI计数所有条形码,我们称之为:

set.seed (100) e。<——emptyDrops e.out (my.counts)
# # DataFrame 11100行5列# #总LogProb PValue有限罗斯福# # <整数> <数字> <数字> <逻辑> <数字> # # 1 2缺缺缺缺# # 2 9缺缺缺缺# # 3 20缺缺缺缺20缺缺缺缺# # # # 4 5 1缺缺缺缺# #………………# # 11096 215 -246.428 - 9.999 e-05真的0.00013799 # # 11097 201 -250.234 - 9.999 e-05真的0.00013799 # # 11098 247 -275.905 - 9.999 e-05真的0.00013799 # # 11099 191 -228.763 - 9.999 e-05真的0.00013799 # # 11100 198 -233.043 0.00013799 9.999 e-05如此

有重大偏离的液滴检测到环境概要文件在指定的罗斯福阈值,例如,罗斯福低于1%。这些可以被认为是cell-containing滴,假阳性(即频率。空滴),指定的罗斯福。此外,水滴和非常大的数量会自动保留通过设置他们的p值为零。这避免了丢弃液滴含有细胞非常相似环境概要文件。

是多少。细胞< - e。罗斯福< = 0.01美元(求和。细胞,na.rm = TRUE)
# # 943年[1]

p值计算了排列测试,因此需要设置一个种子。的有限的指出是否较低的假定值可以通过增加获得的数量排列。如果有任何条目罗斯福以上所需的阈值= = TRUE有限,这表明《不扩散核武器条约》应该增加的吗emptyDrops调用。

表(有限= e。有限,美元重要= is.cell)
# #重要# #有限假真# #假357 843 # #真正的0 100

我们建议做一些诊断情节如总菌数与负对数概率。液滴检测细胞应该出现大- log-probabilities非常大的总数量(基于曲线拐点的报道barcodeRanks)。注意,下面的例子是基于模拟数据和很夸张。

情节(e。总美元,- e。美元LogProb坳= ifelse (。细胞,“红色”,“黑”),xlab =“UMI总数”,ylab =“日志概率”)

6多路分解散列库

细胞实验可以去复用使用哈希算法hashedDrops ()函数的集合cell-containing条码库。为了演示,我们将模拟了一些散列标签低聚糖(HTO)计数与细胞从每个人口10个样本。我们还将添加一些紧身衣和空滴一些味道:

set.seed(10000) #模拟空滴:nbarcodes < 10 - 1000 nhto < - y <——矩阵(rpois (nbarcodes * nhto, 20), nrow = nhto) #模拟细胞:ncell < - 100真的。< -样品(ncell, nhto取代= TRUE) y [cbind(真实的。样本, seq_len(ncells))] <- 1000 # Simulating doublets: ndoub <- ncells/10 next.sample <- (true.sample[1:ndoub] + 1) %% nrow(y) next.sample[next.sample==0] <- nrow(y) y[cbind(next.sample, seq_len(ndoub))] <- 500

我们的第一个任务是识别条形码,实际上包含细胞。如果我们已经调用emptyDrops (),我们可以重用这些调用;否则我们可以获得电话直接从HTO数矩阵,尽管这需要一些摆弄低=匹配的测序深度HTO图书馆。

hto。调用< - emptyDrops (y,低= 500)。细胞< - hto。调用罗斯福< = 0.001美元的总结(has.cell)
真正的NA的# # # #模式逻辑100 900

每个cell-containing条形码图书馆只是分配给示例基于最丰富的HTO原产地。信心的任务是量化log-fold顶部和第二丰富的HTOs之间变化。函数将自动调整为每个HTO环境水平的差异基于环境概要文件;如果没有提供,这是大概估计的环境概要文件提供数矩阵。

多路分配器< - hashedDrops (y [(has.cell)],环境=元数据(hto.calls)环境美元)多路分配器
7 # # DataFrame 100行和列# #总最好的第二LogFC LogFC2紧身上衣自信# # <数字> <整数> <整数> <数字> <数字> <逻辑> <逻辑> # # 1 1657 4 5 0.999462 - 4.60496真假# # 2 1635 1669 9 0.999492 - 4.84165真假# # 3 6 7 0.999473 - 4.45073真的假的# # 4 1674 6 7 0.999491 - 4.49983真的假的# # 5 1645 3 4 1.000292 4.74602真的假# #……………………# # 96 1167 3 1 5.31708 0.427468假真# # 97 1158 3 1 5.26081 0.526363假真# # 98 1179 4 9 5.00121 - 0.604380假真# # 99 1187 2 5.37410 - 0.196833假真# # 100 1177 5 8 5.15739 - 0.464633假真的

然后一个简单的问题来确定样本的起源细胞。我们提供自信调用表明该细胞是自信的汗衫,根据是否(我)不是紧身衣和(2)没有小log-fold顶部和第二HTO之间变化。“小”的定义是相对的,可以改变的nmad =论点。

表(最好多路分配器$(多路分配器自信美元))
# # # # 1 2 3 4 5 6 7 8 9 10 # # 15 9 7 12 8 6 6 10 6

我们还确定对比基于log-fold第二HTO丰度之间的变化和环境污染。大型log-fold变化表明,第二HTO超过污染,符合的紧身上衣。

颜色< - ifelse(多路分配器$自信,“黑色”,ifelse(多路分配器紧身上衣,“红色”,“灰色”))情节(多路分配器LogFC美元,多路分配器LogFC2美元,坳=颜色,xlab =最好的第二HTO”之间的“Log-fold变化,ylab =第二HTO和环境之间的“Log-fold变化”)

7删除交换效果

7.1条形码样品之间的交换

条形码交换产生的一种现象在多路复用样品4000年Illumina公司音序器。分子从一个样本被错误地贴上标签样本从另一个样本条形码,导致他们misassignment多路分解。幸运的是,液滴实验提供一个独特的机会来消除这种影响,通过假设实际上是不可能产生多个相同的分子细胞条形码、分配基因和UMI序列。因此,任何相同的分子组合多个样本可能来自条形码交换。

swappedDrops函数将识别重叠组合分子信息文件的多路复用10 x样品测序在相同的运行。它将删除这些组合并返回“清洗”UMI数矩阵中所有样品使用下游分析。证明,我们模拟了一组分子信息文件三个多路复用10 x样本:

set.seed (1000) mult.mol.info < - DropletUtils::: simSwappedMolInfo (tempfile (), nsamples = 3) mult.mol.info
# # [1]“/ tmp / RtmpSkQdfN / file300aaa48fe4e75.1。h5“# #”[2] / tmp / RtmpSkQdfN / file300aaa48fe4e75.2。h5“# #”[3] / tmp / RtmpSkQdfN / file300aaa48fe4e75.3.h5”

然后,我们应用swappedDrops删除这些文件交换在我们数矩阵的影响。

年代。<——swappedDrops (mult.mol.info min.frac = 0.9)长度(s.out清洗美元)
# # 3 [1]
类(s.out清洗美元[[1]])
# # [1]“dgCMatrix”# # attr(“包”)# #[1]“矩阵”

组合,90%的阅读属于一个样本,样本的分子是分配给而不是删除。这假设交换相对罕见,所以阅读数应该是最高的样本来源。完全可以通过改变调整比例min.fracswappedDrops调用。

7.2嵌合细胞内读取

有时,嵌合分子生成在图书馆准备不完整的PCR产品从一个互补脱氧核糖核酸分子杂交为扩展使用共享另一个分子序列的多聚腺苷酸尾3的协议。这产生扩增子UMI和细胞条形码源自一个转录分子,但从另一个基因序列,相当于读取之间的交换基因。我们处理这个效应通过删除所有分子位于相同的单元中相同的UMI序列使用chimericDrops ()函数。下面这是应用分子信息文件来获得一个清洗数矩阵相关的样本。

< - chimericDrops (mult.mol.info[1])类()
# #[1]“列表”

当然,这也可能删除non-chimeric分子有相同的UMI偶然,但对于典型的UMI长度(10 - 12 bp 10 x协议)我们预计UMI碰撞是非常罕见的分子间相同的细胞。尽管如此,以减轻损失的碰撞,我们保留任何分子有更大数量的读取相比其他分子相同的UMI位于相同的单元中。

8会话信息

sessionInfo ()
# # R版本4.2.0 RC (2022-04-19 r82224) # #平台:x86_64-pc-linux-gnu(64位)# #下运行:Ubuntu 20.04.4 LTS # # # #矩阵产品:默认# #布拉斯特区:/home/biocbuild/bbs - 3.15 - bioc / R / lib / libRblas。所以# # LAPACK: /home/biocbuild/bbs - 3.15 - bioc / R / lib / libRlapack。# # # #语言环境:# # [1]LC_CTYPE = en_US。utf - 8 LC_NUMERIC = C # #[3]而= en_GB LC_COLLATE = C # # [5] LC_MONETARY = en_US。utf - 8 LC_MESSAGES = en_US。utf - 8 # # [7] LC_PAPER = en_US。utf - 8 LC_NAME = C # # [9] LC_ADDRESS C = C LC_TELEPHONE = # # [11] LC_MEASUREMENT = en_US。utf - 8 LC_IDENTIFICATION = C附加基本包:# # # # # # [1]stats4统计图形grDevices跑龙套数据集方法# # # # # #[8]基地其他附加包:# # [1]Matrix_1.4-1 DropletUtils_1.16.0 # # [3] SingleCellExperiment_1.18.0 SummarizedExperiment_1.26.0 # # [5] Biobase_2.56.0 GenomicRanges_1.48.0 # # [7] GenomeInfoDb_1.32.0 IRanges_2.30.0 # # [9] S4Vectors_0.34.0 BiocGenerics_0.42.0 # # [11] MatrixGenerics_1.8.0 matrixStats_0.62.0 # # [13] knitr_1.38 BiocStyle_2.24.0 # # # #通过加载一个名称空间(而不是附加):# # [1]locfit_1.5 - 9.5 xfun_0.30 # # [3] bslib_0.3.1 beachmat_2.12.0 # # [5] HDF5Array_1.24.0 lattice_0.20-45 # # [7] rhdf5_2.40.0 htmltools_0.5.2 # # [9] yaml_2.3.5 rlang_1.0.2 # # [11] R.oo_1.24.0 jquerylib_0.1.4 # # [13] scuttle_1.6.0 R.utils_2.11.0 # # [15] BiocParallel_1.30.0 dqrng_0.3.0 # # [17] GenomeInfoDbData_1.2.8 stringr_1.4.0 # # [19] zlibbioc_1.42.0 R.methodsS3_1.8.1 # # [21] evaluate_0.15 fastmap_1.1.0 # # [23] parallel_4.2.0 highr_0.9 # # [25] Rcpp_1.0.8.3 edgeR_3.38.0 # # [27] BiocManager_1.30.17 limma_3.52.0 # # [29] DelayedArray_0.22.0 magick_2.7.3 # # [31] jsonlite_1.8.0 XVector_0.36.0 # # [33] digest_0.6.29 stringi_1.7.6 # # [35] bookdown_0.26 grid_4.2.0 # # [37] cli_3.3.0 tools_4.2.0 # # [39] bitops_1.0-7 rhdf5filters_1.8.0 # # [41] magrittr_2.0.3 sass_0.4.1 # # [43] rcurl_1.98 - 1.6 DelayedMatrixStats_1.18.0 # # [45] sparseMatrixStats_1.8.0 rmarkdown_2.14 # # [47] Rhdf5lib_1.18.0 R6_2.5.1 # # [49] compiler_4.2.0