2023-04-26

第1章 seurat包简介

第1.1节 什么是seurat

seurat是R语言下的单细胞RNA测序(scRNA-seq)数据分析包。它能够处理和分析来自不同平台(包括10x Genomics、DroNc-seq、Smart-seq等)的scRNA-seq数据。seurat在数据整理、质量控制、可视化、粒度聚类、差异表达检测和空间定位等方面都有出色的表现。它是单细胞分析领域使用最广泛的R包,能够有效支持研究人员快速分析scRNA-seq数据,挖掘数据背后的生物学意义。

第1.2节 seurat包能做什么

seurat包能够轻松完成以下 scRNA-seq 数据分析步骤:

1)数据导入与预处理:从多个文件格式(包括mtx、csv、rds等)导入数据,对数据进行过滤、标准化、归一化和质量控制等预处理。

2)可视化:丰富的绘图功能,包括散点图、小提琴图、热图等,可以直观展示数据质量与特征。

3)降维与聚类:使用PCA、TSNE、UMAP等对数据进行降维,并采用FindClusters等函数进行聚类。

4)差异表达基因检测:使用FindMarkers和其他函数检测不同细胞类型的差异表达基因,得到标记基因。

5)空间定位与区域检测:可以结合生物学知识,在空间中定位和检测已知的细胞区域。

6)细胞类型注释与预测:建立分类模型,对新样本进行细胞类型预测和注释。

7)高级分析:包括DNARanges、TransferData、CellCycleScoring等,实现更加深入的分析。

8)与其他包无缝集成:seurat可以与scran、scater、scTSS、Signac等包无缝集成,实现更加强大和全面的分析。

除此之外,seurat还在不断更新,推出更多实用功能,以满足研究人员的分析需求。它已经成为单细胞分析领域的基石型包,值得每个人精通与运用。

第1.3节 如何安装seurat包

要安装seurat包,需要首先安装R语言。然后在R控制台中输入以下命令:

> install.packages("seurat")

这将使用CRAN仓库安装seurat的最新版本。

如果需要安装开发版本,可以从GitHub安装:

> devtools::install_github("satijalab/seurat")

seurat还依赖一些其他包,安装过程中会自动安装依赖包。如果安装过程中报错,很有可能是缺少依赖包而导致的。可以在未来进行补充安装:

> install.packages(c("Matrix", "graphics", "ggplot2", "dplyr", "reshape2", "leiden", "Rcpp"))

seurat支持macOS、Windows、Linux等主流操作系统。但由于Windows环境下编译依赖包的难度较大,安装过程中更容易报错。如果在Windows下无法解决安装错误,可以考虑安装RStudio Desktop或使用Linux子系统。

安装完成后,就可以在R中加载seurat包,开始单细胞数据的探索之旅!

第1.4节 seurat包版本更新日志

seurat是活跃开发的R包,会不断推出新的版本。每个版本都会修复已知bug,优化现有功能,并添加新特性。要访问最新功能,需要及时更新seurat包。

可以在seurat GitHub仓库的Release页面查看详细的版本更新日志。以3.1.4版本为例:

  • Fixed a bug that prevented DimPlot from correctly ordering cells when reduction = “umap”

  • Fixed a bug in the default print method for SeuratAssays objects

  • Added getSparsity() function to calculate sparsity metrics for a Seurat assay

  • Added name checking in SelectFeatrues and related functions

  • ……

通读更新日志可以了解每个版本修复的bug、修改的函数和新增的功能特性。这对学习seurat包和利用新功能非常有帮助。

当seurat推出新版本后,可以使用R命令install.packages(“seurat”)或devtools::install_github(“satijalab/seurat”)安装更新。

安装新版本将覆盖原有版本,无需额外操作。由于新版本的推出速度较快,如果长时间未更新,升级后运行的代码可能会报错,需要根据更新日志进行相应修改。

第2章初识seurat对象,读入与访问数据

第2.1节 seurat对象的基本元素

一个Seurat对象包含以下基本要素:

1. assays:存储表达矩阵和其他生物学数据。例如,默认的exprs矩阵存储基因表达数值。

2. pca:保存主成分PCA结果,用于降维和可视化。

3. pcs. lui:保存LUI scores,实现局部可集聚降维。

4. tmap: TSNE或UMAP结果,用于二维空间的可视化。

5. graph: 记录细胞之间的相似性或连接,用于聚类。

6. meta:包含样本元数据,如 pretty_names、nUMI、percent.mt等。

7. reducers:记录其他的选择性降维方式,如LLE、Isomap等。

8. markers:存储callingcard分析的结果。

9. spatial:用于定位样品中的空间检测工具结果。

