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

在完成质控(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)。

相关推荐
大模型最新论文速读16 分钟前
模拟注意力:少量参数放大 Attention 表征能力
人工智能·深度学习·机器学习·语言模型·自然语言处理
lishaoan771 小时前
用TensorFlow进行逻辑回归(二)
人工智能·tensorflow·逻辑回归
慌ZHANG1 小时前
智慧气象新范式:人工智能如何重构城市级气象服务生态?
人工智能
Eumenidus1 小时前
使用ESM3蛋白质语言模型进行快速大规模结构预测
人工智能·语言模型·自然语言处理
熊猫钓鱼>_>1 小时前
FastGPT革命:下一代语言模型的极速进化
人工智能·语言模型·自然语言处理
吕永强1 小时前
电网的智能觉醒——人工智能重构能源生态的技术革命与公平悖论
人工智能·科普
极限实验室1 小时前
喜报 - 极限科技荣获 2025 上海开源创新菁英荟「开源创新新星企业」奖
人工智能·开源
在美的苦命程序员2 小时前
芯片之后,AI之争的下一个战场是能源?
人工智能
霖002 小时前
FPGA通信设计十问
运维·人工智能·经验分享·vscode·fpga开发·编辑器
天上游戏地下人间2 小时前
基于Opencv的缺陷检测实战
图像处理·人工智能·计算机视觉