Seuart单细胞测序分析(根据Seuart官方教程步骤)

参考优快云博主“生信小白要知道”原文,以及Seuart官方教程。笔者鸣谢。

00 安装包与数据导入

数据集来自Seuart官方教程pbmc3k_filtered_gene_bc_matrices.tar.gz
该步骤主要是创建初始化的Seurat对象,作为单细胞测序数据集以及后续分析结果的容器。

安装及加载所需要的包

# 安装Seurat包
BiocManager::install("Seurat")  
# 加载所需的包
library(dplyr)
library(Seurat)
library(patchwork)

数据导入与创建对象

数据读取

pbmc.data <- Read10X(data.dir = "D:/生信/PBMC3Kdata")  # 读取10x Genomics数据,解压后的原文件为matrix.mtx、features.tsv、barcodes.tsv,都在PBMC3Kdata文件夹下

pbmc.data 是一个稀疏矩阵(dgCMatrix),形状为 基因数(行数) × 细胞数(列数), 矩阵中的值表示的是在每个细胞(列)中检测到的每个特征(即基因,行)的分子数。

质量控制及对象初始化

创建一个Seuart的对象(pbmc) ,用于储存单细胞数据集的数据及后续的分析结果。

pbmc <- CreateSeuratObject(
  counts = pbmc.data,          # 原始计数矩阵
  project = "pbmc",            # 项目名称
  min.cells = 3,               # 仅保留在至少3个细胞中表达的基因
  min.features = 200           # 仅保留检测到至少200个基因的细胞
  )
  • min.cell用于过滤低检测率的基因。极少数细胞中表达的基因可能是技术噪声或测序错误,过滤后可减少数据维度并提高分析稳定性。
  • min.features用于过滤质量不佳的细胞,表达基因过少的细胞可能是空滴(不含细胞的液滴)或 低质量细胞(RNA 降解严重),保留高质量细胞可避免干扰后续分析。

查看Seuart的对象(pbmc)

> pbmc  # 查看对象摘要
An object of class Seurat 
13714 features across 2700 samples within 1 assay 
Active assay: RNA (13714 features, 0 variable features)
1 layer present: counts

! 关键信息总结

  • 过滤后保留 13714 个基因 和 2700 个细胞。
  • 当前活跃分析是 RNA,未进行变量特征筛选(0 variable features)。

01 标准预处理工作流程(质控与过滤)

该步骤主要是进行质控及选择细胞进一步分析(常用质控指标nFeature_RNAnCount_RNApercent.mt)

  • nFeature_RNA:每个细胞中检测到的基因数量。低质量的细胞或空液滴通常含有很少的基因;细胞双胞体或多胞体可能表现出异常高的基因计数。
  • nCount_RNA:细胞内检测到的分子总数。即检测到的基因的总数量(一个基因可能会因为有多个转录本而被检测到多次),因此分子总数与基因数量密切相关。
  • percent.mt: 对应线粒体基因组的序列的百分比。低质量/濒死的细胞通常表现出广泛的线粒体污染(细胞膜通透性增加,线粒体 DNA 释放到细胞质中被检测到)。
# 使用PercentageFeatureSet函数计算线粒体QC指标
pbmc[['percent.mt']]<-PercentageFeatureSet(pbmc,pattern = "^MT-")

设置阈值

可利用violin.plotFeatureScatter对需质控的指标进行统计,作为后续设置阈值的参考。

  • violin.plot:查看质控指标数据分布特点。

小提琴形状

  • 中间的箱线图:显示中位数、四分位数范围。
  • 两侧的密度曲线:展示检测量的概率分布(越宽表示该区间的细胞越多)
  • 图上的散点: 一个散点代表一个细胞 ,代表单个细胞的测量值. 展示了数据在细胞群组中的离散程度,补充了密度曲线无法直接反映的细节
# 使用violin plot可视化  QC指标,并使用这些指标过滤细胞
VlnPlot(pbmc,features = c("nFeature_RNA","nCount_RNA","percent.mt"),ncol = 3)

小提琴图
图中单个点代表一个细胞。可见单个细胞内检测到的,绝大部分基因数低于2000且大于200、绝大部分RNA数处于2000~7000、绝大染色体基因比例低于5%。

  • FeatureScatter:查看任意两特征之间的相关性。
plot1<-FeatureScatter(pbmc,feature1 = "nCount_RNA",feature2 = "percent.mt")
plot2<-FeatureScatter(pbmc,feature1 = "nCount_RNA",feature2 = "nFeature_RNA")
plot1+plot2

相关性散点图
由图可见,单个细胞内检测到的RNA数目与染色体基因比例没有关系(相关性-0.13);单个细胞内检测到的RNA数目(测序深度)与基因数呈强正相关(0.95),即测序深度越深,检测到的基因数量越多。

开始过滤