10. clusters:存储FindClusters()等函数生成的聚类标签。

11. scale.data:标准化或归一化表达矩阵的缩放因子,用于逆转缩放。

12. data.info:记录原始数据集的信息,如矩阵行列数、 Kuramoto主要聚类数等。

13. reduction:记录降维技术的名称,如”pca”、“tsne”、“umap”等。

14. genes:存储选择进行下游分析的基因或特征的名称。

15. min.genes:记录 FindClusters()等函数聚类时确定的最低基因表达检测阈值。

16. tmp.*:存储中间结果,以”tmp.”开头。例如 FindAllMarkers()的中间输出tmp.markers。

17. features:选定特征的详细信息,如ChooseAssayFeature()输出。

18. scale.factors:存储执行ScaleData()的缩放系数。

19. embeddings:存储执行Embeddings()后的坐标。

20. cell.names:存储细胞名称,默认为空。

21. project.name:存储项目名称,默认为”seurat”。

22. misc:存储其他结果,如feature.loadings()的输出。

23. @ backingfile:存储Seurat对象构建过程中使用的R数据文件。

24. ident:存储FindClusters等函数生成的聚类标签名称,如”Cluster 1”、“Cluster 2”等。

......

除此之外,Seurat对象动态添加新功能产生的结果,这使得对象变得非常丰富和强大。熟练理解和运用各个要素,是掌握seurat的关键所在。

第2.2节 从CSV、RDS等文件读入数据

seurat支持从多种格式读入单细胞数据,主要包括:

1.最常用的方式: 从包含matrix.mtx,barcodes.tsv,genes.tsv三个文件的文件夹读取数据

> data <- Read10X(data.dir = "hg19/")
> sobj <- CreateSeuratObject(data,project = "pbmc3k", min.cells = 3, min.features = 200)
> #批量读取文件夹可采用以下方式
> #1.获取当前目录下以1或2结尾的所有文件夹名
> folders = list.files('./', pattern = '[12]$')
> #2.批量读取data
> dataList = lapply(folders, function(folder) {
+   CreateSeuratObject(counts = Read10X(folder), project = folder)
+ })
> #3.合并所有data,将多个Seurat对象合并成一个大的Seurat对象
> data.big <- merge(dataList[[1]], 
+                  y = c(dataList[[2]],dataList[[3]],dataList[[4]],dataList[[5]],
+                        dataList[[6]],dataList[[7]],dataList[[8]]), 
+                  add.cell.ids = folders, 
+                  project = "DCM")
> #4.可以使用 table() 函数统计 data.big 中 orig.ident 列的不同取值的个数
> table(data.big$orig.ident)

2. CSV:逗号分隔值文件,使用read.csv()读入。

data <- read.csv("data.csv")

3. RDS:R数据序列化文件,使用readRDS()读入。

data <- readRDS("data.rds")

4. mtx:矩阵市场交换文件,使用Read10X()读入10x Genomics数据。

data <- Read10X("path/to/data/")

5. loom:Loom格式文件,使用ReadLoom()读入。

data <- ReadLoom("data.loom")  

6. hdf5:HDF5格式文件,使用Read10X_h5()读入。

data <- Read10X_h5("path/to/data.h5")

7. anndata:用anndata包读入后转为Seurat,使用ImportData()。

data <- anndata::read_h5ad("data.h5ad")
sobj <- Seurat::ImportData(data)

除此之外,seurat还支持从其他数据集格式进行转化和导入。多种格式支持使得seurat可以处理各种常见的单细胞数据。

导入数据后,得到的对象(如data)中包含表达矩阵以及样本元数据。我们可以查看数据维度和头几行,判断是否导入成功。下一步就可以创建Seurat对象开始分析了。

第2.3节 创建seurat对象

从数据文件导入数据后,需要将其封装在Seurat对象中,才能使用seurat提供的各种分析功能。在seurat中,我们使用Seurat对象存储和表示单细胞数据。要创建一个Seurat对象,可以使用CreateSeuratObject()函数:

> library(tidyverse)
> library(Seurat)
> library(patchwork)
> data <- Read10X(data.dir = "hg19/")  #读入数据
> sobj <- CreateSeuratObject(data)
## Warning: Feature names cannot have underscores ('_'), replacing with dashes
## ('-')

该函数需要输入 scRNA-seq数据,支持矩阵(matrix)、CSV、RDS等多种格式。创建成功后,sobj将是一个Seurat对象,存储原始数据并具有分析功能。

Seurat对象保存了样本的特征基因/代谢物表达矩阵,以及用于后续分析的诸多中间结果。这使得分析过程中的任何一步都可以回顾、审视或重新运行。事实上,Seurat对象可视为一个完整的单细胞学习环境。

