内容

1安装

推荐的安装方式zinbwave包是

install.packages(“BiocManager”)BiocManager::安装(“zinbwave”)

请注意,zinbwave要求R(>=3.4)和Bioconductor(>=3.6)。

2简介

属性的介绍性示例zinbwave包,实现了中提出的ZINB-WaVE方法(Risso et al. 2018)

首先,让我们加载包并设置串行计算。

库(zinbwave)库(scRNAseq)库(matrixStats)库(magrittr)库(ggplot2)库(biomaRt) #注册BiocParallel串行执行BiocParallel:: Register (BiocParallel::SerialParam())

2.1锌波模型

ZINB-WaVE是一种通用且灵活的模型,用于高维零膨胀计数数据的分析,例如单细胞RNA-seq测定中记录的数据。鉴于\ (n \)样本(通常是\ (n \)单细胞)及\ (J \)特性(通常情况下,\ (J \)对于每个样本,我们用\ (Y_ {ij} \)特征的计数\ (j \)\ (j = 1, \ ldots j \))作为样本我\ \ ()\ (i = 1 \ ldots n \)).为了解释单细胞测序技术的典型的各种技术和生物效应,我们建立了模型\ (Y_ {ij} \)作为具有参数的零膨胀负二项式(ZINB)分布的随机变量\ (\ mu_ {ij} \)\ (\ theta_ {ij} \),\ (\ pi_ {ij} \),并对参数考虑如下回归模型:

\[开始\{对齐}{情商:model1} \ \标签ln (\ mu_ {ij}) & = \离开(X \ beta_ \μ+ (V \ gamma_ \μ)^ \最高+ W \ alpha_ \μμ+ O_ \ \右)_ {ij} \,,{情商:model2} \ \ \ \标签文本{分对数}(\ pi_ {ij}) & = \离开(X \ beta_ \π+ (V \ gamma_ \π)^ \最高+ W \ alpha_ \ pi + O_ \π\右)_ {ij } \,, \\ \ 标签{情商:model3} \ ln (\ theta_ {ij}) & = \ zeta_j \ \结束{对齐}\],

其中回归模型的要素如下。

  • \ \ (X)是已知的\(n \乘以M\)矩阵对应于\ \(米)单元格级协变量和\ ({\ bf \β}=(μ\ beta_ \ \ beta_ \π)\)相关的\(M \乘J\)回归参数矩阵。\ \ (X)通常可以包括诱导感兴趣的变化的协变量,如细胞类型,或诱导不需要的变化的协变量,如批次或质量控制(QC)措施。默认情况下,它只包含一个常量1列,\({\男朋友1}_n”\),以解释基因特异性的拦截。
  • \ \ (V)是已知的\(J \乘L\)矩阵对应于\ (J \)基因水平的协变量,如基因长度或gc含量,以及\({\bf \gamma} = (\gamma_\mu, \gamma_\pi)\)相关的\ (L \ n \)回归参数矩阵。默认情况下,\ \ (V)只包含常数列的1,\({\男朋友1}_J \),以解释单元格特定的拦截,例如表示库大小差异的大小因子。
  • \ (W \)是一个未被观察到的\(n \乘以K\)矩阵对应于\ (K \)未知的细胞水平协变量,可能是“不想要的变化”或感兴趣的(如细胞类型),以及\({\bf \alpha} = (\alpha_\mu,\alpha_{\pi})\)相关的\(K \乘J\)回归参数矩阵。
  • \(μO_ \ \)而且π\ (O_ \ \)是已知的\(n \乘以J\)偏移量矩阵。
  • R \(\ζ\ \ mathbb {} ^ J \)是对数尺度上基因特异性分散参数的向量。

2.2示例数据集

为了说明该方法,我们将使用的Fluidigm C1数据集(Pollen et al. 2014).数据由65个细胞组成,每个细胞在高深度和低深度进行测序。这些数据是公开的,作为scRNAseq包的形式SummarizedExperiment对象。

- ReprocessedFluidigmData(assays = "tophat_counts") fluidigm
##类:singlecel实验实验## dim: 26255 130 ##元数据(3):sample_info群集,这_qc ## assays(1): tophat_counts ## rownames(26255): A1BG A1BG- as1…ZZEF1 ZZZ3 ## rowData names(0): ## colnames(130): SRR1275356 SRR1274090…SRR1275366 SRR1275261 ## colData names(28): NREADS NALIGNED…Cluster1 Cluster2 reducedDimNames(0): ## mainExpName: NULL ## altExpNames(0):
表(colData (fluidigm) Coverage_Type美元)
## ##高低## 65 65