可依据小提琴图和特征散点图结果选择过滤阈值。本文根据官方教程数据,过滤阈值如下

# 过滤基因数大于2500或少于200的细胞,过滤线粒体基因表达占总表达量>5%的细胞
pbmc<-subset(pbmc,subset=nFeature_RNA>200 & nFeature_RNA<2500 & percent.mt<5)

过滤完成

> # 查看过滤后的seurat数据
> pbmc 
An object of class Seurat 
13714 features across 2638 samples within 1 assay 
Active assay: RNA (13714 features, 0 variable features)
 1 layer present: counts

可见细胞数量降低到了2638个,基因数目不变。

02 数据标准化与特征选择

该步骤主要是对过滤后的数据进行标准化,主要目的是为了消除基因间表达水平的尺度差异,使不同基因在后续分析中具有可比性。

数据标准化

有LogNormalize和SCTransform两种方法,本文按照官方教程采用LogNormalize方法

  • 计算方法:
    Value:该基因在该细胞中的表达量
    LogNormalize

第一步:
计算每个细胞的总表达量:对于每个细胞,将该细胞中所有基因的表达计数相加,得到该细胞的总表达量。
第二步:
计算缩放后的表达量:将每个细胞中每个基因的表达计数除以该细胞的总表达量,然后乘以一个缩放因子(由 scale.factor 参数指定),得到缩放后的表达量。
第三步:
取对数变换:对缩放后的表达量取自然对数(加 1 以避免对 0 取对数),得到最终的标准化表达量。对数变换可以使数据更加符合正态分布,同时压缩数据的动态范围,减少高表达基因对分析的影响。

  • 执行代码
# 数据规范化
pbmc<-NormalizeData(pbmc,normalization.method = "LogNormalize",scale.factor = 10000)

scale.factor = 10000
scale.factor 参数用于指定缩放因子。在 “LogNormalize” 方法中,将每个细胞中每个基因的表达计数除以该细胞的总表达量后,会乘以这个缩放因子。这里设置为 10000,意味着将每个细胞的基因表达量缩放为每 10000 个测序读段的表达量,这样可以使不同细胞之间的基因表达量具有统一的尺度。

特征选择(鉴定高可变基因)

使用高变基因进行主成分分析,是因为高变基因在细胞间的表达差异较大,能够更好地反映细胞的异质性,从而提高主成分分析的效果。

# 识别高度可变的特征(特征选择)
pbmc<-FindVariableFeatures(pbmc,selection.method = "vst",nfeatures = 2000)

默认返回数据集前2000个基因用于下游分析,以节省内存

> # 确定高表达的前十个基因
> top10<-head(VariableFeatures(pbmc),10)
> plot1<-VariableFeaturePlot(pbmc)
> plot2<-LabelPoints(plot = plot1,points = top10,repel = TRUE)
When using repel, set xnudge and ynudge to 0 for optimal results
> plot1+plot2

高变基因火山图
如图,红色部分代表细胞间高变基因,横轴为其在不同细胞间的平均表达量,纵轴为其在不同细胞间表达水平的标准差。图2中标注出了top10的高变基因名称。

03 数据缩放与降维

数据缩放(数据中心化)

在计算完高可变基因后,需要对数据集进行一个线性转换(缩放)。
这个步骤是降维(如PCA)数据处理之前的一个标准的预处理过程,由ScaleData()这个函数执行。

ScaleData()

  • 调整每个基因的表达量,使得细胞间的平均表达量为0
  • 缩放每个基因的表达量,使得细胞间的方差为1
  • 目的:这一步骤赋予每个基因在下游分析中同样的权重,不至于使高表达基因占据主导地位
  • 结果存储在pbmc[[“RNA”]]$scale.data中
# 以Seurat对象的行名(所有基因)抓取出来
all.genes <- rownames(pbmc)
# 以基因为单位对矩阵数据进行缩放
pbmc <- ScaleData(pbmc, features = all.genes)

概括起来讲,scale的作用是使数据具有一个统一的尺度,这并不会影响每个点的相对位置,只是使他们的表达量尺度统一起来。是PCA分析的必要步骤。

数据降维

PCA线性降维

PCA 本质上是一种无监督的线性降维技术,其核心目标是把高维数据转换为低维表示(符合单细胞数据高维稀疏的特点),同时尽可能多地保留原始数据中的信息。具体做法是通过找到数据的协方差矩阵的特征向量和特征值,其中特征向量就是主成分的方向,特征值表示对应主成分所解释的方差大小。
在进行 PCA 时,它会构建一系列相互正交(即彼此独立)的主成分。第一个主成分会沿着数据方差最大的方向,它能解释原始数据中最多的变异信息;第二个主成分则与第一个主成分正交,并且沿着剩余方差最大的方向,解释剩余变异中最多的部分,以此类推。所以,不同的主成分代表了数据中不同方向上的变异模式(即细胞类型、状态、代谢通路等区别)。

 # 线性降维
 pbmc<-RunPCA(pbmc,features = VariableFeatures(object=pbmc))
