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

3D-Genome | Hi-C互作矩阵归一化指南

Hi-C 是一种基于测序的方法,用于分析全基因组染色质互作。它已广泛应用于研究各种生物学问题,如基因调控、染色质结构、基因组组装等。Hi-C 实验涉及一系列生物化学反应,可能会在输出中引入噪声。随后的数据分析也会产生影响最终输出噪声:互作矩阵,其中矩阵中的每个元素表示基因组任意两个区域之间的互作强度。因此,Hi-C 数据分析的关键步骤是消除此类噪声,该步骤也称为 Hi-C 数据归一化。

归一化方法

为了归一化 Hi-C matrix,可以采用以下多种方法[1]

  • Iterative Correction (IC) :该方法通过消除实验过程中的偏差来归一化原始接触图。这是一种矩阵平衡的方法,但是,在归一化的情况下,行和列的总和不等于1。
  • Knight-Ruiz Matrix Balancing (KR):Knight-Ruiz (KR) 矩阵平衡是一种归一化对称矩阵的快速算法。归一化后获得双随机矩阵。在这个矩阵中,行和列的总和等于一。
  • Vanilla-Coverage (VC) :该方法首先用于染色体间图谱。后来 Rao 等人,2014 年将其用于染色体内图谱。这是一种简单的方法,首先将每个元素除以相应行的总和,然后除以相应列的总和。
  • Median Contact Frequency Scaling (MCFS):此方法可用于使用两个位置/坐标之间的特定距离的中值接触值来归一化接触图。首先,计算每个距离的中值距离接触频率。随后,观察到的接触频率除以根据两个位置之间的距离获得的中值接触频率。

方法详解

早期的 Hi-C 数据归一化方法主要关注引起噪声的显性因素。切割酶位点、基因组映射、GC 含量等因素使测序读数在基因组中分布不均匀,从而在计算成对互作时引入偏差。根据这些想法,Imakaev 等人提出了一种能够“implicitly”处理所有噪声源的方法。背后的想法实际上非常简单:因为 Hi-C 理论上是一个无偏的实验,所有基因组区域的“visibility”应该是相等的。另一个假设是 Hi-C 实验的所有偏差都是一维且可分解的。基于这些假设,一个解决方案是将原始互作矩阵分解为两个一维偏差和一个行和列之和为相同值的归一化矩阵的乘积。

Imakaev提出的方法在矩阵理论中也称为矩阵平衡。矩阵平衡是一个古老的数学问题,可以追溯到一个世纪前。人们已经开发了许多矩阵平衡方法,包括普通覆盖率 (VC)、Sinkhorn & Knopp (SK) 和 Knight & Ruiz 方法 (KR)。

VC是通过将矩阵的每个元素除以其行和和列和来完成的,以去除每个位点的不同测序覆盖度。 VC可以被认为是SK方法的单次迭代。在SK中,重复执行VC过程,直到所有行和列的总和为相同的值。 S&K 这个过程会收敛。

Rao 等人回顾了所有矩阵平衡方法,并将 KR 方法引入 Hi-C 数据。基于K&R的原始论文,KR方法比SP快几个数量级,这使得它适合平衡高分辨率矩阵。实际上,即使在 10kb 分辨率下,ICE 的 SP 实现也非常快。根据我的经验,ICE 和 KR 之间的速度差异可以忽略不计。然而,KR 有一个缺点,即当矩阵太稀疏时,KR 过程可能无法收敛。在我的研究中,当我使用 Juicer tools 在低测序数据集上生成 KR 归一化矩阵得到了一个空矩阵,这种情况发生了几次。

矩阵平衡的算法其实并不难,我们如何计算 Hi-C 互作矩阵的平衡矩阵呢?下面的Python类中实现了VC和SP方法。对于小矩阵来说,这种实现速度很快。

