SingleCellExperiment的学习与使用

SingleCellExperiment 数据结构的学习

SingleCellExperiment Learning

1. 主要结构组成

Bioconductor 项目的主要优势之一在于使用通用数据基础设施来增强跨包的互操作性。用户应该能够使用不同 Bioconductor 包中的功能来分析数据,而无需在格式之间进行转换。SingleCellExperiment包,充当了70 多个单细胞相关 Bioconductor 包之间数据交换的通用货币,其实现了一个数据结构,用于存储单细胞数据的所有方面 - 逐个细胞的表达数据、每个细胞的meta数据和每个基因的注释 - 并以同步的方式进行操作

SingleCellExperiment(简称 SCE)是 Bioconductor 所设计的用于单细胞转录组数据的 基础数据结构,扩展自 SummarizedExperiment。它专为单细胞实验量身打磨,能统一储存表达矩阵、细胞 / 基因metadata、降维坐标等信息,是跨 Bioconductor 工具生态系统的数据“交换货币”。

sce

singlecellexperiment
  • Assays(蓝色部分),包含主要数据,例如测序计数矩阵(原始计数矩阵以及数据的标准化版本),其中行对应于特征(基因),列对应于样本(细胞);如原始 counts、标准化后 logcounts 等;行为 gene,列为 cell

  • colData (橙色部分),样本(细胞)的注释信息,例如样本名称、批次信息、分组信息、表达概况信息等,个 cell 的 metadata,如 cell_type、batch、QC 信息

  • rowData (绿色部分),特征(基因)的注释信息,例如表达概况、不同类基因名ID,对应行的 feature 注释,如 gene_id、gene_name、gene长度等信息

  • reducedDims (紫色部分), 每个细胞的降维特征信息,主要有PCA, tSNE, UMAP三类

  • metadata 项目级别额外信息,如实验描述,来源等

2. 构建sce

2.1 主要数据-assays

scater 是 R 语言中用于单细胞 RNA 测序(scRNA-seq)数据质量控制、探索性分析和可视化 的一个核心 Bioconductor 包,主要围绕 SingleCellExperiment 对象工作。

rpoisrnorm 是泊松分布和正态分布的常用函数

library(SingleCellExperiment)
library(scater)

# 1. simulate countdata
set.seed(123)
num_genes <- 12
num_cells <- 8
counts_mat <- matrix(
  as.integer(rpois(num_genes * num_cells, lambda = 5)),
  nrow = num_genes,
  ncol =  num_cells
)

rownames(counts_mat) <- paste0("Gene_",seq_len(num_genes))
colnames(counts_mat) <- paste0("Cell_",seq_len(num_cells))

# 2. Construct rowData and Build rowMetadata
gene_metadata <- DataFrame(
  gene_name = paste("G", seq_len(num_genes),sep = "_"),
  gene_length = as.integer(rnorm(num_genes,mean = 10000,sd=500))
)

cell_metadata<- DataFrame(
  cell_id = colnames(counts_mat),
  batch = rep(c("A","B"), each = num_cells/2),
  cell_type = rep(c("Type1","Type2"),times = num_cells/2)
)

S4Vectors 是基于R的S4对象系统,意味着每一列的数据都被严格锁定,不会像普通R表格那样由于自行切换导致数据错乱

  • 灵活性(嵌套):普通表格的列只能是简单的数字或字符。但在 S4Vectors 的 DataFrame 里,你可以把一个复杂的对象(比如一个 DNA 序列列表,或者另一个矩阵)直接塞进一列里
  • 内存优化:它在存储大规模组学数据时经过了优化,读写和切片操作速度更快。
> str(gene_metadata)
Formal class 'DFrame' [package "S4Vectors"] with 6 slots
  ..@ rownames       : NULL
  ..@ nrows          : int 12
  ..@ elementType    : chr "ANY"
  ..@ elementMetadata: NULL
  ..@ metadata       : list()
  ..@ listData       :List of 2
  .. ..$ gene_name  : chr [1:12] "G_1" "G_2" "G_3" "G_4" ...
  .. ..$ gene_length: int [1:12] 10999 10417 9061 9594 10550 11212 10449 9694 9383 9794 ...
  • listData是一个列表,存储了表格中实际的每一列数据
  • norws 一个整数,记录行数
  • elementMetadata 可以为表格每一列添加注释
  • metadata 存储整个表格的信息
3. create source
sce <- SingleCellExperiment(
  assays = list(counts = counts_mat),
  rowData = gene_metadata,
  colData = cell_metadata,
  metadata = list(study = "DemoStudy")
)