PC_ 1 
Positive:  CST3, TYROBP, LST1, AIF1, FTL, FTH1, LYZ, FCN1, S100A9, TYMP 
	   FCER1G, CFD, LGALS1, S100A8, CTSS, LGALS2, SERPINA1, IFITM3, SPI1, CFP 
	   PSAP, IFI30, SAT1, COTL1, S100A11, NPC2, GRN, LGALS3, GSTP1, PYCARD 
Negative:  MALAT1, LTB, IL32, IL7R, CD2, B2M, ACAP1, CD27, STK17A, CTSW 
	   CD247, GIMAP5, AQP3, CCL5, SELL, TRAF3IP3, GZMA, MAL, CST7, ITM2A 
	   MYC, GIMAP7, HOPX, BEX2, LDLRAP1, GZMK, ETS1, ZAP70, TNFAIP8, RIC3 
PC_ 2 
Positive:  CD79A, MS4A1, TCL1A, HLA-DQA1, HLA-DQB1, HLA-DRA, LINC00926, CD79B, HLA-DRB1, CD74 
	   HLA-DMA, HLA-DPB1, HLA-DQA2, CD37, HLA-DRB5, HLA-DMB, HLA-DPA1, FCRLA, HVCN1, LTB 
	   BLNK, P2RX5, IGLL5, IRF8, SWAP70, ARHGAP24, FCGR2B, SMIM14, PPP1R14A, C16orf74 
Negative:  NKG7, PRF1, CST7, GZMB, GZMA, FGFBP2, CTSW, GNLY, B2M, SPON2 
	   CCL4, GZMH, FCGR3A, CCL5, CD247, XCL2, CLIC3, AKR1C3, SRGN, HOPX 
	   TTC38, APMAP, CTSC, S100A4, IGFBP7, ANXA1, ID2, IL32, XCL1, RHOC 
PC_ 3 
Positive:  HLA-DQA1, CD79A, CD79B, HLA-DQB1, HLA-DPB1, HLA-DPA1, CD74, MS4A1, HLA-DRB1, HLA-DRA 
	   HLA-DRB5, HLA-DQA2, TCL1A, LINC00926, HLA-DMB, HLA-DMA, CD37, HVCN1, FCRLA, IRF8 
	   PLAC8, BLNK, MALAT1, SMIM14, PLD4, P2RX5, IGLL5, LAT2, SWAP70, FCGR2B 
Negative:  PPBP, PF4, SDPR, SPARC, GNG11, NRGN, GP9, RGS18, TUBB1, CLU 
	   HIST1H2AC, AP001189.4, ITGA2B, CD9, TMEM40, PTCRA, CA2, ACRBP, MMD, TREML1 
	   NGFRAP1, F13A1, SEPT5, RUFY1, TSC22D1, MPP1, CMTM5, RP11-367G6.3, MYL9, GP1BA 
PC_ 4 
Positive:  HLA-DQA1, CD79B, CD79A, MS4A1, HLA-DQB1, CD74, HIST1H2AC, HLA-DPB1, PF4, SDPR 
	   TCL1A, HLA-DRB1, HLA-DPA1, HLA-DQA2, PPBP, HLA-DRA, LINC00926, GNG11, SPARC, HLA-DRB5 
	   GP9, AP001189.4, CA2, PTCRA, CD9, NRGN, RGS18, CLU, TUBB1, GZMB 
Negative:  VIM, IL7R, S100A6, IL32, S100A8, S100A4, GIMAP7, S100A10, S100A9, MAL 
	   AQP3, CD2, CD14, FYB, LGALS2, GIMAP4, ANXA1, CD27, FCN1, RBP7 
	   LYZ, S100A11, GIMAP5, MS4A6A, S100A12, FOLR3, TRABD2A, AIF1, IL8, IFI6 
PC_ 5 
Positive:  GZMB, NKG7, S100A8, FGFBP2, GNLY, CCL4, CST7, PRF1, GZMA, SPON2 
	   GZMH, S100A9, LGALS2, CCL3, CTSW, XCL2, CD14, CLIC3, S100A12, RBP7 
	   CCL5, MS4A6A, GSTP1, FOLR3, IGFBP7, TYROBP, TTC38, AKR1C3, XCL1, HOPX 
Negative:  LTB, IL7R, CKB, VIM, MS4A7, AQP3, CYTIP, RP11-290F20.3, SIGLEC10, HMOX1 
	   LILRB2, PTGES3, MAL, CD27, HN1, CD2, GDI2, CORO1B, ANXA5, TUBA1B 
	   FAM110A, ATP1A1, TRADD, PPA1, CCDC109B, ABRACL, CTD-2006K23.1, WARS, VMO1, FYB 