class HiCNorm(object):
    def __init__(self, matrix):
        self.bias = None
        self.matrix = matrix
        self.norm_matrix = None
        self._bias_var = None

    def iterative_correction(self, max_iter=50):
        mat = np.array(self.matrix, dtype=float)
        row_sum = np.sum(mat, axis=1)
        low_count = np.quantile(row_sum, 0.15)
        mask_row = row_sum < low_count
        mat[mask_row, :] = 0
        mat[:, mask_row] = 0

        self.bias = np.ones(mat.shape[0])
        self._bias_var = []
        x, y = np.nonzero(mat)
        mat_sum = np.sum(mat)

        for i in range(max_iter):
            bias = np.sum(mat, axis=1)
            bias_mean = np.mean(bias[bias > 0])
            bias_var = np.var(bias[bias > 0])
            self._bias_var.append(bias_var)
            bias = bias / bias_mean
            bias[bias == 0] = 1

            mat[x, y] = mat[x, y] / (bias[x]*bias[y])
            new_sum = np.sum(mat)
            mat = mat * (mat_sum / new_sum)

            self.bias = self.bias * bias * np.sqrt(new_sum / mat_sum)

        self.norm_matrix = np.array(self.matrix, dtype=float)
        self.norm_matrix[x, y] = self.norm_matrix[x, y] / (self.bias[x] * self.bias[y])

    def vanilla_coverage(self):
        self.iterative_correction(max_iter=1)

上述算法背后的想法是,我们首先将偏差设置为矩阵每行的总和,并将每个矩阵元素除以其行和列的偏差。重复这两个步骤直到满足收敛标准。我们可以使用偏差的方差(self.bias)来监控平衡过程的收敛性(如下图所示)。

alt

原始互作矩阵、通过 SP 方法和 VC 方法归一化的矩阵绘制为热图,如下所示。我们可以看到,归一化矩阵中远离对角线的区域比原始矩阵更干净,但我们几乎看不到 SP 和 VC 方法之间的差异。在实践中,我们在归一化之前预先过滤具有非常小的值的行。上面的脚本通过将这些行的元素设置为零来过滤掉总和低于所有行总和的 15 分位数的行。

alt

然而,我们可以通过检查相同距离的互作的相关性来量化 SP 和 VC 归一化方法的差异。为此,我们提取并计算两个矩阵的第 d 对角线的相关性,其中 d 是两个基因组区域的距离(在 bin 处)。从下图可以看出,虽然所有三种方法在长距离(>10 Mb)下都类似于原始矩阵,但 SP 与原始矩阵稍微相似。三种方法的成对比较表明,SP 和 VC 高度相似,只是迭代次数不同。 KR 比 VC 更类似于 SP,但差异可以忽略不计。 [注:KR矩阵是用straw API从.hic文件中获得的]。

alt

实际上,Hi-C 归一化仅通过染色体内、仅染色体间或两者来完成。仅对于染色体内,分别在每条染色体上进行 KR 或 ICE。仅对于染色体间,获得全基因组矩阵并从中去除染色体内互作。当包括染色体间相互作用时,高分辨率归一化需要大量内存。因此,归一化通常在全基因组矩阵上以 25kb 或 50kb 分辨率进行。

一个自然的问题是,去除染色体间互作是否会对染色体内互作的产生影响?为了回答这个问题,我对所有互作点和仅染色体内互作点进行了 SP 标准化。同样,通过所有互作归一化和仅通过染色体内互作归一化之间的差异非常小。 Juicer tools 和 Cooler 都默认使用所有触点进行归一化。

alt

总结

那么我应该对数据使用哪种归一化方法?

答案可能是这真的不重要。正如 Rao 等人和我们的分析所示,在 VC、ICE(SP)、KR 和其他几种矩阵平衡方法之间观察到高度相关性。 Rao等人在他们的研究中进一步指出,循环调用不受不同归一化方法的影响。他们甚至表明,当对原始数据调用峰值时,循环几乎相同,这让我怀疑我们是否需要矩阵归一化。虽然Rao等人确实提到VC倾向于过度修正互作图并提出VCSQ来补充VC,但我还没有看到有人拿出明确的证据表明KR/ICE优于VC/VCSQ。每种方法的优缺点总结如下:

方法优点缺点
VC/VCSQ过度矫正
ICE (SP)稳健
KR快,尤其是用于高分辨率低分辨率不稳定

总之,仍然建议将归一化作为实践的一部分。选择 KR 还是 ICE 在很大程度上取决于您使用的流程(Juicer tools 或 Cooler),但如果您的测序深度相对较低,推荐 ICE,因为它可以保证收敛。

Reference
[1]

methods: https://gcmapexplorer.readthedocs.io/en/latest/cmapNormalization.html

本文由 mdnice 多平台发布

相关文章:

3D-Genome | Hi-C互作矩阵归一化指南

Hi-C 是一种基于测序的方法&#xff0c;用于分析全基因组染色质互作。它已广泛应用于研究各种生物学问题&#xff0c;如基因调控、染色质结构、基因组组装等。Hi-C 实验涉及一系列生物化学反应&#xff0c;可能会在输出中引入噪声。随后的数据分析也会产生影响最终输出噪声&…...

【设计者模式】单例模式

文章目录 1、模式定义2、代码实现&#xff08;1&#xff09;双重判空加锁方式两次判空的作用&#xff1f;volatile 关键字的作用&#xff1f;构造函数私有&#xff1f; &#xff08;2&#xff09;静态内部类【推荐】&#xff08;3&#xff09;Kotlin中的单例模式lateinit 和 by…...

Windows7缺失api-ms-win-crt-runtime-l1-1-0.dll的解决方法

api-ms-win-crt-runtime-l1-1-0.dll是一个在Windows操作系统环境下至关重要的动态链接库文件&#xff08;DLL&#xff09;&#xff0c;它是Microsoft Visual C Redistributable的一部分&#xff0c;负责实现C运行时库的相关功能。这个特定的DLL文件提供了大量的底层运行支持&am…...

coqui-ai/TTS 安装使用

Coqui AI的TTS是一款开源深度学习文本转语音工具&#xff0c;以高质量、多语言合成著称。它提供超过1100种语言的预训练模型库&#xff0c;能够轻松集成到各种应用中&#xff0c;并允许用户通过简单API进行个性化声音训练与微调。其技术亮点包括但不限于低资源适应性&#xff0…...

Spring AOP相关注解及执行顺序

Aspect&#xff08;切面&#xff09;&#xff1a;用于标识一个类是切面的注解。通常与其他通知注解一起使用&#xff0c;定义切面类。 Pointcut&#xff08;切点&#xff09;&#xff1a; 注解来定义切点&#xff0c;它用于描述哪些连接点将会被通知所通知。 连接点&#xff…...

C++从零开始的打怪升级之路(day44)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的是关于二叉搜索树的知识点 1.二叉搜索树概念 二叉搜…...

[C++核心编程](七):类和对象——运算符重载*

目录 四则运算符重载 左移运算符重载 递增运算符重载 赋值运算符重载 关系运算符重载 函数调用运算符重载 对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型 四则运算符重载 对自定义数据类型实现四则运算&#xff08;加减乘除&…...

什么是MVC和MVVM

**MVC和MVVM是两种流行的软件架构模式&#xff0c;它们在前端开发中被广泛采用来组织代码和管理应用程序的复杂性**。具体如下&#xff1a; MVC&#xff08;Model-View-Controller&#xff09;&#xff1a; 1. 模型&#xff08;Model&#xff09;&#xff1a;负责管理数据和业…...

物体检测-系列教程23:YOLOV5 源码解析13 (SPP层、Flatten模块、Concat模块、Classify模块)

&#x1f60e;&#x1f60e;&#x1f60e;物体检测-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 17、SPP模块 17.1 SPP类 SPP是一种特殊的池化策略&#xff0c;最初在YOLOv3-SPP中被使用…...

2024.3.6每日一题

LeetCode 找出数组中的 K -or 值 题目链接&#xff1a;2917. 找出数组中的 K-or 值 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数&#xff1a; 只有在 nums 中&…...

