1.基于python的单细胞数据预处理-归一化

2024-05-10 23:04

本文主要是介绍1.基于python的单细胞数据预处理-归一化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 归一化的引入
  • 移位对数
  • 皮尔森近似残差
  • 两个归一化方法的总结

参考:
[1] https://github.com/Starlitnightly/single_cell_tutorial
[2] https://github.com/theislab/single-cell-best-practices

归一化的引入

在质量控制中,已经从数据集删除了低质量细胞。然而由于测序技术的限制,我们在样本中获得RNA时,经过分子捕获,逆转录和测序,这些步骤会影响同一种细胞的细胞间测序深度的变异性,因此,数据中的细胞间差异包含了这部分误差,等价于counts矩阵包含了变化很大的方差项。

归一化旨在通过将UMI counts的方差缩放到指定范围,以调整原始矩阵的UMI counts。目前有两种归一化方法:

  • 移位对数:在大部分数据中表现良好,有利于稳定方差,进而利于降维和差异基因识别;
  • 皮尔森残差的近似解析:保留生物学差异,有利于鉴定稀有细胞类型。

首先,我们加载数据:

import omicverse as ov
import scanpy as sc
import matplotlib.pyplot as pltov.utils.ov_plot_set()adata = sc.read("./data/s4d8_quality_control.h5ad")
print(adata)

然后,可视化total_counts,这是描述一个细胞中发现的分子数量(UMI),通常也可以被认为是这个细胞的文库大小:

import seaborn as sns
plt.figure(figsize=(8, 6))
p1 = sns.histplot(adata.obs["total_counts"], bins=100, kde=False)
plt.show()

fig1
这可视化了原始计数UMI的分布,可以用于和之后归一化的分布对比。

移位对数

这里介绍基于delta方法的移位对数,delta方法应用 f ( Y ) f(Y) f(Y),使得原始计数 Y Y Y中的差异被缩小: f ( y ) = l o g ( y s + y 0 ) f(y)=log(\frac{y}{s}+y_{0}) f(y)=log(sy+y0)其中, s s s是缩放因子, y 0 y_{0} y0是伪计数。每个细胞都有对应的缩放因子,细胞 c c c的缩放因子记为: s c = ∑ g y g c L s_{c}=\frac{\sum_{g}y_{gc}}{L} sc=Lgygc其中, g g g代表不同的基因, L L L代表基因的计数总和。

使用移位对数归一化:

scales_counts = sc.pp.normalize_total(adata, target_sum=None, inplace=False)
print(scales_counts)
# log1p transform
adata.layers["log1p_norm"] = sc.pp.log1p(scales_counts["X"], copy=True)

可视化对比归一化前后:

fig, axes = plt.subplots(1, 2, figsize=(8, 4))
p1 = sns.histplot(adata.obs["total_counts"], bins=100, kde=False, ax=axes[0])
axes[0].set_title("Total counts")
p2 = sns.histplot(adata.layers["log1p_norm"].sum(1), bins=100, kde=False, ax=axes[1])
axes[1].set_title("Shifted logarithm")
plt.savefig("./result/2-3.png")

fig2

我们发现UMI的最大值在1000左右,经过移位对数化后,UMI的分布近似正态分布。

皮尔森近似残差

scRNA-seq包含生物异质性和批次效应,移位对数更倾向于消除批次差距,皮尔森近似残差可以保留移位对数去除的信息。实验中发现,皮尔森近似残差计算非常慢。对于14814×20171的adata,移位对数花费5秒,皮尔森近似残差花费3分33秒。

归一化与可视化为:

from scipy.sparse import csr_matrix
analytic_pearson = sc.experimental.pp.normalize_pearson_residuals(adata, inplace=False)
adata.layers["analytic_pearson_residuals"] = csr_matrix(analytic_pearson["X"])fig, axes = plt.subplots(1, 2, figsize=(8, 4))
p1 = sns.histplot(adata.obs["total_counts"], bins=100, kde=False, ax=axes[0])
axes[0].set_title("Total counts")
p2 = sns.histplot(adata.layers["analytic_pearson_residuals"].sum(1), bins=100, kde=False, ax=axes[1])
axes[1].set_title("Analytic Pearson residuals")
plt.savefig("./result/2-4.png")

注意,如果我们设置inplace=True时,我们归一化的计数矩阵会取代原anndata文件中的计数矩阵,即更改adata.X的内容。

fig3
相比移位对数,皮尔森近似残差归一化后的数据分布与原始数据更相似,所以保留了更多信息。

两个归一化方法的总结

移位对数和皮尔逊近似残差是两种用于归一化数据的方法,它们各自具有不同的特点:

  1. 移位对数(Log-transformation)

    • 特点:将原始数据的计数值进行对数转换,通常是加上一个小的常数(如1),以避免计数值为零时出现无穷大的情况。
    • 优点:可以有效地减小数据的偏斜,使其更符合正态分布假设。对于计数数据,对数转换也可以减小计数之间的差异,有助于更好地展现数据的模式和关系。
    • 缺点:对于一些数据分布,特别是存在大量低计数值的情况下,对数转换可能会引入噪音,使数据更难解释。此外,对数转换可能会导致丢失原始数据的一些信息。
  2. 皮尔逊近似残差(Analytic Pearson residuals)

    • 特点:利用正则化负二项回归得到的皮尔逊残差,通过计算数据中的技术噪声模型来归一化数据。
    • 优点:能够更准确地处理数据中的技术效应和生物异质性,避免了一些常见归一化方法可能引入的偏差。不需要额外的启发式步骤(如伪计数添加或对数转换)。
    • 缺点:相对于简单的对数转换方法,计算复杂度较高。

总的来说,移位对数适用于简单的数据集,对数转换可使数据更易于处理和分析;而皮尔逊近似残差则更适用于复杂的数据集,尤其是对于单细胞RNA测序数据很需要生物异质性的情况。

这篇关于1.基于python的单细胞数据预处理-归一化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977812

相关文章

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提