> print(pbmc[["pca"]],dims = 1:5,nfeatures = 5)
PC_ 1 
Positive:  CST3, TYROBP, LST1, AIF1, FTL 
Negative:  MALAT1, LTB, IL32, IL7R, CD2 
PC_ 2 
Positive:  CD79A, MS4A1, TCL1A, HLA-DQA1, HLA-DQB1 
Negative:  NKG7, PRF1, CST7, GZMB, GZMA 
PC_ 3 
Positive:  HLA-DQA1, CD79A, CD79B, HLA-DQB1, HLA-DPB1 
Negative:  PPBP, PF4, SDPR, SPARC, GNG11 
PC_ 4 
Positive:  HLA-DQA1, CD79B, CD79A, MS4A1, HLA-DQB1 
Negative:  VIM, IL7R, S100A6, IL32, S100A8 
PC_ 5 
Positive:  GZMB, NKG7, S100A8, FGFBP2, GNLY 
Negative:  LTB, IL7R, CKB, VIM, MS4A7 

降维结果分析

可对降维结果进行可视化分析,根据Seuart官方教程有VizDimReduce()DimPlot()DimHeatmap()

  • VizDimReduce()

此函数用于可视化主成分分析(PCA)中指定主成分的基因载荷。基因载荷表示每个基因对主成分的贡献程度,通过可视化基因载荷,可以了解哪些基因对特定主成分的影响较大。

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

VizDimLoadings
图1和图2分别展示了第一和第二个主成分中,不同基因对其的影响

  • DimPlot()

该函数用于绘制单细胞数据在指定降维空间中的散点图,通过散点图可以直观地看到细胞在降维空间中的分布情况,有助于发现细胞亚群的聚类结构。在散点图中,每个点代表一个单细胞,不同颜色或形状的点表示不同的细胞类型或状态。通过观察散点图,我们可以发现细胞之间的聚类模式、相似性和差异性,进而对细胞类型或状态进行分类和注释。此外,DimPlot函数还可以根据其他降维方法(如t-SNE和UMAP)进行可视化,以便于我们比较不同降维方法的效果。

DimPlot(pbmc,reduction = "pca")

DimPlot

  • DimHeatmap()

这个函数用于绘制指定主成分的基因表达热图,展示与特定主成分相关的基因在部分细胞中的表达情况。热图可以帮助我们直观地观察基因表达的模式和细胞之间的相似性。在热图中,每一列代表一个细胞,每一行代表一个基因或基因集,颜色的深浅表示该基因或基因集在该细胞中的表达水平。通过观察热图,我们可以发现不同基因或基因集之间的相关性、表达模式和差异性,进而对细胞类型或状态进行分类和注释。

黄 - 红(高值区强化暖色)

  • 紫色,黑色 → 低表达
  • 黄色 → 高表达
DimHeatmap(pbmc,dims = 1,cells = 500,balanced = TRUE)
DimHeatmap(pbmc,dims = 1:15,cells=500,balanced = TRUE)

DimHeatmap
第一个主成分的基因表达热图
DimHeatmap
前15个主成分的基因表达热图

确定后续分析所需维度

对单细胞 RNA 测序数据进行主成分分析(PCA)后的主成分显著性评估,根据Seuart官方可使用肘形图(ElbowPlot)或JackStraw图

肘形图(ElbowPlot)更为直观,但其实际也来自于JackStraw图

  • JackStrawPlot()
  • JackStraw() 函数:Seurat 包中用于执行 JackStraw 分析的函数。JackStraw 分析是一种用于评估主成分分析中每个主成分显著性的方法,通过随机重采样的方式来模拟随机背景分布,然后将真实的主成分与随机背景进行比较,从而判断每个主成分是否包含真实的生物学信号。
  • pbmc:是一个 Seurat 对象,包含了单细胞 RNA 测序数据以及之前进行主成分分析(PCA)后的结果。
  • num.replicate = 100:指定随机重采样的次数,这里设置为 100 次。在每次重采样过程中,会随机打乱基因表达数据,然后重新计算主成分,通过多次重采样可以得到一个随机背景下主成分的分布情况。
pbmc<-JackStraw(pbmc,num.replicate = 100)
pbmc<-ScoreJackStraw(pbmc,dims = 1:20)
JackStrawPlot(pbmc,dims = 1:15)

JackStrawPlot

  • ElbowPlot(pbmc)
  • ScoreJackStraw() 函数:Seurat 包中用于对 JackStraw 分析结果进行评分的函数。该函数会根据之前 JackStraw 重采样得到的随机背景分布,计算每个主成分的显著性得分(通常是 p 值),以判断该主成分是否显著。
  • pbmc:同样是包含 JackStraw 分析结果的 Seurat 对象。
  • dims = 1:20:指定要进行评分的主成分范围,这里表示对前 20 个主成分(PC1 - PC20)进行评分。通过评分可以筛选出那些具有显著生物学意义的主成分,用于后续的分析,如细胞聚类、差异表达分析等。