该函数将导入的数据(如data)转化为Seurat对象sobj。要成功创建对象,data必须包含:

1. 数据矩阵: 表达值矩阵,行为基因/特征,列表为细胞。

2. 细胞名称: 行名为细胞的唯一ID。

3. sample.id:(可选) 记录样本唯一ID。

4. genes:(可选) 基因或特征名称。

除了必要的数据元素外,也可以提供单细胞测序平台或提取方法等元数据。CreateSeuratObject()会将所有信息整合,创建一个功能完备的Seurat对象进行下游分析。

第2.4节 访问和修改seurat对象

创建Seurat对象后,我们可以使用各个要素访问原始数据和添加的元数据,

> exprs_matrix <-GetAssayData(sobj, slot = "counts") #访问表达矩阵
> rownames(exprs_matrix)      #访问基因名称
> sobj@meta.data     #访问元数据

这使分析过程中的每一步都处于可控状态,方便调试和跟踪。

我们可以使用”$“访问Seurat对象的各个要素,例如:

> sobj$pca  
> sobj$tSNE 
> sobj$meta  

此外,也可以使用Aliased Shortcut方式访问,如:

> pca(sobj)  
> tsne(sobj)

要修改Seurat对象,也有多种方式:

1.直接覆盖要素:sobj$pca <- new_pca

2.使用Alter标志进行更新:sobj[[“pca”]] <- Alter(sobj[[“pca”]], new_pca)

3.使用seurat内置函数进行更新:PCA(sobj, new_pca)

4.重新运行命令来覆盖结果:RunPCA(sobj)

这使我们可以轻松对Seurat对象内的任意一步进行重新分析,而不用完全重新构建对象。

Seurat对象集成了单细胞数据分析的全部过程,熟练掌握创建、访问和修改Seurat对象的方法,是使用seurat包的基础。要深入理解Seurat对象,需要耐心学习并逐步掌握其中的各个要素与功能。

第3章数据预处理

第3.1节 质量控制与可视化

seurat v4提供丰富的QC度量和可视化功能,可以深入了解样本和数据质量。可视化工具包括DimPlot,FeatureScatter,VlnPlot。主要的QC可视化PLOT有:

1. FeatureScatter:绘制特征-特征散点图,视觉检查相关性。

> sobj <- PercentageFeatureSet(sobj, pattern = "^MT-", col.name = "percent.mito")
> FeatureScatter(sobj, feature1 = "nFeature_RNA", feature2 = "nCount_RNA")

> FeatureScatter(sobj, feature1 = "nCount_RNA", feature2 = "percent.mito")

2. VlnPlot:绘制特征的小提琴图,检查分布。

> VlnPlot(sobj, c("nFeature_RNA", "nCount_RNA", "percent.mito"))

3. RidgelinePlot:绘制特征的脊线图,检查密度和分布。

> RidgePlot(sobj, c("nCount_RNA", "percent.mito"))
## Picking joint bandwidth of 139
## Picking joint bandwidth of 0.153

这些可视化工具可以让我们直观判断数据和细胞的质量,识别异常值和缺失值,进而指导过滤和预处理的方案。熟练运用QC可视化工具是seurat v4高级用户的必备技能。

第3.2节过滤低质量细胞

过滤低质量和异常细胞对单细胞数据的分析至关重要。

以下代码保留了基因数大于200的细胞,并保留了线粒体基因百分比小于5%的细胞

> sobj <- subset(sobj,  subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mito < 5)

也可以使用多个条件过滤细胞:

> min_genes <- 200
> max_genes <- 6000
> min_UMI_count <- 1000
> max_UMI_count <- 50000
> max_mito_pct <- 5
> 
> sobj <- subset(sobj, subset = nFeature_RNA >= min_genes & nFeature_RNA <= max_genes & nCount_RNA >= min_UMI_count & nCount_RNA <= max_UMI_count & percent.mito <= max_mito_pct)

适当的过滤可以最大限度地去除低质量和异常细胞,这是后续分析的重要一步。

第3.3节 识别multiplet细胞

在单细胞RNA测序分析过程中,识别并处理multiplet细胞(多个细胞被错误地捕获并一起测序)是关键的一步。multiplet细胞会导致数据中出现技术偏差,可能会影响分析结果的准确性和可靠性。在本节中,我们将讨论识别multiplet细胞的重要性、常用方法和实际应用。

3.3.1 multiplet细胞的影响

multiplet细胞在单细胞RNA测序数据中引入了噪声,可能导致以下问题:

1.影响细胞聚类:multiplet细胞的表达谱是多个细胞表达谱的混合,可能导致错误的聚类结果。