YOLOSHOW - YOLOv5 / YOLOv7 / YOLOv8 / YOLOv9 基于 Pyside6 的图形化界面

YOLOSHOW 是一个基于 PySide6&#xff08;Qt for Python&#xff09;开发的图形化界面应用程序&#xff0c;主要用于集成和可视化YOLO系列&#xff08;包括但不限于YOLOv5、YOLOv7、YOLOv8、YOLOv9&#xff09;的目标检测模型。YOLOSHOW 提供了一个用户友好的交互界面&#xff…...

sql高级

sql高级 SQL SELECT TOP 子句 SELECT TOP 子句用于规定要返回的记录的数目。 SELECT TOP 子句对于拥有数千条记录的大型表来说&#xff0c;是非常有用的。 **注意:**并非所有的数据库系统都支持 SELECT TOP 语句。 MySQL 支持 LIMIT 语句来选取指定的条数数据&#xff0c; O…...

更快更强,Claude 3全面超越GPT4,能归纳15万单词

ChatGPT4和Gemini Ultra被Claude 3 AI模型超越了&#xff1f; 3月4日周一&#xff0c;人工智能公司Anthropic推出了Claude 3系列AI模型和新型聊天机器人&#xff0c;其中包括Opus、Sonnet和Haiku三种模型&#xff0c;该公司声称&#xff0c;这是迄今为止它们开发的最快速、最强…...

devc++小游戏3.8.5

导航&#xff1a; Dev-c跑酷小游戏 1.0.0 devc跑酷小游戏1.2.5 devc跑酷游戏1.2.6 devc跑酷游戏2.0.0 devc跑酷游戏2.0.1 devc跑酷游戏2.4.0 devc跑酷小游戏3.5.0 更新内容 重磅回归&#xff0c;存档搞定&#xff01;&#xff01;&#xff01; 每一关需要前一关已…...

Java网络通信TCP

目录 TCP两个核心类 服务端 1.用ServerSocker类创建对象并且手动指定端口号 2.accept阻塞连接服务端与客户端 3.给客户端提供处理业务方法 4.处理业务 整体代码 客户端 1.创建Socket对象&#xff0c;并连接服务端的ip与端口号 2.获取Socket流对象&#xff0c;写入数据…...

层级锁笔记

注意看test_hierarchy_lock函数&#xff1a;如果thread t2的不注释&#xff0c;就会报错。 这是因为层级锁 更强调单个线程内上锁的顺序。 线程t2已经获取了hmtx2&#xff0c;再试图获取hmtx1就会因为违反层级顺序而抛出异常。 #include <mutex> #include <thread&g…...

基于SpringBoot+Vue 的专家医院预约挂号系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

计算机基础专升本笔记十二-Excel常用快捷键大全

计算机基础专升本笔记十二-Excel常用快捷键大全 Excel常用快捷键 按键作用Ctrl 0隐藏列Ctrl 1设置单元格格式Ctrl 2添加或取消字体加粗Ctrl 3添加或取消字体倾斜Ctrl 4添加或取消下划线Ctrl 5添加或取消删除线Ctrl 6隐藏或显示图形Ctrl 7隐藏工具栏Ctrl 8隐藏或显示…...

制作耳机壳的UV树脂和塑料材质相比优势有哪些?

制作耳机壳的UV树脂相比塑料材质有以下优势&#xff1a; 高强度与耐磨性&#xff1a;UV树脂具有高强度和耐磨性&#xff0c;能够更好地保护耳机内部零件&#xff0c;延长耳机使用寿命。相比之下&#xff0c;塑料材质可能较易磨损或刮伤。耐高温&#xff1a;UV树脂具有较好的耐…...

JS(JavaScript)中如何实现,复选框checkbox多选功能

起始界面&#xff1a; 代码元素&#xff1a; <p><input type"checkbox" id"checkedAll"> 全选按钮</p><p><input type"checkbox" class"cl"> 选项1</p><p><input type"checkbox&qu…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...