ElbowPlot(pbmc)

ElbowPlot
一般选择肘点附近(即本图中PC=10左右),作为数据集的PC值

来自优快云博主“生信小白要知道”的观点:
横坐标的PC是你接下来要选择分析的维度数,即多少组基因表达pattern。当选择一组的时候,即所有基因都在一个表达pattern里面(我们从生物学角度看也肯定是不可能的),我们很容易想到,所有细胞都在一个组内,肯定是存在很大差异的,所以方差值(方差=标准差(Standard Deviation)的平方)就会很大。当PC增多,即分组增多后,每个组内的差异也就慢慢变小了,方差值自然也就变小了。再往后,随着选的PC的增多,基本上区分不出来组内的差异了,这个时候方差基本就稳定了下来,此时在选取更大的PC值也就没有更大的意义了,并且还会增加计算压力。因此,个人认为关于PC选取的最合适原则是在拐点右侧3-5个维度即可(本数据拐点在7-8左右,我们选10刚刚好),宽松一点的话,可以设置在拐点右侧10以内。不过最重要的一点还是尽可能地多尝试,选取最适合自己的PC值,这一点也是官网教程所建议的。

04 细胞聚类与可视化

细胞聚类

  • FindNeighbors() 根据肘部图选择前10个PC成分作为输入(dims = 1:10)

FindNeighbors 是 Seurat 包中用于构建最近邻图和共享最近邻图的函数。其基于主成分分析(PCA)的结果,计算每个细胞在特征空间中的最近邻细胞,构建最近邻图和共享最近邻图(KNN),为后续的细胞聚类分析做准备。

# 建立KNN图,并基于其局部领域中的共享重叠细化任意两个单元之间的边权重
pbmc<-FindNeighbors(pbmc,dims = 1:10)
  • FindClusters()

Seurat应用模块化优化技术对细胞进行聚类,如Louvain算法(默认)或 SLM [SLM, Blondel et al., Journal of Statistical Mechanics],以迭代方式将单元分组在一起,以优化标准模块化函数。该函数通过 resolution 参数设置下游聚类的“粒度”,该值的增加会导致集群数量增加。将此参数设置在 0.4-1.2 之间通常对于大约 3K 细胞的单细胞数据集会返回良好的结果。对于较大的数据集,最佳分辨率通常会提高。