2.错误的生物学解释:由于multiplet细胞的表达谱不是单个细胞的真实表达谱,它们可能导致错误的生物学解释和结论。

3.降低后续分析的准确性:multiplet细胞的存在可能影响差异表达分析、轨迹推断和其他分析步骤的准确性。

3.3.2 识别multiplet细胞的方法

多种方法可用于识别multiplet细胞,以下是一些常用方法:

1.基于表达谱的方法:通过比较不同细胞之间的基因表达模式,可以识别具有异常表达谱的细胞。这些异常表达谱可能暗示着它们是multiplet细胞。例如,使用主成分分析(PCA)或t分布邻域嵌入(t-SNE)等降维方法,可以在低维空间中观察到multiplet细胞聚集在多个细胞类别之间的边界区域。

2.使用有标签数据:在某些情况下,可以通过有标签数据来识别multiplet细胞。例如,使用单细胞哈希(Cell Hashing)技术,可以通过标记特定细胞并在测序过程中检测这些标签来识别multiplet细胞。

3.使用第三方工具:许多第三方工具可以用于识别multiplet细胞,如DoubletFinder、Scrublet和DoubletDecon等。这些工具通常通过比较细胞之间的相似性或预测潜在的multiplet细胞来工作。

3.3.3 实际应用

在实际分析中,可以使用以下步骤来识别并处理multiplet细胞:

1.数据预处理:在分析单细胞数据之前,首先进行基本的数据预处理,如过滤低质量细胞、标准化、归一化和log变换等。

2.选择合适的方法:根据数据类型和实验设计,选择最适合的方法来识别multiplet细胞。这可能包括基于表达谱的方法、使用有标签数据或利用第三方工具。

3.应用所选方法:将所选方法应用于预处理后的数据,以识别潜在的multiplet细胞。确保仔细检查识别出的细胞,并评估它们是否可能是真正的multiplet细胞。

4.移除multiplet细胞:在识别出multiplet细胞后,将它们从数据中移除。这将有助于提高后续分析的准确性和可靠性。

5.重新分析数据:在移除multiplet细胞后,重新分析数据以获得更准确的结果。这可能包括重新进行细胞聚类、差异表达分析和轨迹推断等。

总之,在单细胞RNA测序分析过程中,识别并处理multiplet细胞是关键的一步,有助于提高分析结果的准确性和可靠性。在实际应用中,研究人员需要根据自己的数据类型和实验设计,选择并应用合适的方法来识别multiplet细胞。

综合使用多个方法可以更加准确识别Multiplet,获得高质量的单细胞数据用于后续研究。Multiplet的识别与过滤是单细胞分析比较难度较大的一块,需要不断实践与总结。

第3.4节 标准化、归一化和log变换

单细胞RNA测序数据往往需要进行预处理,以消除技术效应和批效应,获得更加可比较的表达值。

常用的预处理方法包括:

1. 标准化:使表达值在相同尺度上进行比较。seurat提供ScaleData()进行标准化。

> all.genes <- rownames(sobj)
> sobj <- ScaleData(sobj, features = all.genes)
## Centering and scaling data matrix

2. 归一化:使reads数量在所有细胞之间相同或处于相似范围。seurat提供NormalizeData()进行归一化。 NormalizeData() 默认方式是 LogNormalize,其他方法有CLR,RC。LogNormalize的做法是,每个细胞,每个基因的count除以该细胞的总counts,乘以scale.factor(默认是10000,就好像所有单细胞总共有10k UMI),并对获得的值进行log1p转换,进行自然对数转换。归一化的数据存储在”RNA”assay的seurat_obj[[‘RNA’]]@data中

> sobj <- NormalizeData(sobj) 

这2种预处理可以单独使用,也可以结合使用。具体选择取决于数据的质量与方差。预处理后,可以使用预处理前的表达矩阵数据sobj$data与sobj$scale.data对比,选择最佳的预处理方案。

3.高变异基因的选择

> sobj <- FindVariableFeatures(sobj, selection.method = "vst", nfeatures = 2000)
> gc()  #释放内存
> top10 <- head(VariableFeatures(sobj), 10)
> plot1 <- VariableFeaturePlot(sobj)
> LabelPoints(plot = plot1, points = top10, repel = TRUE)
## When using repel, set xnudge and ynudge to 0 for optimal results
## Warning: Transformation introduced infinite values in continuous x-axis

##             used  (Mb) gc trigger   (Mb)  max used   (Mb)
## Ncells   3479891 185.9    6388828  341.3   6388828  341.3
## Vcells 102905979 785.2  335896301 2562.7 326150178 2488.4

