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将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Python Websockets库的使用指南

《PythonWebsockets库的使用指南》pythonwebsockets库是一个用于创建WebSocket服务器和客户端的Python库,它提供了一种简单的方式来实现实时通信,支持异步和同步... 目录一、WebSocket 简介二、python 的 websockets 库安装三、完整代码示例1.

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.