# 单细胞转录组数据分析入门 - 3-Seurat 对象详解和常用命令
Seurat 对象的数据结构是一个 S4 对象,它整合了单细胞 RNA 测序的原始数据、样本信息、分析结果等多种数据。
# 什么是 S4 对象
S4 对象是 R 语言中的一种高级面向对象编程机制,用于更复杂的对象和数据结构。相比于基础的列表(如 R 的 S3 对象),S4 对象具有更严格的规则,包括:
- 明确的类定义:每个 S4 对象的结构通过
setClass
定义,包含字段(slots)和类型限制。 - 字段和方法:通过
@
操作符访问字段,例如object@field
。 - 验证机制:对象创建时会验证字段和数据类型是否符合定义。
# 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.GSE150703
和counts.GSE173079
是未归一化的原始计数矩阵,存储为稀疏矩阵格式(dgCMatrix
)。i
和p
:稀疏矩阵的内部索引,用于高效存储。Dim
:矩阵的行(基因)和列(细胞)维度。x
:非零元素的值。
-
data.GSE150703
和data.GSE173079
是归一化后的基因表达矩阵。 -
scale.data
:标准化后的矩阵,常用于降维和聚类分析。
-
-
cells
和features
:记录细胞和基因的相关信息。 -
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 个分组(如 NORM
、 OIR
),这些分组可以用于下游分析和绘图。
# 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.RNA
和RunPCA.RNA
:记录了标准化和 PCA 的参数。 这些信息便于追踪分析流程和复现结果。
# tools
存储插件或扩展分析的结果。本例中为空。
# 基于本例的分析提示
meta.data
是质量控制的重要部分,可通过筛选nFeature_RNA
和percent_mito
等字段过滤低质量细胞。reductions
的 PCA 结果是降维和聚类的基础,可以使用DimPlot
进行可视化。commands
记录了关键分析步骤,便于复现和审查。