4.也可以使用sctransform包进行标准化处理,单个命令将替换NormalizeData、ScaleData和FindVariableFeatures。

> 
> sobj <- SCTransform(sobj, vars.to.regress = "percent.mito", verbose = FALSE, conserve.memory=TRUE)
> gc()  #释放内存
> #> sobj <- SCTransform(sobj, vars.to.regress = "percent.mito", verbose = FALSE, conserve.memory=TRUE)
> #Will not return corrected UMI because residual type is not set to 'pearson'

这个警告信息并不会影响到SCTransform函数的执行。实际上,即使不返回校正后的UMI值,您仍然可以继续进行后续的单细胞分析流程。这个警告信息是为了让您了解到,在使用非Pearson残差方法时,SCTransform不会返回校正后的UMI值。

预处理使表达值在不同样本之间具有可比性,这是进行下游分析的前提。选择适当的预处理方法可以最大限度地消除技术差异,获得真实的生物学信号。但过度预处理也会造成信息损失,需谨慎操作。

第4章 集群分析

4.1 主成分分析(PCA)

PCA是一种无监督的线性降维方法,通过正交变换将高维数据映射到低维空间,最大限度地保留数据的方差。使用RunPCA()在seurat中运行PCA:

> sobj <- RunPCA(sobj, features = VariableFeatures(object = sobj))
## PC_ 1 
## Positive:  FTL, FTH1, CST3, AIF1, FCER1G, S100A4, TYROBP, COTL1, LGALS1, S100A6 
##     OAZ1, LST1, ACTB, PSAP, SAT1, S100A11, TYMP, TMSB4X, CTSS, SERPINA1 
##     SPI1, LYZ, IFITM3, FCN1, CFD, RP11-290F20.3, TIMP1, HLA-DRB1, CFP, HLA-DPA1 
## Negative:  MALAT1, IL32, LTB, IL7R, CCL5, CTSW, GZMA, NKG7, CD247, CD2 
##     GZMK, CST7, ACAP1, GZMH, HOPX, LINC00926, BEX2, FGFBP2, TCL1A, GNLY 
##     NCR3, MYC, STK17A, AQP3, SAMD3, SLC2A3, SPON2, ZAP70, PRF1, MS4A1 
## PC_ 2 
## Positive:  B2M, NKG7, GZMA, CTSW, GNLY, PRF1, FGFBP2, CCL5, SPON2, GZMB 
##     CST7, AKR1C3, GZMH, MALAT1, CLIC3, FCGR3A, HOPX, CD247, IL32, XCL2 
##     ACTB, TMSB4X, IFITM2, CTSC, UBB, XCL1, CCL4, TTC38, TUBA1B, ARPC5L 
## Negative:  S100A8, S100A9, LYZ, CD14, LGALS2, FCN1, MS4A6A, RBP7, FTL, GSTP1 
##     S100A12, TYROBP, S100A6, TYMP, CST3, FOLR3, ID1, FCGR1A, LGALS3, IL8 
##     ASGR1, PLBD1, RETN, LGALS1, ALDH2, FCGRT, CFP, APOBEC3A, NCF2, MNDA 
## PC_ 3 
## Positive:  B2M, NKG7, GZMA, CD74, GNLY, PRF1, HLA-DPB1, HLA-DPA1, CTSW, HLA-DRA 
##     MALAT1, FGFBP2, SPON2, HLA-DQA1, HLA-DRB1, GZMB, HLA-DQB1, CST7, HLA-DQA2, HLA-DRB5 
##     CLIC3, PLAC8, AKR1C3, GZMH, HOPX, UBB, CD1C, CD247, XCL2, VIM 
## Negative:  PPBP, GNG11, SPARC, PF4, AP001189.4, ITGA2B, CD9, SDPR, CLU, GP9 
##     TREML1, NRGN, LY6G6F, CMTM5, TUBB1, RGS18, F13A1, RP11-367G6.3, GP1BA, C6orf25 
##     GPX1, CA2, SCGB1C1, RUFY1, CLDN5, SEPT5, CLEC1B, ITGB3, HIST1H2AC, HGD 
## PC_ 4 
## Positive:  CD74, HLA-DQA1, HLA-DQB1, HLA-DQA2, HLA-DRA, HLA-DPB1, HLA-DRB1, HLA-DPA1, HLA-DRB5, CD1C 
##     CD79A, MS4A1, HLA-DMB, CD79B, HLA-DMA, LINC00926, CLEC10A, TCL1A, FCER1A, PLD4 
##     ITM2C, PPP1R14A, IRF8, LTB, SERPINF1, BLNK, P2RX5, MZB1, TNFRSF13B, TUBA1B 
## Negative:  FCGR3A, NKG7, FTL, S100A4, RP11-290F20.3, FCER1G, TYROBP, LST1, GZMA, AIF1 
##     S100A8, SERPINA1, S100A6, CFD, GNLY, FGFBP2, S100A9, SPON2, PRF1, MS4A7 
##     CTSS, CTSW, S100A11, FTH1, CST7, FCN1, PSAP, GZMH, IFITM2, HMOX1 
## PC_ 5 
## Positive:  LYZ, NKG7, S100A9, S100A8, GNLY, GPX1, GZMA, CD14, SPON2, FGFBP2 
##     LGALS2, GZMB, PRF1, GSTP1, CTSW, CST7, AKR1C3, CLIC3, CCL3, GZMH 
##     XCL2, MS4A6A, CCL5, CCL4, ID1, FCN1, HOPX, XCL1, TTC38, IGFBP7 
## Negative:  FCGR3A, MALAT1, RP11-290F20.3, MS4A7, LTB, IFITM2, CKB, LST1, HMOX1, SIGLEC10 
##     AIF1, TIMP1, TMSB4X, IL7R, SERPINA1, COTL1, FCER1G, VMO1, MT-CO2, PPM1N 
##     CYTIP, CD79B, CEBPB, FAM110A, IFITM3, CTD-2006K23.1, GSTA4, LYN, B2M, PTGES3
> VizDimLoadings(sobj, dims = 1:2, reduction = "pca")

