单细胞分析教程 | (二)标准化、特征选择、降为、聚类及可视化

在完成质控(QC)后,我们已经过滤掉了低质量细胞、双细胞和低表达基因,获得了较为干净的单细胞数据集单细胞分析教程 | (一)Python单细胞质控全流程。接下来,我们将进行以下关键步骤:

**1. 数据标准化(Normalization):**消除测序深度和细胞大小的影响。

**2. 特征选择(Feature Selection):**挑选高变基因以减少噪声。

**3. 降维(Dimensionality Reduction):**将高维数据投影到低维空间,便于可视化和分析。

**4. 聚类(Clustering):**将细胞分组以识别细胞类型。

**5. 可视化(Visualization ):**展示聚类结果。

通过这些步骤,我们可以从原始计数数据中提取生物学意义,为后续差异表达分析和功能注释打下基础。以下是详细流程和代码实现。

数据标准化(Normalization)

在进行后续内容之前,同样需要导包等操作,如下,不再进行详细介绍:

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import scanpy as sc
import random

seed = 42
random.seed(seed)
np.random.seed(seed)

adata = sc.read_h5ad("./qc_processed.h5ad")

单细胞数据的原始计数受到测序深度、细胞大小等技术因素的影响,因此需要标准化以确保细胞间表达值的可比性。常用的标准化方法是对计数进行归一化(通常按细胞总计数归一化到固定值,如10,000),然后进行对数化以稳定方差。

python 复制代码
# 标准化:按总计数归一化到10,000
sc.pp.normalize_total(adata, target_sum=1e4)

# 对数化:log1p变换
sc.pp.log1p(adata)

# 保存标准化后的数据到adata.raw,用于后续差异表达分析
adata.raw = adata

adata

注意:

  • 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)可以减少噪声,聚焦于生物学上重要的基因。

python 复制代码
# 识别高变基因
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进行可视化。

python 复制代码
# 缩放数据(零均值、单位方差)
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)。

python 复制代码
# 运行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的细胞的大致分布。

python 复制代码
# 定义标记基因(根据研究背景调整)
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过滤。

可视化(附加选择):聚类统计

为了更好地理解聚类结果,可以统计每个簇的细胞数量并绘制柱状图。

python 复制代码
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()

总结与下一步

保存结果:

python 复制代码
# 保存处理后的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)。

相关推荐
技术与健康2 小时前
LLM实践系列:利用LLM重构数据科学流程03- LLM驱动的数据探索与清洗
大数据·人工智能·重构
张小九993 小时前
Foldseek快速蛋白质结构比对
人工智能
云卓SKYDROID4 小时前
无人机延时模块技术难点解析
人工智能·无人机·高科技·云卓科技·延迟摄像
神齐的小马4 小时前
机器学习 [白板推导](十三)[条件随机场]
人工智能·机器学习
荼蘼4 小时前
CUDA安装,pytorch库安装
人工智能·pytorch·python
@Wufan5 小时前
【机器学习】7 Linear regression
人工智能·机器学习·线性回归
tainshuai5 小时前
从零开始理解 K 均值聚类:原理、实现与应用
机器学习·均值算法·聚类
cxr8285 小时前
自动化知识工作AI代理的工程与产品实现
运维·人工智能·自动化
whaosoft-1436 小时前
51c自动驾驶~合集18
人工智能
即兴小索奇6 小时前
2025年AI Agent规模化落地:企业级市场年增超60%,重构商业作业流程新路径
人工智能·ai·商业·ai商业洞察·即兴小索奇