1动机

SingleCellExperiment类是一个轻量级的Bioconductor容器,用于存储和操作单细胞基因组数据。它扩展了RangedSummarizedExperiment类和遵循类似的惯例,即行应该表示特征(基因,转录本,基因组区域),列应该表示细胞。它提供了存储降维结果和替代特征集数据的方法(例如,合成spike-in转录本,抗体衍生标签)。它是生物导体单细胞包的中心数据结构,比如而且食物

2创建singlecel实验实例

SingleCellExperiment对象可以通过同名的构造函数创建。例如,如果我们有一个计数矩阵计数,我们可以简单地调用:

library(singlecel实验)counts <- matrix(rpois(100, lambda =10), ncol=10, nrow=10) sce <- singlecel实验(counts) sce
##类:SingleCellExperiment ## dim: 10 10 ##元数据(0):## assays(1):“## rownames: NULL ## rowData names(0): ## colnames: NULL ## colData names(0): ## reducedDimNames(0): ## mainExpName: NULL ## altExpNames(0):

在实践中,通过传递一个命名列表来命名化验通常更有用:

sce <- singlecel实验(list(counts=counts)
##类:SingleCellExperiment ## dim: 10 10 ##元数据(0):## assays(1):计数## rownames: NULL ## rowData names(0): ## colnames: NULL ## colData names(0): ## reducedDimNames(0): ## mainExpName: NULL ## altExpNames(0):

通过将值传递给适当的参数来设置列元数据和行元数据同样很容易。我们将不会在这里详细介绍,因为大部分内容都是由SummarizedExperiment文档,但要给出一个例子:

pre .cell.labels <- sample(letters, ncol(counts), replace=TRUE) pre .gene.length <- sample(10000, nrow(counts)) sce <- singlecelexperiment (list(counts=counts), colData=DataFrame(label=pre .cell.labels), rowData=DataFrame(length=pre .gene.length), metadata=list(study="GSE111111")) sce
##类:SingleCellExperiment ## dim: 10 10 ##元数据(1):研究## assays(1):计数## rownames: NULL ## rowData names(1):长度## colnames: NULL ## colData names(1):标签## reducedDimNames(0): ## mainExpName: NULL ## altExpNames(0):

或者,我们可以构造一个SingleCellExperiment通过胁迫一个存在(远程)SummarizedExperiment对象:

se <- summarizeexperimental (list(counts=counts)) as(se, " singlecelexperimental ")
##类:SingleCellExperiment ## dim: 10 10 ##元数据(0):## assays(1):计数## rownames: NULL ## rowData names(0): ## colnames: NULL ## colData names(0): ## reducedDimNames(0): ## mainExpName: NULL ## altExpNames(0):

可以应用于的任何操作RangedSummarizedExperiment的任何实例也适用于SingleCellExperiment.这包括通过分析(),列元数据colData ()等等。再说一遍,我不想讲太多细节:

暗(化验(sce))
## [1] 10 10
colnames (colData (sce))
##[1]“标签”
构成了rowData (colnames (sce))
##[1]“长度”

为了在其余部分演示该类的使用,我们将使用Allen数据集scRNAseq包中。

library(scRNAseq) sce <- ReprocessedAllenData("tophat_counts") sce
##类:singlecel实验## dim: 20816 379 ##元数据(2):SuppInfo whe_qc ## assays(1): tophat_counts ## rownames(20816): 0610007P14Rik 0610009B22Rik…Zzef1 Zzz3 ## rowData names(0): ## colnames(379): SRR2140028 SRR2140022…SRR2139341 SRR2139336 ## colData names(22): NREADS NALIGNED…的动物。ID passes_qc_checks_s ## reducedDimNames(0): ## mainExpName: endogenous ## altExpNames(1): ERCC

3.添加低维表示

我们从计数矩阵中计算对数转换的规范化表达式值。(我们注意到,这些步骤中的许多可以作为一行程序从包,但我们将在这里完整地展示它们,以演示其功能SingleCellExperiment类)。

counts <- assay(sce, "tophat_counts") libsizes <- colsum (counts) size。factors <- libsizes/mean(libsizes) logcounts(sce) <- log2(t(t(counts)/size.factors) + 1) assayNames(sce)
## [1] "tophat_counts" "logcounts"

我们获得数据的PCA和t-SNE表示,并将它们添加到对象中< - reducedDims ()方法。或者,我们可以一次表示一个< - reducedDim ()方法(注意缺少年代).

pca_data <- prcomp(t(logcounts(sce)), rank=50) library(rtse) set.seed(5252) tsne_data <- rtse (pca_data$x[,1:50], pca = FALSE) reducedDims(sce) <- list(pca =pca_data$x, tse =tsne_data$Y) sce
##类:singlecel实验## dim: 20816 379 ##元数据(2):SuppInfo whe_qc ## assays(2): tophat_counts logcounts ## rownames(20816): 0610007P14Rik 0610009B22Rik…Zzef1 Zzz3 ## rowData names(0): ## colnames(379): SRR2140028 SRR2140022…SRR2139341 SRR2139336 ## colData names(22): NREADS NALIGNED…的动物。ID passes_qc_checks_s ## reducedDimNames(2): PCA TSNE ## mainExpName: endogenous ## altExpNames(1): ERCC

所有表示的坐标都可以从SingleCellExperiment集体reducedDims ()或者一次一个名字/索引reducedDim ().假设坐标矩阵的每一行对应一个单元格,而每一列表示一个维度。

reducedDims (sce)
长度2的名称列表(2):PCA TSNE
reducedDimNames (sce)
##[1]“pca”“tsne”
PCA“头(reducedDim (sce) [1:2])
## srr2140028 -70.23670 33.78880 ## srr2140022 -41.00366 49.76633 ## srr2140055 -133.70763 7.68870 ## srr2140083 -36.26099 113.18806 ## srr2139991 -100.86439 15.94740 ## srr2140067 -97.71210 35.77881
“TSNE”头(reducedDim (sce) [1:2])
## [,1] [,2] ## srr2140028 10.181173 0.1273058 ## srr2140022 7.178177 -0.6608389 ## srr2140055 -1.129905 -4.8241943 ## srr2140083 6.892426 5.9602596 ## srr2139991 5.701377 -0.2501758 ## srr2140067 3.214875 -4.6620940

的列的任意子集sce_sub也会导致维数降低结果的子集由单元格。这很方便,因为它确保了我们的低维结果始终与基因表达数据同步。

PCA“暗(reducedDim (sce))
## [1] 379 50
暗(reducedDim (sce [1:10], PCA))
## [1] 10 50

4方便访问命名的化验

SingleCellExperiment,用户可以为的项分配任意名称化验.为了帮助包之间的互操作性,我们对特定类型的数据的名称提供了一些建议:

  • 计数:原始计数数据,例如,特定基因的读数或转录数。
  • normcounts:与原始计数在同一尺度上的规范化值。例如,以统一为中心的细胞特定大小因子划分的计数。
  • logcounts:对数转换计数或类计数值。在大多数情况下,这将被定义为对数转换normcounts,例如,使用以2为底的对数和1的伪计数。
  • cpm: Counts-per-million。这是每个细胞中每个基因的读取计数,除以每个细胞的文库大小,单位为百万。
  • tpm: Transcripts-per-million。这是每个细胞中每个基因的转录本数量,除以该细胞中的转录本总数(以百万为单位)。

方法的适当getter/setter方法SingleCellExperiment.例如,我们可以取(非常明确的名称)tophat_counts命名并将其分配给计数而不是:

Counts (sce) <- assay(sce, "tophat_counts") sce
##类:singlecel实验## dim: 20816 379 ##元数据(2):SuppInfo whe_qc ## assays(3): tophat_counts logcounts计数## rownames(20816): 0610007P14Rik 0610009B22Rik…Zzef1 Zzz3 ## rowData names(0): ## colnames(379): SRR2140028 SRR2140022…SRR2139341 SRR2139336 ## colData names(22): NREADS NALIGNED…的动物。ID passes_qc_checks_s ## reducedDimNames(2): PCA TSNE ## mainExpName: endogenous ## altExpNames(1): ERCC
暗(计数(sce))
## [1] 20816 379

这意味着期望计数数据的函数可以简单地调用数量()不用担心特定于包的命名约定。

5添加可选特性集

许多scRNA-seq实验包含了内源基因以外的多种特征类型的测序数据:

  • 外部增加了板基实验的spike-in转录本。
  • 用于CITE-seq实验的抗体标签。
  • 用于CRISPR-seq实验的CRISPR标签。
  • 涉及多基因型实验的等位基因信息。

这样的特性可以存储在SingleCellExperiment通过“替代实验”的概念。这些是嵌套的SummarizedExperiment保证与主实例具有相同的列数和列顺序的实例SingleCellExperiment本身。因此,内源性基因和其他特征的数据可以保持独立(这通常是可取的,因为它们需要以不同的方式处理),同时仍然保持对单个对象操作的同步。

为了说明这一点,请考虑Allen数据中插入转录本的情况。的altExp ()方法返回一个自包含的SingleCellExperiment只包含插入文本的实例。

altExp (sce)
##类:singlecel实验## dim: 92 379 ##元数据(2):SuppInfo whe_qc ## assays(1): tophat_counts ## rownames(92): ERCC-00002 ERCC-00003…ERCC-00170 ERCC-00171 ## rowData names(0): ## colnames(379): SRR2140028 SRR2140022…SRR2139341 SRR2139336 ## colData names(0): ## reducedDimNames(0): ## mainExpName: NULL ## altExpNames(0):

每个可供选择的实验都可以有一组不同于主实验的分析SingleCellExperiment.这在必须对其他特性类型进行标准化或不同转换的情况下非常有用。类似地,替代实验可以有不同的rowData ()从主对象。

rowData(altExp(sce))$concentration <- runif(nrow(altExp(sce))) rowData(altExp(sce))
##数据帧与92行和1列##浓度## <数值> ## ERCC-00002 0.034970 ## ERCC-00003 0.979286 ## ERCC-00004 0.171510 ## ERCC-00009 0.577606 ## ERCC-00012 0.965111 ## ... ...## ercc-00165 0.4449455 ## ercc-00168 0.2821027 ## ercc-00170 0.0817114 ## ercc-00171 0.4178510
rowData (sce)
##数据帧有20816行和0列

我们提供splitAltExps ()实用程序轻松拆分SingleCellExperiment进入新的替代实验。例如,如果我们想将RIKEN的转录本拆分为一个单独的实验——比如,在不明确丢弃数据的情况下,确保它们不用于下游分析——我们会做:

是多少。riken <- grepl("^[0-9]", rownames(sce)) sce <- splitAltExps(sce, ifelse(is。riken, " riken ", "gene"))
##[1]“ercc”“riken”

或者,如果我们想交换主实验和替代实验——也许是因为RIKEN的转录本比预期的更有趣,我们想对它们进行分析——我们可以简单地使用swapAltExp ()将RIKEN替代实验与基因表达数据进行切换:

swapAltExp(sce, "RIKEN", saved="original")
##类:singlecel实验实验## dim: 611 379 ##元数据(2):SuppInfo whe_qc ## assays(3): tophat_counts logcounts计数## rownames(611): 0610007P14Rik 0610009B22Rik…9930111J21Rik1 ## 9930111J21Rik2 ## rowData names(0): ## colnames(379): SRR2140028 SRR2140022…SRR2139341 SRR2139336 ## colData names(22): NREADS NALIGNED…的动物。ID passes_qc_checks_s ## reducedDimNames(2): PCA TSNE ## mainExpName: RIKEN ## altExpNames(2): ERCC original

6存储行或列对

单细胞分析中的一个常见程序是识别细胞对之间的关系,例如,构建最近邻图或标记细胞之间假定的物理相互作用。我们可以在SingleCellExperiment类的colPairs ()功能。为了演示,假设我们有100个细胞之间的关系南加州爱迪生公司,以某种距离度量为特征:

cell2 <- sample(ncol(sce), 100, replace=TRUE)距离<- runif(100)

我们把它存储在SingleCellExperiment作为一个SelfHits对象使用价值元数据字段保存我们的数据。这很容易提取为SelfHits或者,对于逻辑或数值数据,作为稀疏矩阵从矩阵

colPair(sce, "relationships") <- SelfHits(cell1, cell2, nnode=ncol(sce), value=distance) colPair(sce, "relationships")
## SelfHits对象100命中和1元数据列:##从|值## <整数> <整数> | <数字> ## [1]2 224 | 0.3155391 ## [2]2 311 | 0.0554668 ## [3]12 200 b| 0.6148850 ## [4] 16 304 | 0.0174597 ## [5] 21 244 | 0.9801941 ## ... ... ... . ...## [96] 349 369 | 0.662352 ## [97] 349 372 | 0.839914 ## [98] 352 10 | 0.540362 ## [99] 360 172 | 0.392147 ## [100] 360 237 | 0.626605 ## ------- ## nnode: 379
类(colPair (sce asSparse = TRUE))
# #[1]“dgCMatrix”# # attr(“包”)# #[1]“矩阵”

一个特别有用的特性是,当相互作用的单元格的索引自动重新映射时南加州爱迪生公司子集。这确保配对始终与单元格的身份同步南加州爱迪生公司

sub <- sce[,50:300] colPair(sub) #获取第一个配对,如果没有提供'type'。
## SelfHits对象,46命中和1元数据列:## from to |值##   |  ## [1] 7 157 | 0.748443 ## [2] 11 2 | 0.260945 ## [3] 18 203 b| 0.857025 ## [4] 19 217 | 0.967591 ## [5] 32 249 | 0.608411 ## ... ... ... . ...## [42] 236 3 | 0.17149734 ## [43] 240 245 | 0.98800819 ## [44] 245 52 | 0.00164622 ## [45] 248 208 | 0.53441707 ## [46] 250 65 | 0.31503674 ## ------- ## nnode: 251

类的行之间的配对也具有类似的功能rowPairs ()函数族,这对于表示共表达或调节网络可能有用。

7其他元数据字段

SingleCellExperiment类提供sizeFactors ()方法来设置和检索大小因子colData物体的。每个大小因子表示应用于单元格的缩放因子,在下游比较之前将表达式值规范化,例如,去除库大小差异和其他单元格特定偏差的影响。这些方法主要用于实现归一化方法的函数的编程使用,但用户也可以直接调用它来检查或定义用于分析的大小因子。

#生成一些大小因子并存储它们:sizeFactors(sce) <- 2^rnorm(ncol(sce)) summary(sizeFactors(sce))
最小第一曲,中位数,平均第三曲,最大值。## 0.1336 0.6761 1.0082 1.2365 1.5034 9.8244
#删除sizeFactors(sce) <- NULL sizeFactors(sce)
# #空

colLabels ()方法允许应用程序设置和检索单元格标签colData.这些标签可以从聚类注释中派生,由分类算法分配等,通常用于下游可视化和分析。而标签可以存储在任何colData场,colLabels ()方法旨在为默认位置提供一些非正式的标准化,下游函数在试图检索注释时可以首先搜索该位置。

#创建并存储一些标签:colLabels(sce) <- sample(letters, ncol(sce), replace=TRUE) table(colLabels(sce))
## ## a b c d e f g h I j k l m n o p q r s t u v w x y z ## 18 14 15 13 16 12 19 14 10 12 14 13 16 10 25 22 15 8 12 19 14 19 12 17 11 9
#删除标签:colLabels(sce) <- NULL colLabels(sce)
# #空

类似地,我们提供rowSubset ()方法中设置和获取行子集rowData.这将存储基因身份的任何向量(例如,行名,整数索引,逻辑向量)在SingleCellExperiment对象,供下游函数检索和使用。然后,用户可以轻松地将多个特性集打包到同一个对象中进行同步操作。

#将整数或字符向量打包到rowData: row子集(sce,“我的基因集1”)<- 1:10 which(row子集(sce,“我的基因集1”))
## [1] 1 2 3 4 5 6 7 8 9 10
#易于删除:row子集(sce,“我的基因集1”)<- NULL row子集(sce,“我的基因集1”)
# #空

会话信息

sessionInfo ()
## R正在开发中(不稳定)(2022-10-25 r83175) ##平台:x86_64-pc-linux-gnu(64位)##运行在Ubuntu 22.04.1 LTS ## ##矩阵产品:默认## BLAS: /home/biocbuild/bbs-3.17-bioc/R/lib/libRblas。so ## LAPACK: /usr/lib/x86_64-linux-gnu/ LAPACK /liblapack.so.3.10.0 ## ## 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] Rtsne_0.16 scRNAseq_2.11.0 SummarizedExperiment_1.29.0 ## [5] Biobase_2.59.0 genomicranges_1.1.1.0 ## [7] GenomeInfoDb_1.35.0 IRanges_2.33.0 ## [9] S4Vectors_0.37.0 BiocGenerics_0.45.0 ## [11] MatrixGenerics_1.11.0 matrixStats_0.62.0 ## [13] BiocStyle_2.27.0 ## ##通过命名空间加载(并且没有附加):# # # # [1] DBI_1.1.3 bitops_1.0-7 [3] biomaRt_2.55.0 rlang_1.0.6 # # [5] magrittr_2.0.3 compiler_4.3.0 # # [7] RSQLite_2.2.18 GenomicFeatures_1.51.0 # # [9] png_0.1-7 vctrs_0.5.0 # # [11] ProtGenerics_1.31.0 stringr_1.4.1 # # [13] pkgconfig_2.0.3 crayon_1.5.2 # # [15] fastmap_1.1.0 dbplyr_2.2.1 # # [17] XVector_0.39.0 ellipsis_0.3.2 # # [19] utf8_1.2.2 Rsamtools_2.15.0 # # [21] promises_1.2.0.1 rmarkdown_2.17 # # [23] purrr_0.3.5 bit_4.0.4 # # [25] xfun_0.34 zlibbioc_1.45.0 # # [27] cachem_1.0.6## [39] stringi_1.7.8 rtracklayer_1.59.0 ## [41] jquerylib_0.1.4 Rcpp_1.0.9 ## [43] bookdown_0.29 assertthat_0.2.1 ## [47] Matrix_1.5-1 tidyselect_1.2.0 ## [49] yaml_2.3.6 codetools_0.2-18 ## b[51] curl_4.3.3 lattice_0.20-45 ## [53] tibble_3.1.8 ## [35] parallel_4.3.0 prettyunits_1.1.1 ## [37] R6_2.5.1 bslib_0.4.0 ## [39] stringi_1.7.8 rtracklayer_1.59.0 ## [41] jquerylib_0.1.4 Rcpp_1.0.9 ## [43] bookdown_0.29 assertthat_0.2.1 ## [45] knitr_1.40 httpuv_1.6.6 ## [49] yaml_2.3.6 codetools_0.2-18 ## b[53] tibble_3.1.8[61] Biostrings_2.67.0 pillar_1.8.1 ## [63] BiocManager_1.30.19 filelock_1.0.2 ## [65] generics_0.1.3 RCurl_1.98-1.9 ## [69] hms_1.1.2 xtable_1.8-4 ## [71] glue_1.6.2 lazyeval_0.2.2 ## [73] tools_4.3.0 AnnotationHub_3.7.0 ## [77] BiocIO_1.9.0基因组alignments_1.35.0 ## [79]AnnotationDbi_1.61.0 GenomeInfoDbData_1.2.9 ## [81] restfulr_0.0.15 cli_3.4.1 ## [83] rappdirs_0.3.3 fansi_1.0.3 ## [85] dplyr_1.0.10 AnnotationFilter_1.23.0 ## [87] sass_0.4.2 digest_0.6.30 ## [89] rjson_0.2.21 memoise_2.0.1 ## [91] htmltools_0.5.3 lifecycle_1.0.3 ## [93] httr_1.4.4 mime_0.12 ## [95] bit64_4.0.5