构建好sce之后,查看sce的结构,也是S4Vectors数据结构,$是拿走表面的“抽屉内容”,而 @是拆解底层的“零件槽”,$适用于列表 (List) 和 数据框 (data.frame / DFrame), @访问“槽位” (Slots)

  • 主要数据-assays
  • 细胞信息-colData
  • 基因信息-rawData
  • 细胞降维信息-reducedDims
> sce
class: SingleCellExperiment 
dim: 12 8 
metadata(1): study
assays(1): counts
rownames(12): Gene_1 Gene_2 ... Gene_11 Gene_12
rowData names(2): gene_name gene_length
colnames(8): Cell_1 Cell_2 ... Cell_7 Cell_8
colData names(3): cell_id batch cell_type
reducedDimNames(0):
mainExpName: NULL
altExpNames(0):

2.2 SCE 数据结构

  1. 核心数据区
  • assays:仓库
    • 存在counts或logcounts
  • NAMEs: 基因的名称,显示为NULL 说明还没给基因命名
  1. 注释信息区(Metadata)
  • colData 细胞的身份证
    • 存储关于每一列中 1列-细胞的信息,比如样本来源。细胞类型,质控指标等
  • elementMetadata 基因的说明书
    • 存储关于行 基因的信息, 如基因全名,长度,GC含量等
  • rowRnages:基因的地图坐标
    • 用于存储基因在染色体上的具体位置
  1. 对象内部控制区(Internal Slots) 以int_ 开头的slot ,是SCE对象开发者使用的内部逻辑区域,不需要手动修改
  • int_colData :存储对象内部使用的细胞元数据(例如降维结果 PCA、UMAP 实际上通常被包装后存在这里的一个子空间中)
  • int_elementMetadata: 存储对象内部使用的基因元数据。
  • int_metadata: 存储对象内部的其他全局信息。
  1. metadata 便签本
  • 自由度极高的list
# 4. logcounts
sce$sizeFactor <- colSums(counts_mat) /mean(colSums(counts_mat))
logcounts(sce) <- log2(counts(sce) / sce$sizeFactor + 1)

# 5. 添加PCA或UMAP
pca_mat <- prcomp(t(logcounts(sce)))$x[, 1:2]
reducedDim(sce, "PCA") <- pca_mat

# 6. 查看对象内部结构
assayNames(sce)          # count 和 logcounts
colnames(colData(sce))   # cell metadata 名称
rownames(rowData(sce))   # gene annotation
reducedDimNames(sce)     # PCA

2.3 结果解析

> sce
class: SingleCellExperiment 
dim: 12 8 
metadata(1): study
assays(2): counts logcounts
rownames(12): Gene_1 Gene_2 ... Gene_11 Gene_12
rowData names(2): gene_name gene_length
colnames(8): Cell_1 Cell_2 ... Cell_7 Cell_8
colData names(4): cell_id batch cell_type sizeFactor
reducedDimNames(1): PCA
mainExpName: NULL
altExpNames(0):
  1. class: SingleCellExperiment

表示对象是SingleCellExperiment 类,继承自SummarizedExperiment, 专门为单细胞设计的

  1. dim: 12 8

表示对象维度12行(基因) x 8列(细胞) - 行是feature 基因 - 列是样本 细胞

  1. metadata(1): study
  • metadata(sce) 返回一个 list,可以记录整体数据集的注释、项目说明、分析参数等。
  1. assays(2): counts logcounts 表示对象有两个表达矩阵
  • “counts”:原始 UMI count 数(整数矩阵),未归一化
  • “logcounts”:log2 转换后的表达矩阵,用于可视化和降维
  1. rownames(12): Gene_1 Gene_2 ... Gene_11 Gene_12 对象有12个feature基因,名称
  • rownames(sce) 查看所有的基因
  1. rowData names(2): gene_name gene_length

rawData(sce) 包含两个注释列: - “gene_name”:人为命名的基因名称(如 G_1) - “gene_length”:基因长度(可用于 TPM 归一化或 GO 分析)

  1. colnames(8): Cell_1 Cell_2 ... Cell_7 Cell_8

表示细胞的信息,同样的 colData names(4): cell_id batch cell_type sizeFactor 表示记录所有细胞信息

  1. reducedDimNames(1): PCA

用来记载降维后的数据

  1. altExpNames(0): altExp() 是 “替代实验”模块(alternative experiments),用于存放额外的数据类型,如:
  • spike-in genes
  • antibody-derived tags (ADT)
  • CITE-seq 里的 surface protein 信号