3.基因的筛选

首先,我们过滤出低表达基因,通过删除那些在至少5个样本中没有至少5个reads的基因。

- rowsum(化验(fluidigm)>5)>5表(过滤器)
##过滤器## FALSE TRUE ## 16127 10128
Fluidigm <- Fluidigm[过滤器,]

这给我们留下了10128个基因。

接下来,我们确定了100个最可变的基因,这将是我们ZINB-WaVE程序的输入。虽然我们主要是出于计算原因才将ZINB-WaVE应用于这些基因,但为了消除转录噪声并专注于更有生物学意义的信号,关注高度可变的基因子集通常是一个好主意。然而,要进行真正的分析,可能至少需要1000个基因。

assay(fluidigm) %>% log1p %>% rowVars -> vars names(vars) <- rownames(fluidigm) vars <- sort(vars,递减= TRUE) head(vars)
## igfbpl1 stmn2 egr1 anp32e cenpf ldha ## 13.06109 12.24748 11.90608 11.67819 10.83797 10.72307
Fluidigm <- Fluidigm[名称(vars)[1:100],]

在继续之前,我们将第一个实验重命名为fluidigm“计数”,以避免需要指定我们应该使用哪种化验zinbwave工作流。这是一个可选步骤。

assayNames(fluidigm)[1] <- "counts"

4ZINB-WaVE

使用ZINB-WaVE获得数据的低维表示的最简单方法是使用zinbwave函数。这个函数以a作为输入SummarizedExperiment对象,并返回SingleCellExperiment对象。

fluidigm_zinb <- zinbwave(fluidigm, K = 2, ε =1000)

默认情况下,zinbwave函数拟合ZINB模型\(X = {\bf 1}_n\)而且\(V = {\bf 1}_J\).在这种情况下,模型是一个类似于主成分分析(PCA)的因子模型,其中\ (W \)一个因子矩阵和\(μ\ alpha_ \ \)而且\(π\ alpha_ \ \)加载矩阵。默认情况下,ε参数设置为基因数量。我们凭经验发现,那是一种快感ε通常需要获得良好的低级表示。看到zinbModel ?获取详细信息。我们在这里设置ε= 1000

的参数\ (K \)控制我们想从数据中推断出多少潜在变量。\ (W \)存储在reducedDim对象的槽位号。(见SingleCellExperiment详情参见小插图)。

在这种情况下,正如我们指定的\ (K = 2 \),我们可以将结果可视化\ (W \)矩阵在一个简单的绘图,颜色编码单元格类型。

W <- reducedDim(fluidigm_zinb) data.frame(W, bio=colData(fluidigm)$Biological_Condition, coverage=colData(fluidigm)$Coverage_Type) %>% ggplot(aes(W1, W2, color =bio, shape=coverage)) + geom_point() + scale_color_brewer(type = "qual", palette = "Set1") + theme_classic()

4.1协变量添加

ZINB-WaVE模型比PCA更通用,允许包含额外的样本和基因水平协变量,这可能有助于推断未知因素。

以下4.4.1Sample-level反是;

通常,可以将批处理信息作为样本级协变量,以解释批处理效应。在这里,我们通过将覆盖率(高或低)作为样本级协变量来说明这种能力。

Coverage_TypecolDatafluidigm包含覆盖信息。的公式界面,我们可以指定一个包括截距和覆盖率指标变量的设计矩阵zinbFit

fluidigm_cov <- zinbwave(fluidigm, K=2, X="~Coverage_Type", epsilon=1000)
W <- reducedDim(fluidigm_cov) data.frame(W, bio=colData(fluidigm)$Biological_Condition, coverage=colData(fluidigm)$Coverage_Type) %>% ggplot(aes(W1, W2, color =bio, shape=coverage)) + geom_point() + scale_color_brewer(type = "qual", palette = "Set1") + theme_classic()

在这种情况下,是推断\ (W \)矩阵在有或没有协变量的情况下本质上是相同的,这表明模型中包含的比例因子\γ(\ \)的截距相关的参数\ \ (V))足以实现良好的低维数据表示。