> DimPlot(sobj, reduction = "pca")

> DimHeatmap(sobj, dims = 1, cells = 500, balanced = TRUE)

> DimHeatmap(sobj, dims = 1:15, cells = 500, balanced = TRUE)

> print(sobj[["pca"]], dims = 1:5, nfeatures = 5)
## PC_ 1 
## Positive:  FTL, FTH1, CST3, AIF1, FCER1G 
## Negative:  MALAT1, IL32, LTB, IL7R, CCL5 
## PC_ 2 
## Positive:  B2M, NKG7, GZMA, CTSW, GNLY 
## Negative:  S100A8, S100A9, LYZ, CD14, LGALS2 
## PC_ 3 
## Positive:  B2M, NKG7, GZMA, CD74, GNLY 
## Negative:  PPBP, GNG11, SPARC, PF4, AP001189.4 
## PC_ 4 
## Positive:  CD74, HLA-DQA1, HLA-DQB1, HLA-DQA2, HLA-DRA 
## Negative:  FCGR3A, NKG7, FTL, S100A4, RP11-290F20.3 
## PC_ 5 
## Positive:  LYZ, NKG7, S100A9, S100A8, GNLY 
## Negative:  FCGR3A, MALAT1, RP11-290F20.3, MS4A7, LTB

DimPlot()绘制PCA图可视化降维结果:,reduction =“pca”指定绘制PCA图。可以查看样本在低维空间的分布,识别聚集模式与分隔。

PCA检验可通过ElbowPlot()选择主成分数;通过JackStrawPlot()检验PC的统计显著性。这些工具可以更科学合理地选择主成分,使其最大限度保留数据信息。

DimHeatmap():观察同一聚类内细胞间的距离heatmap。热点代表聚类核心,冷点可能被错误聚类。

4.2 tSNE t-stochastic neighbor embedding

tSNE是一种非线性降维方法,通过随机近邻嵌入保留局部数据结构,将高维数据映射到二维或三维。使用RunTSNE()在seurat中运行tSNE:

> sobj <- RunTSNE(sobj, dims = 1:30)   #使用前30个维度
> DimPlot(sobj, reduction = "tsne") 

DimPlot()绘制tSNE图,reduction = “tsne”指定绘制tSNE图。tSNE图可识别局部聚类模式,但全局结构可能失真。

4.3 UMAP Uniform Manifold Approximation and Projection

UMAP是一种非线性降维方法,结合全局和局部维度缩减技术,生成二维或三维布局。使用RunUMAP()在seurat中运行UMAP:

> sobj <- RunUMAP(sobj, dims = 1:30) #使用1-30维数据 
## Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
## To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
## This message will be shown once per session
## 20:37:46 UMAP embedding parameters a = 0.9922 b = 1.112
## 20:37:46 Read 2638 rows and found 30 numeric columns
## 20:37:46 Using Annoy for neighbor search, n_neighbors = 30
## 20:37:46 Building Annoy index with metric = cosine, n_trees = 50
## 0%   10   20   30   40   50   60   70   80   90   100%
## [----|----|----|----|----|----|----|----|----|----|
## **************************************************|
## 20:37:46 Writing NN index file to temp file C:\Users\Administrator\AppData\Local\Temp\RtmpeoxNlr\file55c16151050
## 20:37:46 Searching Annoy index using 1 thread, search_k = 3000
## 20:37:46 Annoy recall = 100%
## 20:37:47 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
## 20:37:47 Initializing from normalized Laplacian + noise (using irlba)
## 20:37:47 Commencing optimization for 500 epochs, with 117352 positive edges
## 20:38:04 Optimization finished
> DimPlot(sobj, reduction = "umap") 

