在完成质控(QC)后,我们已经过滤掉了低质量细胞、双细胞和低表达基因,获得了较为干净的单细胞数据集单细胞分析教程 | (一)Python单细胞质控全流程。接下来,我们将进行以下关键步骤:
1. 数据标准化(Normalization):消除测序深度和细胞大小的影响。
2. 特征选择(Feature Selection):挑选高变基因以减少噪声。
3. 降维(Dimensionality Reduction):将高维数据投影到低维空间,便于可视化和分析。
4. 聚类(Clustering):将细胞分组以识别细胞类型。
5. 可视化(Visualization ):展示聚类结果。
通过这些步骤,我们可以从原始计数数据中提取生物学意义,为后续差异表达分析和功能注释打下基础。以下是详细流程和代码实现。
数据标准化(Normalization)
在进行后续内容之前,同样需要导包等操作,如下,不再进行详细介绍:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import scanpy as sc
import randomseed = 42
random.seed(seed)
np.random.seed(seed)adata = sc.read_h5ad("./qc_processed.h5ad")
单细胞数据的原始计数受到测序深度、细胞大小等技术因素的影响,因此需要标准化以确保细胞间表达值的可比性。常用的标准化方法是对计数进行归一化(通常按细胞总计数归一化到固定值,如10,000),然后进行对数化以稳定方差。
# 标准化:按总计数归一化到10,000
sc.pp.normalize_total(adata, target_sum=1e4)# 对数化:log1p变换
sc.pp.log1p(adata)# 保存标准化后的数据到adata.raw,用于后续差异表达分析
adata.raw = adataadata
注意:
-
normalize_total 将每个细胞的计数归一化为总和为10,000(可根据需要调整 target_sum)。
-
log1p 使用自然对数(log(x+1))变换数据,减少高表达基因的方差影响。
-
保存原始标准化数据到 adata.raw,以便后续分析(如差异表达基因计算)使用未进一步处理的数据。
在很多的代码中可能会看到sc.pp.scale,这一步操作的意义是为了改变数据的分布模式使每个基因的表达量均值为0,方差为1。做不做这一步主要取决于normalization以及log1p之后是否还存在超高表达的基因。
此外,需要注意的时候,后面的差异表达分析等操作,最好是使用normalization以及log1p之后的结果,所以这里才需要将数据保存一下,并且scale操作可以放在选择高变基因后再进行。
特征选择(Feature Selection)
单细胞数据通常包含数千到数万个基因,但并非所有基因都与生物学差异相关。选择高变基因(Highly Variable Genes, HVG)可以减少噪声,聚焦于生物学上重要的基因。
# 识别高变基因
sc.pp.highly_variable_genes(adata, min_mean=0.0125, max_mean=3, min_disp=0.5)# 可视化高变基因
sc.pl.highly_variable_genes(adata)# 过滤数据集,仅保留高变基因
adata = adata[:, adata.var.highly_variable].copy()
注意:
-
min_mean 和 max_mean 控制基因的平均表达量范围,min_disp 控制基因的分散度(variance/mean),这些参数需要根据数据分布调整。
-
高变基因通常占总基因数的10-20%(约2000-4000个基因),具体数量取决于数据集和实验设计。
-
可视化高变基因的散点图可以帮助确认参数设置是否合理,理想情况下高变基因应集中在高分散度区域。
降维
高维基因表达数据难以直接分析和可视化,因此需要降维。常用的方法包括主成分分析(PCA)和非线性降维(如t-SNE或UMAP)。我们先通过PCA提取主要特征,再使用UMAP进行可视化。
# 缩放数据(零均值、单位方差)
sc.pp.scale(adata, max_value=10)# 运行PCA
sc.tl.pca(adata, svd_solver='arpack')# 可视化PCA结果
sc.pl.pca(adata, color='n_counts', show=False)
sc.pl.pca_variance_ratio(adata, log=True)# 运行UMAP
sc.pp.neighbors(adata, n_neighbors=10, n_pcs=40)
sc.tl.umap(adata)# 可视化UMAP
sc.pl.umap(adata, color=['n_counts', 'percent_mt'], show=False)
![]() | ![]() |
注意:
-
sc.pp.scale 确保每个基因的表达量标准化为均值0、方差1,避免高表达基因主导PCA结果。
-
max_value=10 限制缩放后的最大值,防止极端值影响结果。
-
PCA的 n_pcs(主成分数量)通常设置为30-50,具体可通过 pca_variance_ratio 图检查解释方差的比例。
-
UMAP的 n_neighbors 控制局部结构的保留程度,n_pcs 指定使用的PCA主成分数,可根据数据集大小调整。
聚类(Clustering)
通过聚类,我们可以将相似的细胞分组,初步识别可能的细胞类型。常用的方法是基于图的聚类算法(如Louvain或Leiden)。
# 运行Leiden聚类
sc.tl.leiden(adata, resolution=0.8)# 可视化聚类结果
sc.pl.umap(adata, color='leiden', legend_loc='on data', title='Leiden Clustering')
注意:
-
resolution 参数控制聚类的细粒度,值越大,得到的簇越多(通常在0.5-1.5之间调整)。
-
Leiden算法相比Louvain更稳定,推荐使用。
-
可视化时,legend_loc='on data' 将簇编号直接标注在图上,便于观察。
可视化与初步注释
为了进一步理解聚类结果,我们可以通过已知标记基因(marker genes)对簇进行初步注释。以下以人类数据为例,假设我们关注几种常见细胞类型(如T细胞、巨噬细胞、B细胞等)。当然前提是你已经知道了一些marker。这样可以展示出高表达这些maker的细胞的大致分布。
# 定义标记基因(根据研究背景调整)
marker_genes = {'T_cells': ['CD3D', 'CD8A'],'Macrophages': ['CD68', 'MARCO'],'B_cells': ['CD19', 'MS4A1']
}# 可视化标记基因表达
sc.pl.umap(adata, color=marker_genes['T_cells'], title='T Cell Markers')
sc.pl.umap(adata, color=marker_genes['Macrophages'], title='Macrophage Markers')
sc.pl.umap(adata, color=marker_genes['B_cells'], title='B Cell Markers')# 点图展示标记基因表达
sc.pl.dotplot(adata, marker_genes, groupby='leiden', dendrogram=True)
注意:
-
标记基因需要根据具体组织或实验背景选择,建议查阅相关文献或数据库(如PanglaoDB)。
-
dotplot 显示每个簇中标记基因的平均表达量和表达细胞比例,适合初步判断簇的细胞类型。
-
如果某些标记基因不在数据中,检查基因名是否正确(大小写敏感)或是否被QC过滤。
可视化(附加选择):聚类统计
为了更好地理解聚类结果,可以统计每个簇的细胞数量并绘制柱状图。
import seaborn as sns
import matplotlib.pyplot as plt# 统计每个簇的细胞数量
cluster_counts = adata.obs['leiden'].value_counts().sort_index()# 绘制柱状图
plt.figure(figsize=(10, 6))
sns.barplot(x=cluster_counts.index, y=cluster_counts.values, color='skyblue')
plt.xlabel('Cluster')
plt.ylabel('Number of Cells')
plt.title('Cell Counts per Cluster')
plt.show()
总结与下一步
保存结果:
# 保存处理后的AnnData对象
adata.write('processed_clustered.h5ad', compression='gzip')
至此,我们完成了单细胞RNA-seq分析的核心步骤:从质控到聚类和初步注释。后续分析可以包括:
-
差异表达分析:识别每个簇的特征基因(使用 sc.tl.rank_genes_groups)。
-
细胞类型精细注释:结合更多标记基因或自动注释工具(如SingleR)。
-
轨迹分析:探索细胞发育或分化路径(使用 sc.tl.paga 或 sc.tl.diffmap)。
-
整合多组数据:处理批次效应(使用 sc.pp.combat 或 sc.external.pp.harmony)。