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

在完成质控(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.pswp.cn/news/914237.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型 Agent(智能体)技术简介

大模型 Agent(智能体)技术 是当前人工智能领域的前沿方向,它赋予大型语言模型(LLM)自主感知、规划、决策和行动的能力,使其不再局限于“被动应答”,而是能主动完成复杂任务。简单来说&#xff0…

OneCode 3.0架构深度剖析:工程化模块管理与自治UI系统的设计与实现

引言 OneCode 3.0作为新一代低代码开发平台,其架构设计围绕"工程模块化"与"UI自主化"两大核心目标展开。本文将从底层接口到上层应用,全面解析OneCode 3.0的技术架构,包括核心工厂类、工程管理接口、数据仓库设计以及动态…

功耗校准数据PowerProfile测试方法建议

场景步骤版本:xxxxA1A2结果(mA)screen,full1.打开飞行模式,灭屏时间最长,其他的基础功能关2.进入到日历应用界面3.将亮度设置至最大(4095),待电流稳定后,测试5分钟,记录电…

[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+vue实现的供电公司安全生产考试管理系统,推荐!

摘 要 使用旧方法对安全生产考试信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在安全生产考试信息的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。 这次开发的供电公…

输入框过滤选项列表,el-checkbox-group单选

需求:根据输入的文本动态过滤选项列表,并在下方显示匹配到的选项。当用户勾选匹配到的选项时,把该选项的值赋值给输入框中绑定的值。当用户取消选择时,输入框中的字段可以随意编辑。组件:el-input、el-checkbox-group、…

身份认证缺陷

Authentication Bypasses审计创建AccountVerificationHelper实例,用于处理账户验证逻辑parseSecQuestions函数的作用是从请求体中遍历参数名,找到包含secQuestion的参数,将其值存入Map中并返回这里直接把AccountVerificationHelper整个分析一…

火山引擎:字节跳动的技术赋能初解

火山引擎是字节跳动旗下的企业级智能技术服务平台,于2020年6月正式上线。它通过开放字节跳动在大数据、人工智能、视频云等领域的核心技术,助力企业实现数字化转型与业务增长。火山引擎界面核心能力与技术亮点:1.全栈云服务公有云与混合云:提…

VUE 带有搜索功能的穿梭框(简单demo)

一、template/ 组件代码<el-dialog :title"title" :visible.sync"dialogVisible" width"60%" :before-close"handleClose" class"custom-dialog-line" ><div style"text-align: center ; width: 100%; height…

写个扫雷小游戏

1.test.c&#xff08;测试源文件&#xff09;2.game.c&#xff08;游戏源文件&#xff09;3.头文件

【Linux庖丁解牛】— system V共享内存!

1. 什么是system VSystem V IPC&#xff08;Interprocess Communication&#xff0c;进程间通信&#xff09;是Unix系统中一种经典的进程间通信机制&#xff0c;由AT&T在System V.2版本中引入&#xff0c;并广泛应用于Linux等现代操作系统中。它通过三种核心机制实现进程间…

从输入到路径:AI赋能的地图语义解析与可视化探索之旅(2025空间智能全景)

​​摘要​​在空间智能爆发的2025年&#xff0c;地图系统已从静态导航工具进化为​​实时决策中枢​​。本文深度解析AI如何重构地理信息处理全链路&#xff1a;通过​​多模态语义理解​​&#xff08;文本/语音/图像→空间意图&#xff09;、​​动态路网建模​​&#xff0…

安全运维新趋势:AI 驱动的自动化威胁检测

在数字化浪潮中&#xff0c;网络攻击正从 “单点突破” 进化为 “链状打击”&#xff1a;2024 年某金融机构遭遇供应链攻击&#xff0c;恶意代码通过运维通道潜伏 3 个月&#xff0c;传统规则引擎因未识别 “正常运维指令中的异常参数”&#xff0c;导致数据泄露损失过亿。这背…

数据库复合索引设计:为什么等值查询列应该放在范围查询列前面?

前言作为后端开发工程师&#xff0c;我们经常会遇到数据库查询性能问题。在一次系统优化中&#xff0c;我发现一个简单的索引顺序调整竟然让查询速度提升了10倍&#xff01;这让我意识到复合索引列顺序的重要性。今天&#xff0c;我就来分享一下这个经验&#xff0c;希望能帮助…

【PMP备考】每日一练 - 2

1、一个建筑项目的项目经理发现&#xff0c;他管理的项目所在地附近正在新建一条新的水管线。公司政策要求&#xff0c;在他的团队继续完成这个项目之前&#xff0c;必须先填写一系列有关城市环境变化的表格。这是那两种情况的例子&#xff1f;&#xff08;选2个选项&#xff0…

【三】ObservableCollection 与 List 的区别

文章目录前言一、核心概念简介ObservableCollectionList二、关键差异对比三、典型使用场景ObservableCollection 的适用场景List 的适用场景四、在Community Toolkit MVVM中使用ObservableCollection<Data>和List<Data>场景1&#xff1a;动态列表&#xff08;Obser…

网安-SSRF-pikachu

目录 SSRF:Server-Side Request Forgery PHP curl PHP 可能引起SSRF的函数 PHP其他函数 CURL其他协议 SSRF利用&#xff1a; SSRF的发现 工具 SSRF的防御 pikachu-SSRF 一&#xff1a;curl 1.访问连接&#xff1a; 2.读取本地文件 3.dict协议扫描主机端口 二&…

在Centos系统上如何有效删除文件和目录的指令汇总

CentOS系统是一款开源的类Unix操作系统&#xff0c;极其亲和程序员和技术人员。这个系统最大的优势就是其高度自由化的特性&#xff0c;世界各地的开发者可以依照实际需求去修改和运行。在这个操作系统中&#xff0c;如果你想删除文件和目录&#xff0c;你可以使用各式各样的命…

Spring(四) 关于AOP的源码解析与思考

Spring&#xff08;四&#xff09; 关于AOP的源码解析与思考 每种语言都有其独特的机制和特点&#xff0c;那么说到Java你可能会首先想到反射&#xff0c;反射是Java语言提供的一种能够在程序运行时动态操作类或对象的能力&#xff0c;比如获取某个对象的类定义、获取类声明的属…

Android 15 Settings 搜索框:引入关键字过滤功能

在日常使用 Android 手机时,我们经常会用到“设置”应用中的搜索功能来快速定位所需选项。然而,有时搜索结果可能会包含一些我们不希望看到或者过于宽泛的条目。 本文将深入探讨这一变化,通过分析 SearchResultsAdapter.java 文件中的代码修改,揭示 Android 如何实现对特定…

Python-魔术方法-创建、初始化与销毁-hash-bool-可视化-运算符重载-容器和大小-可调用对象-上下文管理-反射-描述器-二分-学习笔记

序 欠4前年的一份笔记 &#xff0c;献给今后的自己。 魔术方法 特殊属性查看属性如果dir&#xff08;lobji&#xff09;参数obj包含方法 __dir__()&#xff0c;该方法将被调用。如果参数obj不包含__dir__()&#xff0c; 该方法将最大限度地收集参数信息。 dir()对于不同类型的对…