DimPlot()绘制UMAP图,reduction = “umap”指定绘制UMAP图。UMAP可同时保留全局和局部结构,生成更连续更可信的低维布局,较tSNE有改进。

PCA,tSNE和UMAP是seurat中常用的降维和可视化方法。通过这些图可以识别样本间的聚集模式和群落结构,为后续的细胞注释和聚类分析提供依据。

理解这3种方法的原理,熟练掌握seurat中运行和绘图的工具,是单细胞数据分析的基本技能。

4.4 测试集群效果

选择合适的聚类分辨率和降维空间是确保聚类效果的关键。我们可以通过以下方法评估不同参数下的聚类效果.

Elbow plot:绘制聚类数与SSE的散点图,选择肘点处的聚类数。但仅当resolution在合适范围时有效。

JackStrawPlot()功能提供了一个可视化工具,用于将每个 PC 的 p 值分布与统一分布(虚线)进行比较。“重要”PC 将显示在虚线上方。 另一种启发式方法生成”肘部图

> # JackStrawPlot()功能提供了一个可视化工具,用于将每个 PC 的 p 值分布与统一分布(虚线)进行比较。"重要"PC 将显示在虚线上方。
> sobj <- JackStraw(sobj, num.replicate = 100)
> sobj <- ScoreJackStraw(sobj, dims = 1:20)
> JackStrawPlot(sobj, dims = 1:15)
## Warning: Removed 21941 rows containing missing values (`geom_point()`).

另一种启发式方法生成”肘部图”:[ElbowPlot()]根据每个(函数)解释的方差百分比对原则组件进行排名。在此示例中,我们可以观察到 PC9-10 周围的”肘部”,表明大多数真实信号在前 10 个 PC 中被捕获。

> 
> ElbowPlot(sobj)

4.5 FindClusters函数进行集群

在降维空间识别的样本聚集结构为细胞注释和聚类提供参考。FindClusters()函数用于在seurat对象上执行细胞聚类。

> sobj <- FindNeighbors(sobj, dims = 1:10)
## Computing nearest neighbor graph
## Computing SNN
> sobj <- FindClusters(sobj, resolution = 0.5)
> head(Idents(sobj), 5)
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
## 
## Number of nodes: 2638
## Number of edges: 90496
## 
## Running Louvain algorithm...
## Maximum modularity in 10 random starts: 0.8845
## Number of communities: 12
## Elapsed time: 0 seconds
## AAACATACAACCAC-1 AAACATTGAGCTAC-1 AAACATTGATCAGC-1 AAACCGTGCTTCCG-1 
##                4                3                7                5 
## AAACCGTGTATGCG-1 
##                4 
## Levels: 0 1 2 3 4 5 6 7 8 9 10 11

reduction指定在哪个降维空间进行聚类,resolution调整聚类分辨率,范围0-1,值越大聚类数越多。FindClusters()将在聚类标签”seurat_clusters”中返回聚类结果。使用DimPlot观察聚类结构:

> VizDimLoadings(sobj, dims = 1:2, reduction = "pca")

> DimPlot(sobj, reduction = "umap")

> DimPlot(sobj, reduction = "pca")

> DimPlot(sobj, reduction = "tsne") 

> DimPlot(sobj, split.by = "seurat_clusters")  

第5章 鉴定不同ially expressed features

5.1 FindMarkers函数

FindMarkers()函数用于在不同细胞类型或群落之间鉴定差异表达的特征(基因或蛋白)。该函数基于差异性检验(如Wilcoxon秩和检验),计算每个特征在相比群之间的差异性评分。然后选择评分最高的特征作为群间的差异标记物。

FindMarkers()函数的主要参数有:

1.ident.1和ident.2:需要进行差异分析的两个细胞类型或群落的ID。

2.min.pct:要考虑为差异特征的最小百分比。默认为25%,表示在ident.1或ident.2内至少25%的细胞需要表达该特征。

3.thresh.use:选择差异性检验方法,可选”wilcox”,“t”,“bimod”。默认为”wilcox”,采用Wilcoxon秩和检验。

4. min.diff:要考虑为差异特征的最小logfold change差异度。默认为0。

