# 单细胞转录组数据分析入门 - 3-Seurat 对象详解和常用命令

Seurat 对象的数据结构是一个 S4 对象,它整合了单细胞 RNA 测序的原始数据、样本信息、分析结果等多种数据。

# 什么是 S4 对象

S4 对象是 R 语言中的一种高级面向对象编程机制,用于更复杂的对象和数据结构。相比于基础的列表(如 R 的 S3 对象),S4 对象具有更严格的规则,包括:

  1. 明确的类定义:每个 S4 对象的结构通过 setClass 定义,包含字段(slots)和类型限制。
  2. 字段和方法:通过 @ 操作符访问字段,例如 object@field
  3. 验证机制:对象创建时会验证字段和数据类型是否符合定义。

# Seurat 对象的基本组成

以下是一个典型的 Seurat 对象:

> str(seurat_object)
Formal class 'Seurat' [package "SeuratObject"] with 13 slots
  ..@ assays      :List of 1
  .. ..$ RNA:Formal class 'Assay5' [package "SeuratObject"] with 8 slots
  .. .. .. ..@ layers    :List of 5
  .. .. .. .. ..$ counts.GSE150703:Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  .. .. .. .. .. .. ..@ i       : int [1:5283361] 139 285 353 360 371 413 794 895 1083 1086 ...
  .. .. .. .. .. .. ..@ p       : int [1:6470] 0 362 929 1389 2076 2522 2938 3258 3803 4288 ...
  .. .. .. .. .. .. ..@ Dim     : int [1:2] 19212 6469
  .. .. .. .. .. .. ..@ Dimnames:List of 2
  .. .. .. .. .. .. .. ..$ : NULL
  .. .. .. .. .. .. .. ..$ : NULL
  .. .. .. .. .. .. ..@ x       : num [1:5283361] 3.51 3.51 2.85 2.85 2.85 ...
  .. .. .. .. .. .. ..@ factors : list()
  .. .. .. .. ..$ counts.GSE173079:Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  .. .. .. .. .. .. ..@ i       : int [1:60363549] 1 7 9 14 16 18 19 21 22 29 ...
  .. .. .. .. .. .. ..@ p       : int [1:37155] 0 5486 8723 9375 10894 11364 15960 16436 20951 21345 ...
  .. .. .. .. .. .. ..@ Dim     : int [1:2] 19788 37154
  .. .. .. .. .. .. ..@ Dimnames:List of 2
  .. .. .. .. .. .. .. ..$ : NULL
  .. .. .. .. .. .. .. ..$ : NULL
  .. .. .. .. .. .. ..@ x       : num [1:60363549] 1 1 2 1 1 7 1 4 2 3 ...
  .. .. .. .. .. .. ..@ factors : list()
  .. .. .. .. ..$ data.GSE150703  :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  .. .. .. .. .. .. ..@ i       : int [1:5283361] 139 285 353 360 371 413 794 895 1083 1086 ...
  .. .. .. .. .. .. ..@ p       : int [1:6470] 0 362 929 1389 2076 2522 2938 3258 3803 4288 ...
  .. .. .. .. .. .. ..@ Dim     : int [1:2] 19212 6469
  .. .. .. .. .. .. ..@ Dimnames:List of 2
  .. .. .. .. .. .. .. ..$ : NULL
  .. .. .. .. .. .. .. ..$ : NULL
  .. .. .. .. .. .. ..@ x       : num [1:5283361] 3.48 3.48 3.28 3.28 3.28 ...
  .. .. .. .. .. .. ..@ factors : list()
  .. .. .. .. ..$ data.GSE173079  :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  .. .. .. .. .. .. ..@ i       : int [1:60363549] 1 7 9 14 16 18 19 21 22 29 ...
  .. .. .. .. .. .. ..@ p       : int [1:37155] 0 5486 8723 9375 10894 11364 15960 16436 20951 21345 ...
  .. .. .. .. .. .. ..@ Dim     : int [1:2] 19788 37154
  .. .. .. .. .. .. ..@ Dimnames:List of 2
  .. .. .. .. .. .. .. ..$ : NULL
  .. .. .. .. .. .. .. ..$ : NULL
  .. .. .. .. .. .. ..@ x       : num [1:60363549] 0.413 0.413 0.704 0.413 0.413 ...
  .. .. .. .. .. .. ..@ factors : list()
  .. .. .. .. ..$ scale.data      : num [1:2000, 1:43623] -0.1823 -0.0688 -0.0893 -0.0229 -0.1376 ...
  .. .. .. ..@ cells     :Formal class 'LogMap' [package "SeuratObject"] with 1 slot
  .. .. .. .. .. ..@ .Data: logi [1:43623, 1:5] TRUE TRUE TRUE TRUE TRUE TRUE ...
  .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. .. .. .. .. ..$ : chr [1:43623] "GSE150703_NORM_P14_WR_Mccarrol_r6_TAGAGTCGAGCC" "GSE150703_NORM_P14_WR_Mccarrol_r3_CCGACTCCCCAA" "GSE150703_NORM_P14_WR_Mccarrol_r6_GAATAATGAGTC" "GSE150703_NORM_P14_WR_Mccarrol_p1_AAACTTCATATC" ...
  .. .. .. .. .. .. .. ..$ : chr [1:5] "counts.GSE150703" "counts.GSE173079" "data.GSE150703" "data.GSE173079" ...
  .. .. .. .. .. ..$ dim     : int [1:2] 43623 5
  .. .. .. .. .. ..$ dimnames:List of 2
  .. .. .. .. .. .. ..$ : chr [1:43623] "GSE150703_NORM_P14_WR_Mccarrol_r6_TAGAGTCGAGCC" "GSE150703_NORM_P14_WR_Mccarrol_r3_CCGACTCCCCAA" "GSE150703_NORM_P14_WR_Mccarrol_r6_GAATAATGAGTC" "GSE150703_NORM_P14_WR_Mccarrol_p1_AAACTTCATATC" ...
  .. .. .. .. .. .. ..$ : chr [1:5] "counts.GSE150703" "counts.GSE173079" "data.GSE150703" "data.GSE173079" ...
  .. .. .. ..@ features  :Formal class 'LogMap' [package "SeuratObject"] with 1 slot
  .. .. .. .. .. ..@ .Data: logi [1:22653, 1:5] TRUE TRUE TRUE TRUE TRUE TRUE ...
  .. .. .. .. .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. .. .. .. .. ..$ : chr [1:22653] "0610005C13RIK" "0610007N19RIK" "0610007P14RIK" "0610009B14RIK" ...
  .. .. .. .. .. .. .. ..$ : chr [1:5] "counts.GSE150703" "counts.GSE173079" "data.GSE150703" "data.GSE173079" ...
  .. .. .. .. .. ..$ dim     : int [1:2] 22653 5
  .. .. .. .. .. ..$ dimnames:List of 2
  .. .. .. .. .. .. ..$ : chr [1:22653] "0610005C13RIK" "0610007N19RIK" "0610007P14RIK" "0610009B14RIK" ...
  .. .. .. .. .. .. ..$ : chr [1:5] "counts.GSE150703" "counts.GSE173079" "data.GSE150703" "data.GSE173079" ...
  .. .. .. ..@ default   : int 2
  .. .. .. ..@ assay.orig: chr(0) 
  .. .. .. ..@ meta.data :'data.frame':	22653 obs. of  14 variables:
  .. .. .. .. ..$ vf_vst_counts.GSE150703_mean                 : num [1:22653] 0.00159 0.13045 0.2205 0.00942 0.2778 ...
  .. .. .. .. ..$ vf_vst_counts.GSE150703_variance             : num [1:22653] 0.0034 0.2716 0.4565 0.022 0.5865 ...
  .. .. .. .. ..$ vf_vst_counts.GSE150703_variance.expected    : num [1:22653] 0.00338 0.28201 0.46879 0.0202 0.58288 ...
  .. .. .. .. ..$ vf_vst_counts.GSE150703_variance.standardized: num [1:22653] 1.004 0.963 0.974 1.09 1.006 ...
  .. .. .. .. ..$ vf_vst_counts.GSE150703_variable             : logi [1:22653] FALSE FALSE FALSE FALSE FALSE FALSE ...
  .. .. .. .. ..$ vf_vst_counts.GSE150703_rank                 : int [1:22653] NA NA NA NA NA NA NA NA NA NA ...
  .. .. .. .. ..$ vf_vst_counts.GSE173079_mean                 : num [1:22653] 0.00525 NA NA NA 0.46062 ...
  .. .. .. .. ..$ vf_vst_counts.GSE173079_variance             : num [1:22653] 0.0056 NA NA NA 0.6538 ...
  .. .. .. .. ..$ vf_vst_counts.GSE173079_variance.expected    : num [1:22653] 0.00837 NA NA NA 1.11096 ...
  .. .. .. .. ..$ vf_vst_counts.GSE173079_variance.standardized: num [1:22653] 0.669 NA NA NA 0.588 ...
  .. .. .. .. ..$ vf_vst_counts.GSE173079_variable             : logi [1:22653] FALSE NA NA NA FALSE NA ...
  .. .. .. .. ..$ vf_vst_counts.GSE173079_rank                 : int [1:22653] NA NA NA NA NA NA NA NA NA NA ...
  .. .. .. .. ..$ var.features                                 : chr [1:22653] NA NA NA NA ...
  .. .. .. .. ..$ var.features.rank                            : int [1:22653] NA NA NA NA NA NA NA NA NA NA ...
  .. .. .. ..@ misc      : list()
  .. .. .. ..@ key       : chr "rna_"
  ..@ meta.data   :'data.frame':	43623 obs. of  6 variables:
  .. ..$ orig.ident  : chr [1:43623] "NORM" "NORM" "NORM" "NORM" ...
  .. ..$ nCount_RNA  : num [1:43623] 1118 1579 1337 1701 1314 ...
  .. ..$ nFeature_RNA: int [1:43623] 362 567 460 687 446 416 320 545 485 586 ...
  .. ..$ percent_mito: num [1:43623] 1.96 1.27 2.41 1.58 1.67 ...
  .. ..$ percent_ribo: num [1:43623] 3.75 4.68 3.33 3.27 3.45 ...
  .. ..$ percent_hb  : num [1:43623] 0 0 0 0 0 ...
  ..@ active.assay: chr "RNA"
  ..@ active.ident: Factor w/ 8 levels "NORM","OIR","Ctrl1",..: 1 1 1 1 1 1 1 1 1 1 ...
  .. ..- attr(*, "names")= chr [1:43623] "GSE150703_NORM_P14_WR_Mccarrol_r6_TAGAGTCGAGCC" "GSE150703_NORM_P14_WR_Mccarrol_r3_CCGACTCCCCAA" "GSE150703_NORM_P14_WR_Mccarrol_r6_GAATAATGAGTC" "GSE150703_NORM_P14_WR_Mccarrol_p1_AAACTTCATATC" ...
  ..@ graphs      : list()
  ..@ neighbors   : list()
  ..@ reductions  :List of 1
  .. ..$ pca:Formal class 'DimReduc' [package "SeuratObject"] with 9 slots
  .. .. .. ..@ cell.embeddings           : num [1:43623, 1:20] 6.85 5.16 5.77 6.24 5.51 ...
  .. .. .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. .. .. ..$ : chr [1:43623] "GSE150703_NORM_P14_WR_Mccarrol_r6_TAGAGTCGAGCC" "GSE150703_NORM_P14_WR_Mccarrol_r3_CCGACTCCCCAA" "GSE150703_NORM_P14_WR_Mccarrol_r6_GAATAATGAGTC" "GSE150703_NORM_P14_WR_Mccarrol_p1_AAACTTCATATC" ...
  .. .. .. .. .. ..$ : chr [1:20] "PC_1" "PC_2" "PC_3" "PC_4" ...
  .. .. .. ..@ feature.loadings          : num [1:2000, 1:20] -0.0303 -0.0332 -0.0206 -0.0349 -0.0197 ...
  .. .. .. .. ..- attr(*, "dimnames")=List of 2
  .. .. .. .. .. ..$ : chr [1:2000] "RGS5" "MGP" "CTSS" "CLDN5" ...
  .. .. .. .. .. ..$ : chr [1:20] "PC_1" "PC_2" "PC_3" "PC_4" ...
  .. .. .. ..@ feature.loadings.projected: num[0 , 0 ] 
  .. .. .. ..@ assay.used                : chr "RNA"
  .. .. .. ..@ global                    : logi FALSE
  .. .. .. ..@ stdev                     : num [1:20] 10.22 7.31 6.81 6.35 4.97 ...
  .. .. .. ..@ jackstraw                 :Formal class 'JackStrawData' [package "SeuratObject"] with 4 slots
  .. .. .. .. .. ..@ empirical.p.values     : num[0 , 0 ] 
  .. .. .. .. .. ..@ fake.reduction.scores  : num[0 , 0 ] 
  .. .. .. .. .. ..@ empirical.p.values.full: num[0 , 0 ] 
  .. .. .. .. .. ..@ overall.p.values       : num[0 , 0 ] 
  .. .. .. ..@ misc                      :List of 1
  .. .. .. .. ..$ total.variance: num 1206
  .. .. .. ..@ key                       : chr "PC_"
  ..@ images      : list()
  ..@ project.name: chr "SeuratProject"
  ..@ misc        : list()
  ..@ version     :Classes 'package_version', 'numeric_version'  hidden list of 1
  .. ..$ : int [1:3] 5 0 2
  ..@ commands    :List of 4
  .. ..$ NormalizeData.RNA       :Formal class 'SeuratCommand' [package "SeuratObject"] with 5 slots
  .. .. .. ..@ name       : chr "NormalizeData.RNA"
  .. .. .. ..@ time.stamp : POSIXct[1:1], format: "2025-01-22 16:23:33"
  .. .. .. ..@ assay.used : chr "RNA"
  .. .. .. ..@ call.string: chr "NormalizeData(.)"
  .. .. .. ..@ params     :List of 5
  .. .. .. .. ..$ assay               : chr "RNA"
  .. .. .. .. ..$ normalization.method: chr "LogNormalize"
  .. .. .. .. ..$ scale.factor        : num 10000
  .. .. .. .. ..$ margin              : num 1
  .. .. .. .. ..$ verbose             : logi TRUE
  .. ..$ FindVariableFeatures.RNA:Formal class 'SeuratCommand' [package "SeuratObject"] with 5 slots
  .. .. .. ..@ name       : chr "FindVariableFeatures.RNA"
  .. .. .. ..@ time.stamp : POSIXct[1:1], format: "2025-01-22 16:23:38"
  .. .. .. ..@ assay.used : chr "RNA"
  .. .. .. ..@ call.string: chr "FindVariableFeatures(.)"
  .. .. .. ..@ params     :List of 12
  .. .. .. .. ..$ assay              : chr "RNA"
  .. .. .. .. ..$ selection.method   : chr "vst"
  .. .. .. .. ..$ loess.span         : num 0.3
  .. .. .. .. ..$ clip.max           : chr "auto"
  .. .. .. .. ..$ mean.function      :function (mat, display_progress)  
  .. .. .. .. ..$ dispersion.function:function (mat, display_progress)  
  .. .. .. .. ..$ num.bin            : num 20
  .. .. .. .. ..$ binning.method     : chr "equal_width"
  .. .. .. .. ..$ nfeatures          : num 2000
  .. .. .. .. ..$ mean.cutoff        : num [1:2] 0.1 8
  .. .. .. .. ..$ dispersion.cutoff  : num [1:2] 1 Inf
  .. .. .. .. ..$ verbose            : logi TRUE
  .. ..$ ScaleData.RNA           :Formal class 'SeuratCommand' [package "SeuratObject"] with 5 slots
  .. .. .. ..@ name       : chr "ScaleData.RNA"
  .. .. .. ..@ time.stamp : POSIXct[1:1], format: "2025-01-22 16:23:40"
  .. .. .. ..@ assay.used : chr "RNA"
  .. .. .. ..@ call.string: chr "ScaleData(., verbose = FALSE)"
  .. .. .. ..@ params     :List of 9
  .. .. .. .. ..$ assay             : chr "RNA"
  .. .. .. .. ..$ model.use         : chr "linear"
  .. .. .. .. ..$ use.umi           : logi FALSE
  .. .. .. .. ..$ do.scale          : logi TRUE
  .. .. .. .. ..$ do.center         : logi TRUE
  .. .. .. .. ..$ scale.max         : num 10
  .. .. .. .. ..$ block.size        : num 1000
  .. .. .. .. ..$ min.cells.to.block: num 3000
  .. .. .. .. ..$ verbose           : logi FALSE
  .. ..$ RunPCA.RNA              :Formal class 'SeuratCommand' [package "SeuratObject"] with 5 slots
  .. .. .. ..@ name       : chr "RunPCA.RNA"
  .. .. .. ..@ time.stamp : POSIXct[1:1], format: "2025-01-22 16:23:49"
  .. .. .. ..@ assay.used : chr "RNA"
  .. .. .. ..@ call.string: chr "RunPCA(., npcs = 20, verbose = FALSE)"
  .. .. .. ..@ params     :List of 10
  .. .. .. .. ..$ assay          : chr "RNA"
  .. .. .. .. ..$ npcs           : num 20
  .. .. .. .. ..$ rev.pca        : logi FALSE
  .. .. .. .. ..$ weight.by.var  : logi TRUE
  .. .. .. .. ..$ verbose        : logi FALSE
  .. .. .. .. ..$ ndims.print    : int [1:5] 1 2 3 4 5
  .. .. .. .. ..$ nfeatures.print: num 30
  .. .. .. .. ..$ reduction.name : chr "pca"
  .. .. .. .. ..$ reduction.key  : chr "PC_"
  .. .. .. .. ..$ seed.use       : num 42
  ..@ tools       : list()