pbmc<-FindClusters(pbmc,resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 2638
Number of edges: 95927

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8728
Number of communities: 9
Elapsed time: 0 seconds
> head(Idents(pbmc),5)
AAACATACAACCAC-1 AAACATTGAGCTAC-1 AAACATTGATCAGC-1 AAACCGTGCTTCCG-1 
               2                3                2                1 
AAACCGTGTATGCG-1 
               6 
Levels: 0 1 2 3 4 5 6 7 8

关键参数

  • pbmc:输入的 Seurat 对象,需提前完成 PCA 降维(如RunPCA())。
  • resolution = 0.5:
    控制聚类的精细程度(值越大,聚类越多)
    典型范围:0.4-1.2(数据量越大,值可越高)。
  • 算法原理
    使用Louvain 算法优化模块度(Modularity),将相似细胞划分到同一簇。
    模块度:衡量网络(细胞 - 细胞相似性)中社区结构强度的指标,值越接近 1 表示聚类质量越好。

非线性降维(UMAP/tSNE)

Seurat 提供了几种非线性降维技术,例如 tSNE 和 UMAP,用于可视化和探索这些数据集。这些算法的目标是学习数据的基础流形,以便将相似的单元放在低维空间中。

步骤核心作用不可或缺的原因
PCA提取全局线性变异,降噪、降维,为后续分析提供低维 “干净” 数据高维原始数据无法直接输入 UMAP/tSNE(计算量太大、噪声干扰强)
UMAP/tSNE在低维空间中还原数据的非线性流形结构,用于可视化亚群聚类和分布PCA 无法捕捉局部非线性关系(如亚群间的精细边界),而这正是单细胞分析的核心目标

上面确定的基于图形的聚类中的细胞应该在这些降维图上共定位。作为 UMAP 和 tSNE 的输入,按照官网建议使用相同的 PC(即依旧是前10个主成分,dims = 1:10)作为聚类分析的输入。

  • UMAP
pbmc<-RunUMAP(pbmc,dims = 1:10)
DimPlot(pbmc,reduction = "umap")

在这里插入图片描述

  • tSNE
pbmc <- RunTSNE(pbmc, dims = 1:10)
DimPlot(pbmc, reduction = "tsne")

tsne

05 差异基因分析与注释

寻找差异表达基因

Seurat 可以找到通过差异表达定义簇的标记物。默认情况下,与所有其他细胞簇相比,它识别单个簇(在 ident.1中指定)的正标记和负标记。 FindAllMarkers()为所自动执行此过程,但也可以测试细胞簇彼此之间或所有细胞之间的对比。

计算所有簇的markers

  • Seurat教程仅设置了一个参数,就是only.pos,该参数的意思是只保留正标记(positive markers),也就是只保留相对于其他簇而言,目标簇显著高表达的基因标记。
  • FindAllMarkers() 函数:这是 Seurat 包中的一个函数,用于对 Seurat 对象 pbmc 中的所有细胞聚类进行差异表达分析,找出每个聚类的标记基因。
  • only.pos = TRUE:该参数指定只返回在特定聚类中高表达的基因,即正差异表达的基因,忽略那些在其他聚类中高表达的基因。
    -min.pct = 0.25:是一个过滤条件,要求目标基因至少在 25% 的当前聚类细胞或至少 25% 的其他聚类细胞中表达,才会被纳入差异表达分析,这样可以减少在极少数细胞中表达的基因对分析结果的干扰。
  • logfc.threshold = 0.25:表示只考虑平均对数 2 倍变化值大于 0.25 的基因,即该基因在当前聚类中的表达量至少是其他聚类的 2^0.25 倍,这有助于筛选出表达差异更显著的基因。
> # 找出每个细胞簇的标记物,与所有剩余的细胞进行比较,只报告阳性细胞 
> pbmc.markers<-FindAllMarkers(pbmc,only.pos = TRUE,min.pct = 0.25,logfc.threshold =0.25 )
Calculating cluster 0
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster 1
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 2
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster 3
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
Calculating cluster 4
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster 5
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=05s  
Calculating cluster 6
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 7
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=07s  
Calculating cluster 8
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
  • %>%:这是管道操作符,用于将前一个函数的输出作为后一个函数的输入,使代码更具可读性和简洁性。
  • group_by(cluster):按照 cluster 列对 pbmc.markers 数据框进行分组,即将数据按照不同的聚类进行划分。
  • slice_max(n = 2, order_by = avg_log2FC):对于每个分组(即每个聚类),按avg_log2FC 列的值进行降序排序,并选取前 2 行,也就是每个聚类中 avg_log2FC 最高的前 2 个基因。
> pbmc.markers %>%
+   group_by(cluster) %>%
+   slice_max(n=2,order_by = avg_log2FC)
# A tibble: 18 × 7
# Groups:   cluster [9]
       p_val avg_log2FC pct.1 pct.2 p_val_adj cluster gene         
       <dbl>      <dbl> <dbl> <dbl>     <dbl> <fct>   <chr>        
 1 9.57e- 88       2.40 0.447 0.108 1.31e- 83 0       CCR7         
 2 1.35e- 51       2.14 0.342 0.103 1.86e- 47 0       LEF1         
 3 7.07e-139       7.28 0.299 0.004 9.70e-135 1       FOLR3        
 4 3.38e-121       6.74 0.277 0.006 4.64e-117 1       S100A12      
 5 2.97e- 58       2.09 0.42  0.111 4.07e- 54 2       AQP3         
 6 5.03e- 34       1.87 0.263 0.07  6.90e- 30 2       CD40LG       
 7 2.40e-272       7.38 0.564 0.009 3.29e-268 3       LINC00926    
 8 2.75e-237       7.14 0.488 0.007 3.76e-233 3       VPREB3       
 9 7.25e-165       4.41 0.577 0.055 9.95e-161 4       GZMK         
10 3.27e- 88       3.74 0.419 0.061 4.48e- 84 4       GZMH         
11 8.23e-168       5.88 0.37  0.005 1.13e-163 5       CKB          
12 1.69e-212       5.43 0.506 0.01  2.32e-208 5       CDKN1C       
13 8.10e-179       6.22 0.471 0.013 1.11e-174 6       AKR1C3       
14 5.38e-112       6.07 0.29  0.007 7.38e-108 6       SH2D1B       
15 1.46e-207       8.03 0.5   0.002 2.00e-203 7       SERPINF1     
16 1.48e-220       7.63 0.812 0.011 2.03e-216 7       FCER1A       
17 0              14.4  0.615 0     0         8       LY6G6F       
18 7.32e-222      13.9  0.385 0     1.00e-217 8       RP11-879F14.2

计算特定簇的markers

计算单个簇对比其他所有簇的markers

 # 寻找cluster2的所有markers
> cluster2.markers<-FindMarkers(pbmc,ident.1 = 2,min.pct = 0.25)
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=06s  
 >head(cluster2.markers,n=5)
            p_val avg_log2FC pct.1 pct.2    p_val_adj
IL32 2.892340e-90  1.3070772 0.947 0.465 3.966555e-86
LTB  1.060121e-86  1.3312674 0.981 0.643 1.453850e-82
CD3D 8.794641e-71  1.0597620 0.922 0.432 1.206097e-66
IL7R 3.516098e-68  1.4377848 0.750 0.326 4.821977e-64
LDHB 1.642480e-67  0.9911924 0.954 0.614 2.252497e-63

计算某个簇对比其他特定簇的markers

> # 寻找cluster5中与cluster0和cluster3n不同的所有markers
> cluster5.markers<-FindMarkers(pbmc,ident.1 = 5,ident.2=c(0,3),min.pct = 0.25)
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=05s  
> head(cluster5.markers,n=5)
                      p_val avg_log2FC pct.1 pct.2     p_val_adj
FCGR3A        8.246578e-205   6.794969 0.975 0.040 1.130936e-200
IFITM3        1.677613e-195   6.192558 0.975 0.049 2.300678e-191
CFD           2.401156e-193   6.015172 0.938 0.038 3.292945e-189
CD68          2.900384e-191   5.530330 0.926 0.035 3.977587e-187
RP11-290F20.3 2.513244e-186   6.297999 0.840 0.017 3.446663e-182

基因表达可视化

Vlnplot(显示跨集群的表达概率分布)和FeaturePlot()(在tSNE或PCA图上可视化特征表达)是最常用的可视化

  • violinplot
  1. 横轴(X 轴)
    含义:通常代表细胞簇(Cluster),即之前通过 FindClusters() 函数得到的聚类结果。
    例如,横轴可能显示 0, 1, 2, … 或 B_cell, T_cell, Macrophage 等(取决于是否已注释细胞类型)。
  2. 纵轴(Y 轴)
    含义:基因的表达量(通常是标准化后的对数表达值,如 log2(TPM + 1))。
# 展示特定基因表达水平
VlnPlot(pbmc,features = c("MS4A1","CD79A"))

在这里插入图片描述
可见"MS4A1","CD79A"基因在不同细胞簇中的表达量分布,用于识别哪些簇是 B 细胞(高表达这两个基因的簇,即3号簇)。

# 可以绘制行数据
VlnPlot(pbmc,features = c("NKG7","PF4"),slot = "counts",log = TRUE)
  • slot = "counts"的特殊性:
    原始计数数据可能存在零膨胀(许多基因在多数细胞中不表达)。
    对数转换后,零值变为 log2 (0+1)=0,但高表达值被压缩,可能弱化差异。
    适用于展示绝对表达量差异,但需注意数据分布偏态。
    在这里插入图片描述
  • log 参数的影响(log参数用于控制是否对基因表达量进行对数转换)
    log = TRUE:压缩高表达值,突出低表达区域的差异(更常见)。
    log = FALSE:直接展示原始计数,但可能因数据偏态导致图形失真。

在这里插入图片描述
可见"NKG7","PF4"分别在不同细胞簇中的表达水平(NKG7 高表达 → NK 细胞或细胞毒性 T 细胞,即4号簇;PF4 高表达 → 血小板或巨核细胞,即8号簇)。

  • FeaturePlot()
# 多个特征图
FeaturePlot(pbmc,features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", "FCGR3A", "LYZ", "PPBP", "CD8A"))

在这里插入图片描述
展示features参数中的基因在UMAP细胞聚类中,不同表达水平细胞的具象化分布(单个点代表细胞,点的颜色深浅代表细胞中该基因的表达水平)

  • DoHeatmap()
#DoHeatmap()为给定的细胞和特征生成一个表达热图。在这种情况下,我们为每个集群绘制前 20 个标记(或所有标记,如果小于 20)。
pbmc.markers%>%
  group_by(cluster)%>%
  top_n(n=10,wt=avg_log2FC)->top10
DoHeatmap(pbmc,features = top10$gene)+NoLegend()
  • 横轴:细胞(按簇分组,如簇 0-8)。
  • 纵轴:基因(按簇分组,每个簇的 Top 10 基因)。

在这里插入图片描述

细胞簇命名

# 将细胞类型标识分配给集群
new.cluster.ids<-c("Naive CD4 T", "CD14+ Mono", "Memory CD4 T", "B", "CD8 T", "FCGR3A+ Mono",
                   "NK", "DC", "Platelet")
names(new.cluster.ids)<-levels(pbmc)
pbmc<-RenameIdents(pbmc,new.cluster.ids)
DimPlot(pbmc,reduction = "umap",label = TRUE,pt.size = 0.5)+NoLegend()
saveRDS(pbmc,file = "./pbmc3k_final.rds")

在这里插入图片描述

<think>好的,我现在需要帮助用户解决关于单细胞测序分析流程和代码实现的问题。首先,用户明确提到需要完整的流程和对应的Python、R代码,属于生物信息学领域。根据用户提供的引用内容,特别是引用[1]提到了Diffloop这个分析DNA环的工具,这可能与染色质结构分析相关,但用户的问题集中在单细胞测序,可能需要考虑不同的分析步骤。 首先,我应该回顾单细胞测序的标准流程。通常包括原始数据处理、质量控制、标准化、降维、聚类、细胞类型注释、差异表达分析步骤。需要确认每个步骤的常用工具和代码实现,尤其是Python和R的包。例如,R中的Seurat和Python中的Scanpy是常用的工具。 然后,用户可能希望得到具体的代码示例,比如数据读取、质量控制、PCA降维、t-SNE或UMAP可视化、聚类方法等。需要确保代码语法正确,并且符合用户提到的格式要求,比如行内公式用$...$,独立公式用$$...$$。 接下来,生成相关问题。需要覆盖流程中的关键步骤、工具比较、数据挑战、可视化方法、差异分析等。同时要检查是否有引用支持,比如引用[1]中的方法是否适用于某些分析步骤,但要注意用户提供的引用可能与单细胞分析不直接相关,可能需要调整引用位置或指出相关文献。 还要注意用户提到的引用格式,在回答中自然地添加引用标识。例如,在提到质量控制时,可以引用相关的方法论文,但需要确认用户提供的引用是否适用。用户提供的引用[1]是关于DNA环的分析,可能不直接适用于单细胞转录组,但或许在表观遗传学的单细胞分析中有相关应用,需要谨慎处理。 另外,用户可能对流程中的某些步骤有深入疑问,比如标准化方法的选择,或是聚类算法的参数调整。因此,生成的问题需要引导用户进一步探索这些方面。 最后,确保回答结构清晰,分步骤解释,并提供代码示例。同时检查LaTeX语法是否正确,例如在描述基因表达量时的公式是否正确使用$符号,如$log_{2}(counts+1)$。 总结步骤: 1. 概述单细胞分析流程的主要步骤。 2. 为每个步骤提供R和Python的代码示例。 3. 引用相关文献,合理使用用户提供的引用,可能需要补充其他文献。 4. 生成相关问题,覆盖流程细节、工具比较、挑战和应用。 5. 检查格式要求,确保公式正确,代码块使用正确语言标注。</think>### 单细胞测序分析流程与代码实现 单细胞测序分析通常包含以下核心步骤,以下是基于Python(Scanpy)和R(Seurat)的完整流程示例: --- #### **1. 数据预处理与质量控制** **目标**:过滤低质量细胞和噪声基因。 **代码实现**: ```R # R (Seurat) library(Seurat) sc_data <- Read10X("data_dir") sc_obj <- CreateSeuratObject(counts = sc_data, min.cells = 3, min.features = 200) sc_obj[["percent.mt"]] <- PercentageFeatureSet(sc_obj, pattern = "^MT-") sc_obj <- subset(sc_obj, subset = nFeature_RNA > 200 & percent.mt < 20) ``` ```python # Python (Scanpy) import scanpy as sc adata = sc.read_10x_mtx("data_dir") sc.pp.filter_cells(adata, min_genes=200) sc.pp.filter_genes(adata, min_cells=3) adata.var['mt'] = adata.var_names.str.startswith('MT-') sc.pp.calculate_qc_metrics(adata, qc_vars=['mt'], percent_top=None) adata = adata[adata.obs.n_genes_by_counts < 2500, :] ``` --- #### **2. 数据标准化与特征选择** **目标**:消除技术偏差并筛选高变基因。 **公式**:标准化常用$log_{2}(counts+1)$或负二项分布归一化[^1]。 **代码实现**: ```R # R (Seurat) sc_obj <- NormalizeData(sc_obj) sc_obj <- FindVariableFeatures(sc_obj, selection.method = "vst") ``` ```python # Python (Scanpy) sc.pp.normalize_total(adata, target_sum=1e4) sc.pp.log1p(adata) sc.pp.highly_variable_genes(adata, flavor='seurat') ``` --- #### **3. 降维与聚类** **目标**:通过PCA/t-SNE/UMAP降维并划分细胞亚群。 **代码实现**: ```R # R (Seurat) sc_obj <- ScaleData(sc_obj) sc_obj <- RunPCA(sc_obj) sc_obj <- FindNeighbors(sc_obj, dims=1:20) sc_obj <- FindClusters(sc_obj, resolution=0.5) sc_obj <- RunUMAP(sc_obj, dims=1:20) ``` ```python # Python (Scanpy) sc.pp.scale(adata) sc.tl.pca(adata) sc.pp.neighbors(adata, n_pcs=20) sc.tl.leiden(adata, resolution=0.5) sc.tl.umap(adata) ``` --- #### **4. 细胞类型注释与差异分析** **目标**:基于标记基因注释细胞类型并识别差异表达基因。 **代码实现**: ```R # R (Seurat) markers <- FindAllMarkers(sc_obj, only.pos=TRUE) sc_obj <- RenameIdents(sc_obj, '0' = 'T细胞', '1' = '
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值