4.1.2能够共

类似地,我们可以包括基因水平的协变量,作为列\ \ (V).在这里,我们通过包括基因长度和gc含量来说明这种能力。

我们使用biomaRt包计算基因长度和gc含量。

集市< - useMart(“运用”)集市< - useDataset(“hsapiens_gene_ensembl集市=集市)bm < - getBM(属性= c(‘hgnc_symbol’,‘start_position’,‘end_position’,‘percentage_gene_gc_content’),过滤器= hgnc_symbol,值= rownames (fluidigm),集市=集市)bm长度< - bm end_position美元- bm start_position len <美元tapply (bm美元长度、bm hgnc_symbol美元,意味着)len < - len (rownames (fluidigm)] gcc < - tapply (bm percentage_gene_gc_content美元,bm hgnc_symbol美元,意味着)gcc < - gcc (rownames (fluidigm)]

然后我们将基因水平的信息包括为rowDatafluidigm对象。

rowData(fluidigm) <- data.frame(gccontent = gcc, length = len)
fluidigm_gcc <- zinbwave(fluidigm, K=2, V="~gccontent + log(length)", epsilon=1000)

5t-SNE表示

数据的t-SNE表示可以通过计算缩小空间中的单元距离并在距离上运行t-SNE算法来获得。

set.seed(93024) library(rtssne) W <- reducedDim(fluidigm_cov) tsne_data <- rtssne (W, pca = FALSE, perplexity=10, max_iter=5000) data.frame(Dim1=tsne_data$Y[,1], Dim2=tsne_data$Y[,2], bio=colData(fluidigm)$Biological_Condition, coverage=colData(fluidigm)$Coverage_Type) %>% ggplot(aes(Dim1, Dim2, color =bio, shape=coverage)) + geom_point() + scale_color_brewer(type = "qual", palette = "Set1") + theme_classic()

6标准化值和偏差残差

有时,有规范化的值用于可视化和残差用于模型评估是有用的。这两个量都可以用zinbwave ()函数。

fluidigm_norm <- zinbwave(fluidigm, K=2, epsilon=1000, normalizedValues=TRUE,残差=TRUE)

fluidigm_norm对象包括归一化值和剩余值作为附加化验

fluidigm_norm
##类:singlecel实验实验## dim: 100 130 ##元数据(3):sample_info集群。SRSF7 FAM117B ## rowData names(0): ## colnames(130): SRR1275356 SRR1274090…SRR1275366 SRR1275261 ## colData names(28): NREADS NALIGNED…Cluster1 Cluster2 ## reducedDimNames(1): zinbwave ## mainExpName: NULL ## altExpNames(0):

7zinbFit函数

zinbwaveFunction是一个用户友好的函数,用于获得数据的低维表示,并可选地从模型中获得规范化值和残差。

然而,有时存储所有的参数估计值和可能性值是有用的。的zinbFit函数允许用户创建类的对象zinbModel它可以用来存储所有的参数估计,并对结果有更好的控制。

zinb <- zinbFit(fluidigm, K=2, epsilon=1000)

zinbwave,默认为zinbFit函数拟合ZINB模型\(X = {\bf 1}_n\)而且\(V = {\bf 1}_J\)

如果用户已经运行zinbFit并希望获得规范化值或数据的低维表示形式SingleCellExperiment格式,他们可以通过zinbModel对象zinbwave为了避免重复计算。

这里,我们也指定observationalWeights = TRUE计算观测权重,对微分表达式有用(见下一节)。

fluidigm_zinb <- zinbwave(fluidigm, fitted_model = zinb, K = 2, epsilon=1000, observationalWeights = TRUE)

8微分表达式

zinbwave包可用于计算观测权重,以“解锁”单细胞应用的批量RNA-seq工具,如图所示(Van den Berge et al. 2018)

zinbwave指定时可选地计算观测权重observationalWeights = TRUE如上面的代码卡盘。的手册页zinbwave.权重存储在分析命名权重并且可以通过下面的调用访问。

权重<-化验(fluidigm_zinb,“权重”)

注意,在本例中,刑罚参数的值ε被设定在1000,虽然我们不建议在实际应用中的差分表达式分析。我们的评估表明,价值ε= 1 e12汽油在一系列数据集上提供良好的性能,尽管这个数字仍然是任意的。之间的值1 e6而且1 e13表现最好。