# Seurat 对象的结构详解

# assays

assays 是 Seurat 对象的核心,存储了基因表达矩阵以及其他相关数据。本例中,有一个名为 RNA 的 Assay。
RNA 的详细结构如下:

  • layers :存储多个层的数据。

    • counts.GSE150703counts.GSE173079 是未归一化的原始计数矩阵,存储为稀疏矩阵格式( dgCMatrix )。

      • ip :稀疏矩阵的内部索引,用于高效存储。
      • Dim :矩阵的行(基因)和列(细胞)维度。
      • x :非零元素的值。
    • data.GSE150703data.GSE173079 是归一化后的基因表达矩阵。

    • scale.data :标准化后的矩阵,常用于降维和聚类分析。

  • cellsfeatures :记录细胞和基因的相关信息。

  • meta.data :Assay 层级的元数据,包含变量基因的均值、方差等信息。

  • key :标记该 Assay 的前缀键,用于识别它的数据。

# meta.data

这是一个数据框,存储与每个细胞相关的元信息。

  • 示例中的字段:
    • orig.ident :样本来源。
    • nCount_RNA :每个细胞的总 RNA 计数。
    • nFeature_RNA :每个细胞检测到的基因数。
    • percent_mito :线粒体基因的比例,通常用于质量控制。
    • percent_ribo :核糖体基因占比,通常用于质量控制。
    • percent_hb :血红蛋白基因占比,通常用于质量控制。

