当前位置: 首页 > news >正文

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

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

http://www.xdnf.cn/news/1110115.html

相关文章:

  • 牛客网50题
  • 第14次课 认识图 A
  • docker镜像原理与镜像制作优化
  • Classifier guidance与Classifier-free guidance的原理和公式推导
  • 【STM32实践篇】:最小系统组成
  • 深入详解:决策树在医学影像领域心脏疾病诊断的应用及实现细节
  • Pytest 跳过测试技巧:灵活控制哪些测试该跑、哪些该跳过
  • 图像扭曲增强处理流程
  • 物联网设备数据驱动3D模型的智能分析与预测系统
  • frp内网穿透教程及相关配置
  • 【Redis实战】Widnows本地模拟Redis集群的2种方法
  • Git 相关的常见面试题及参考答案
  • 国产电钢琴电子琴手卷钢琴对比选购指南
  • 2025年亚太杯(中文赛项)数学建模B题【疾病的预测与大数据分析】原创论文讲解(含完整python代码)
  • ESP32使用freertos更新lvgl控件内容
  • 搭建云手机教程
  • 聊下easyexcel导出
  • Java可变参数
  • 从基础加热到智能生态跨越:艾芬达用创新重构行业价值边界!
  • Go mod 依赖管理完全指南:从入门到精通
  • 代码随想录day28贪心算法2
  • 【AI News | 20250711】每日AI进展
  • Spring(四) 关于AOP的源码解析与思考
  • Java SE--抽象类和接口
  • 如何查看服务器当前用户的权限
  • GD32 CAN1和TIMER0同时开启问题
  • 深度学习15(GRU、LSTM+词嵌入+seq2seq+attention)
  • 电子基石:硬件工程师的器件手册 (五) - 三极管:电流放大的基石与开关的利刃
  • 7. JVM类加载器与双亲委派模型
  • 关于两种网络攻击方式XSS和CSRF