8.1带edgeR的微分表达式

一旦我们有了观测权重,我们就可以把它们用在刨边机执行微分表达式。具体来说,我们使用了一个缓和的f检验,其中分母剩余自由度由零膨胀的程度调整(见(Van den Berge et al. 2018)详情)。

在这里,我们将NPC与GW16进行比较。请注意,出于计算原因,我们只从100个基因开始,但在实际分析中,我们将使用所有表达的基因。

库(edgeR) dge <- DGEList(化验(fluidigm_zinb)) dge <- calcNormFactors(dge)设计<-模型。matrix(~Biological_Condition, data = colData(fluidigm)) dge$weights <- weights dge <- estimateDisp(dge, design) fit <- glmFit(dge, design) lrt <- glmWeightedF(fit, coef = 3) topTags(lrt)
# #系数:Biological_ConditionGW21+3 ## logFC logCPM LR PValue padjFilter FDR ## VIM -4.768885 13.21736 47.44330 2.373519e-10 2.373519e-08 2.373519e-08 ## FOS -5.314315 14.50176 37.39263 8.938719e-09 4.469360e-07 4.469360e-07 ## USP47 -3.900578 13.37158 29.91782 2.217489e-07 7.391629e-06 ## PTN -3.190154 13.22777 22.68357 4.692531e-06 1.173133e-04 ## MIR100HG 2.388545 14.26683 18.25796 3.633132e -04 ## NNAT -2.062983 13.60868 17.90555 3.9798e -05## SFRP1 -3.405948 13.01425 14.45819 2.439198e-04 3.048997e-03 ## EGR1 -2.658644 14.93922 3.193095e-04 3.547883e-03 ## ST8SIA1 -3.338407 13.35883 12.64066 5.337751e-04 5.337751e-03

8.2DESeq2的微分表达式

类似地,我们可以在a中使用权重DESeq2在参数估计步骤中使用观察级权重进行分析。在这种情况下,不需要将权重传递给DESeq2因为他们已经在权重分析对象。

library(DESeq2) dds <- DESeqDataSet(fluidigm_zinb, design = ~ Biological_Condition) dds <- DESeq(dds, sfType="poscounts", useT=TRUE, minmu=1e-6) res <- lfcShrink(dds,对比度=c("Biological_Condition", "NPC", "GW16"), type =" normal") head(res)
## log2 fold change (MAP): Biological_Condition NPC vs GW16 Wald测试p值:生物条件NPC vs 6行6列的GW16数据帧## baseMean log2FoldChange lfcSE stat pvalue padj ## <数字> <数字> <数字> <数字> <数字> <数字> > ## IGFBPL1 2054.403 -8.29483 0.705618 -7.84899 4.19411e-15 2.20743e-14 ## STMN2 2220.078 -10.07429 0.769583 -9.37554 6.88196e-21 6.88196e-20 ## EGR1 1342.465 -6.85394 0.662687 -10.34378 2.31567e-18 1.65405e-17 ## ANP32E 806.983 0.502376 3.96659 1.30778e-04 3.26946e-04 ## CENPF 255.632 1.37110 0.5537652.46388 1.60985e-02 2.72856e-02 ## LDHA 311.760 2.36716 0.578059 4.08608 9.82521e-05 2.51928e-04

请注意,DESeq2的默认归一化程序是基于计数的几何均值,对于至少有一个零计数的基因,几何均值为零。这极大地限制了在scRNA-seq应用中可用于标准化的基因的数量。因此,我们使用中建议的归一化方法phyloseq包,它只使用正计数来计算基因的几何平均值,因此零计数的基因仍然可以用于标准化目的。的phyloseq可以通过设置参数来应用归一化过程类型等于poscountsDESeq

对于预期计数可能非常低的UMI数据,在中实施似然比检验nbinomLRT应该使用。对于其他协议(即非umi), Wald测试在nbinomWaldTest可用于零分布的t分布,自由度由观测权重校正。在这两种情况下,我们建议将最小期望计数设置为一个小值(例如,minmu = 1 e-6).

9使用zinbwave与修

中推断的因素zinbwave模型可以作为低维数据表示形式之一添加到修拉例如,使用Seurat的聚类分析方法来寻找亚种群。