# active.assay

表示当前活跃的 Assay,本例中是 RNA 。它控制 Seurat 函数操作的数据来源。

# active.ident

每个细胞当前的分类标签,是一个因子型向量。在本例中,包含 8 个分组(如 NORMOIR ),这些分组可以用于下游分析和绘图。

# graphs

存储细胞之间的图结构,支持聚类和邻近分析。本例中, graphs 列表为空,表明暂未进行此类分析。

# neighbors

存储细胞间邻居信息,通常由最近邻算法计算得出,用于降维和聚类。本例中, neighbors 列表为空。

# reductions

存储降维结果。本例中有一个 PCA(主成分分析)结果:

  • cell.embeddings :细胞在 PCA 空间中的坐标。
  • feature.loadings :基因对主成分的贡献。
  • stdev :每个主成分的标准差。 这些数据用于可视化(如 DimPlot )和聚类。

# images

存储空间转录组学数据的图像信息。本例中为空,表明未涉及空间转录组学分析。

# project.name

Seurat 对象的项目名称,本例为 SeuratProject 。可用于标记和区分不同的数据集。

# misc

存储用户自定义的信息。本例中为空,可用于存储额外的分析结果或注释。

# version

记录 Seurat 包的版本号,本例为 5.0.2 。这有助于保证分析结果的可重复性和兼容性。

# commands

记录分析过程中执行的主要命令及其参数。例如:

  • NormalizeData.RNA :记录归一化步骤,使用了 LogNormalize 方法。
  • FindVariableFeatures.RNA :记录高变基因筛选过程,选择了 2000 个基因。
  • ScaleData.RNARunPCA.RNA :记录了标准化和 PCA 的参数。 这些信息便于追踪分析流程和复现结果。

# tools

存储插件或扩展分析的结果。本例中为空。

# 基于本例的分析提示

  1. meta.data 是质量控制的重要部分,可通过筛选 nFeature_RNApercent_mito 等字段过滤低质量细胞。
  2. reductions 的 PCA 结果是降维和聚类的基础,可以使用 DimPlot 进行可视化。
  3. commands 记录了关键分析步骤,便于复现和审查。