5. test.use:差异性评分方法,可选”roc”,“roc01”,“wilcox”,“t”。默认为”roc”,采用ROC曲线下的面积为评分。

主要输出结果有:

1.features:差异特征的ID名单。

2. scores:每个特征的差异性评分。

3. logfc:每个特征在两组之间的log2 fold change值。

4. p.value:每个特征对应的p值。

5. percent.1和percent.2:每个特征在ident.1和ident.2中的表达百分比。

FindMarkers()函数可以高效地在不同细胞类型或群落间鉴定差异表达特征,为理解不同细胞状态或机制下调控网络的变化提供了重要工具。然而,结果的准确性与稳定性依赖于数据质量,群落划分的准确性,以及参数的合适选择。

> library(tidyverse)
> cluster2.markers <- FindMarkers(sobj, ident.1 = 2, min.pct = 0.25)
> cluster5.markers <- FindMarkers(sobj, ident.1 = 5, ident.2 = c(0, 3), min.pct = 0.25)
> sobj.markers <- FindAllMarkers(sobj, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
## Calculating cluster 0
## Calculating cluster 1
## Calculating cluster 2
## Calculating cluster 3
## Calculating cluster 4
## Calculating cluster 5
## Calculating cluster 6
## Calculating cluster 7
## Calculating cluster 8
## Calculating cluster 9
## Calculating cluster 10
## Calculating cluster 11
> sobj.markers %>% group_by(cluster) %>% top_n(n = 2, wt = avg_log2FC)
> FeaturePlot(sobj, features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", "FCGR3A", "LYZ", "PPBP", 
+                                "CD8A"))

> top10 <- sobj.markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_log2FC)
> DoHeatmap(sobj, features = top10$gene) + NoLegend()

## # A tibble: 24 × 7
## # Groups:   cluster [12]
##        p_val avg_log2FC pct.1 pct.2 p_val_adj cluster gene    
##        <dbl>      <dbl> <dbl> <dbl>     <dbl> <fct>   <chr>   
##  1 1.85e- 86      1.31  0.746 0.301 6.05e- 82 0       IL7R    
##  2 6.28e- 41      1.10  0.35  0.113 2.06e- 36 0       AQP3    
##  3 2.93e-277      4.31  0.998 0.24  9.58e-273 1       S100A9  
##  4 5.95e-227      4.01  1     0.532 1.95e-222 1       LYZ     
##  5 1.41e- 37      1.05  0.422 0.158 4.60e- 33 2       CCR7    
##  6 2.54e- 13      0.847 0.388 0.238 8.33e-  9 2       LEPROTL1
##  7 0              4.29  0.933 0.042 0         3       CD79A   
##  8 9.48e-271      3.59  0.622 0.022 3.10e-266 3       TCL1A   
##  9 3.75e-200      2.84  0.936 0.208 1.23e-195 4       NKG7    
## 10 9.21e-190      3.12  0.915 0.232 3.02e-185 4       CCL5    
## # ℹ 14 more rows

5.2 绘制 volcano plot进行差异基因鉴定

Volcano plot是一种直观显示差异表达分析结果的图形方法。它同时考虑了每个特征的fold change值(效应量)和统计显著性(p值),从而鉴定同时具有较大效应量和高统计显著性的差异表达特征。

要绘制volcano plot,我们需要设置如下参数:

1. features: FindMarkers()输出的特征ID列表。

2. logfc: 每个特征的log2 fold change值。

3. p_val: 每个特征对应的p值。

4. p_cutoff: 考虑为差异特征的p值切offs,默认为0.05。

5. fc_cutoff: 考虑为差异特征的fold change阈值,默认为0。

主要代码如下:

> p_cutoff=0.05
> fc_cutoff=0
> ggplot(sobj.markers, aes(x=avg_log2FC, y=-log10(p_val))) + 
+   geom_point() +
+   xlab("log2 Fold Change") + ylab("-log10 p-value") +
+   ggtitle("Volcano Plot") +  
+   theme_bw()+
+   geom_vline(xintercept = c(-1, 1), linetype = "dashed", color = "blue", linewidth = 0.5) +
+   geom_hline(yintercept = 1.3, linetype = "dashed", color = "blue", linewidth = 0.5) 

这个代码将在一张散点图中同时显示每个特征的log2 fold change值(x轴)和-log10转换后的p值(y轴)。同时添加水平和垂直参考线表示选择阈值。并用颜色高亮同时满足fold change和p值阈值要求的差异特征。

Volcano plot可以将FindMarkers()结果直观显示,辅助我们选择具有较高效应量和显著统计差异的特征。选择适当的阈值cutoffs,我们可以在该图中鉴定关键的差异表达特征。