我们首先需要转换SingleCellExperiment对象转换为修拉物体,使用修拉的CreateSeuratObject函数。

请注意,下面的工作流已经在Seurat的4.0.1版本中进行了测试。

在这里,我们用原始数据创建一个简单的Seurat对象。请参考修拉的小插图,以获得典型的分析,其中包括滤波,归一化等。

图书馆(修拉)seu <- as。修拉(x = fluidigm_zinb, counts = "counts", data = "counts")

请注意我们的zinbwave因子自动存在于修拉对象中。

最后,我们可以使用zinbwave聚类分析因子。

seu <- FindNeighbors(seu, reduction = "zinbwave", dims = 1:2 #this should match K) seu <- FindClusters(object = seu)

10处理大型数据集

在处理大型数据集时,zinbwave可能需要计算。我们提供了一个近似的策略,在zinbsurf函数,该函数只使用单元格的随机子集来推断低维空间,然后将所有单元格投射到推断的空间中。

fluidigm_surf <- zinbsurf(fluidigm, K = 2, epsilon = 1000, prop_fit = 0.5) W2 <- reducedDim(fluidigm_surf) data.frame(W2, bio=colData(fluidigm)$Biological_Condition, coverage=colData(fluidigm)$Coverage_Type) %>% ggplot(aes(W1, W2, color =bio, shape=coverage)) + geom_point() + scale_color_brewer(type = "qual", palette = "Set1") + theme_classic()

请注意,这里我们使用50%的数据来获得合理的近似,因为我们开始时只有130个单元格。我们发现,对于拥有数万个单元格的数据集,10%(默认值)通常是一个合理的选择。

请注意,这是一个实验性的特性,还没有经过彻底的测试。使用风险自负!

11关于性能和并行计算的说明

zinbwave包使用BiocParallel包以允许并行计算。这里,我们用注册命令以确保小插图使用串行计算运行。

然而,在真实的数据集中,并行计算可以大大加快计算速度,在许多基因和/或许多细胞的存在。

允许并行计算的方法有两种zinbwave.首先是注册()并行后端(参见? BiocParallel:登记详情)。或者,你可以传递一个BPPARAM对象zinbwave而且zinbFit,如。

library(BiocParallel) zinb_res <- zinbwave(fluidigm, K=2, BPPARAM=MulticoreParam(2))

我们发现MulticoreParam ()在Mac上可能会有一些性能问题;因此,我们建议DoparParam ()在Mac上工作时。

12会话信息

sessionInfo ()
## R版本4.2.1(2022-06-23)##平台:x86_64-pc-linux-gnu(64位)##运行在Ubuntu 20.04.5 LTS ## ##矩阵产品:默认## BLAS: /home/biocbuild/bbs-3.16-bioc/R/lib/libRblas。/home/biocbuild/bbs-3.16-bioc/R/lib/libRlapack。所以## ## locale: ## [1] LC_CTYPE=en_US。UTF-8 LC_NUMERIC= c# # [3] LC_TIME=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 lc_phone = c# # [11] LC_MEASUREMENT=en_US。UTF-8 LC_IDENTIFICATION=C ## ##附加的基本包:## [1]stats4 stats graphics grDevices utils datasets methods ##[8]基础## ##其他附加包:# # # # [1] DESeq2_1.38.0 edgeR_3.40.0 [3] limma_3.54.0 Rtsne_0.16 # # [5] biomaRt_2.54.0 ggplot2_3.3.6 # # [7] magrittr_2.0.3 scRNAseq_2.11.0 # # [9] zinbwave_1.20.0 SingleCellExperiment_1.20.0 # # [11] SummarizedExperiment_1.28.0 Biobase_2.58.0 # # [13] GenomicRanges_1.50.0 GenomeInfoDb_1.34.0 # # [15] IRanges_2.32.0 S4Vectors_0.36.0 # # [17] BiocGenerics_0.44.0 MatrixGenerics_1.10.0 # # [19] matrixStats_0.62.0 BiocStyle_2.26.0 # # # #通过加载一个名称空间(而不是附加):# # # # [1] colorspace_2.0-3 rjson_0.2.21 [3] ellipsis_0.3.2 XVector_0.38.0 # # [5] farver_2.1.1 bit64_4.0.5 # # [7] interactiveDisplayBase_1.36.0 AnnotationDbi_1.60.0 # # [9] fansi_1.0.3 xml2_1.3.3 # # [11] codetools_0.2-18 splines_4.2.1 # # [13] cachem_1.0.6 geneplotter_1.76.0 # # [15] knitr_1.40 jsonlite_1.8.3 # # [17] Rsamtools_2.14.0 annotate_1.76.0 # # [19] dbplyr_2.2.1 png_0.1-7 # # [21] shiny_1.7.3 BiocManager_1.30.19 # # [23] compiler_4.2.1 httr_1.4.4 # # [25] assertthat_0.2.1 Matrix_1.5-1 # # [27][39] Rcpp_1.0.9 softImpute_1.4-1 ## [41] jquerylib_0.1.4 vctrs_0.5.0 ## [43] Biostrings_2.66.0 ExperimentHub_2.6.0 # [45] rtracklayer_1.58.0 xfun_0.34 ## [47] string_1 .4.1 mime_0.12 ## [49] lifecycle_1.0.3 restfulr_0.15 ## b[51] ensembldb_2.22.0 xmlfulr_0.12 ## [35] glue_1.6.2 GenomeInfoDbData_1.2.9 ## [37] dplyr_1.0.10 rappdirs_0.3.3 ## [39] Rcpp_1.0.9 softimpute_1.4 ## [43] Biostrings_2.66.0 ExperimentHub_2.6.0 ## [49] lifecycle_1.0.3 restfulr_0.12 ## [49] ensembldb_2.22.0 xmlfulr_0.12 ## [41]AnnotationHub_3.6.0 scales_1.2.1 # # [55] zlibbioc_1.44.0 ProtGenerics_1.30.0 # # [57] hms_1.1.2 promises_1.2.0.1 # # [59] parallel_4.2.1 RColorBrewer_1.1-3 # # [61] AnnotationFilter_1.22.0 yaml_2.3.6 # # [63] curl_4.3.3 memoise_2.0.1 # # [65] sass_0.4.2 stringi_1.7.8 # # [67] RSQLite_2.2.18 highr_0.9 # # [69] BiocVersion_3.16.0 genefilter_1.80.0 # # [71] BiocIO_1.8.0 GenomicFeatures_1.50.0 # # [73] filelock_1.0.2 BiocParallel_1.32.0 # # [75] rlang_1.0.6 pkgconfig_2.0.3 # # [77] bitops_1.0-7 evaluate_0.17# # # # [79] lattice_0.20-45 purrr_0.3.5 [81] labeling_0.4.2 GenomicAlignments_1.34.0 # # [83] bit_4.0.4 tidyselect_1.2.0 # # [85] bookdown_0.29 R6_2.5.1 # # [87] magick_2.7.3 generics_0.1.3 # # [89] DelayedArray_0.24.0 DBI_1.1.3 # # [91] withr_2.5.0 pillar_1.8.1 # # [93] survival_3.4-0 KEGGREST_1.38.0 # # [95] rcurl_1.98 - 1.9 tibble_3.1.8 # # [97] crayon_1.5.2 utf8_1.2.2 # # [99] BiocFileCache_2.6.0 rmarkdown_2.17 # # [101] progress_1.2.2 locfit_1.5 - 9.6 # # [103] grid_4.2.1 blob_1.2.3 # # [105] digest_0.6.30 xtable_1.8-4 ## [107] httpuv_1.6.6 munsell_0.5.0 ## [109] bslib_0.4.0

参考文献

波伦,Alex A, Tomasz J Nowakowski, Joe Shuga,王晓辉,Anne A Leyrat, Jan H Lui,李年珍,等。2014。“低覆盖率单细胞mRNA测序揭示了发育中的大脑皮层中的细胞异质性和激活的信号通路。”自然生物技术32(10): 1053-8。

Risso, D, F Perraudeau, S Gribkova, S Dudoit和Vert JP。2018.“从单细胞RNA-Seq数据中提取信号的通用而灵活的方法。”自然通讯9: 284。

范登贝尔热,科恩,范妮·佩罗多,夏洛特·森森,迈克尔·我爱,达维德·里索,让-菲利普·维特,马克·D·罗宾逊,桑德琳·杜多特和列文·克莱门特。2018。“观察权重解锁大量Rna-Seq工具,用于零膨胀和单细胞应用。”bioRxiv, 250126年。