【python】数据预处理:分位数归一化 Quantile Normalization + INSCODE AI创作助手测试

news2024/10/6 18:34:51

文章目录

  • 写在前面
  • 标准化/归一化
  • python模块qnorm实现分位数归一化
  • R代码实现分位数归一化
  • 分位数归一化 - NSCODE AI创作助手的回答
    • *Q1:Quantile Normalization是什么?*
    • *Q2-1: 什么时候用Quantile normalization?*
    • *Q2-2: 什么时候做Quantile normalization?*
    • *Q3:为什么要做Quantile Normalization?*
    • *Q4-1: 如何做Quantile normalization?*
    • *Q4-2: 如何用python做Quantile Normalization?*
  • 可视化分位数归一化处理前后发生的变化
  • 什么时候该用/不该用分位数归一化

写在前面

这里主要了解一下分位数归一化(Quantile Normalization, QN。如无特殊说明时,本文中的QN作为分位数归一化的缩写。

Quantile Normalization 直接翻译是 分位数归一化,但也有翻译为分位数标准化。笔者理解是按直译叫分位数归一化,但是按数据的处理方式,应该叫分位数标准化,按英文的话就一种:Quantile Normalization。之所以有标准化和归一化两种说法,是因为它们是两种不同的处理方式。

本文暂统一名称叫分位数归一化(QN)。

标准化/归一化

标准化(standardization)、归一化(normalization)两者总是被混着叫,实际是在做什么处理呢?

先看下Python库中的关于预处理的一些包:
在这里插入图片描述
其中包括了:scaling(缩放), centering(中心化), normalization(归一化), binarization(二值化)。

对于标准化和归一化对应的常用的模块:

  • 标准化 standardization:py模块 StandardScaler 是常用的标准化数据处理,对应z-score标准化公式: z = x − μ s z=\frac{x-\mu}{s} z=sxμ(其中, μ \mu μ是训练样本的均值, s s s是训练样本的标准差)。将原始数据转换为均值为0,方差为1的新数据,也是把数据缩放(scaling)到特定区间上。该处理从公式计算上解读为:当前数据比总体均值多了几个标准差;从数据整体上解读为:把原数据标准化缩放为服从标准正态分布的数据。

  • 归一化 normalization:py模块 MinMaxScaler是比较常用的归一化方法:min-max归一化, x ∗ = x i − x m i n x m a x − x m i n x^*=\frac{x_i− x_{min}}{x_{max} − x_{min}} x=xmaxxminxixmin

python模块qnorm实现分位数归一化

仔细看Python的sklearn库中(# 标准化/归一化 部分的截图),会发现这里没有分位数归一化的包。是的,sklearn里没有QN。需要先安装qnorm(qnorm安装包官网),安装命令为:pip install qnorm。使用示例如下:

import pandas as pd
import qnorm

df = pd.DataFrame({'C1': {'A': 5, 'B': 2, 'C': 3, 'D': 4},
                   'C2': {'A': 4, 'B': 1, 'C': 4, 'D': 2},
                   'C3': {'A': 3, 'B': 4, 'C': 6, 'D': 8}})

print(qnorm.quantile_normalize(df, axis=1))

执行后可得到:
在这里插入图片描述

R代码实现分位数归一化

最初测试使用了R代码,在“INSCODE AI创作助手”助手的默认实现方式中也使用了R。(做分位数归一化处理可能用R的比较多)

代码中使用到R包preprocessCore

df <- data.frame(one=c(5,2,3,4),
                 two=c(4,1,4,2),
                 three=c(3,4,6,8)
)
rownames(df) <- c('f1', 'f2', 'f3', 'f4')

df

preprocessCore::normalize.quantiles(x=as.matrix(df))

执行后得到:
在这里插入图片描述

分位数归一化 - NSCODE AI创作助手的回答

上面的代码直接执行就能得到相应的数据,下面是通过“NSCODE AI创作助手”了解更多分位数归一化相关的知识。

想了解一个概念最好的方式,就是通过提问并回答这个3W1H:Waht/Why/When/How … the “A”?

  1. 什么是分位数归一化(What)
  2. 为什么要做分位数归一化(Why)
  3. 什么时候做分位数归一化(When)
  4. 怎么做分位数归一化(How)

试试“INSCODE AI创作助手”给出的一些解答:

提问示例:
在这里插入图片描述

来自 InsCode AI创作助手 的回答:(结果还是挺出乎意料的)

Q1:Quantile Normalization是什么?

Quantile normalization是一种用于处理高通量基因表达数据的方法。它通过对所有样本的数据进行排序,并将排序后的数据进行归一化,从而消除任何来自各个样本之间的数据不一致性的影响。基本思路是将每个样本的数据值按照从小到大的顺序进行排列,然后将排列后的数据值替换为对应分位数(例如,对于一个样本,将第10个最小值替换为第10个最小分位数)。这个过程使得每个样本的数据分布相同,从而可以进行更好的比较和综合分析。

Q2-1: 什么时候用Quantile normalization?

Quantile normalization是一种数据预处理方法,通常在基因表达数据中使用。当数据集中存在分布不均的情况时,使用Quantile normalization可以将数据集中的样本在数值分布上进行对齐,以消除由于样本差异而带来的数据偏差。因此,当你想要在基因表达数据分析中对不同样本的基因表达数据进行比较时,可能需要使用Quantile normalization来消除样本之间的差异,以确保数据的准确性和可靠性。

Q2-2: 什么时候做Quantile normalization?

Quantile normalization通常在对基因表达数据进行比较分析时使用。具体地说,当你有多个实验组(每组都包含多个样本)且你想比较它们之间的基因表达水平时,通常会使用Quantile normalization进行数据标准化,以消除混杂因素(例如实验批次,RNA提取和扫描阅读器)对实验结果的影响。这样可以使得样本之间的差异仅仅是由于生物学的差异,而不是技术方面的差异所引起的。因此,Quantile normalization 常被用于微阵列和RNA测序数据分析,以减少技术方面的差异对于样本之间的比较所带来的影响。

Q3:为什么要做Quantile Normalization?

Quantile normalization是一种数据标准化方法,它的目的是通过调整数据的排名顺序来消除实验中不同样本之间的技术差异,使得数据能够更好地比较和分析。
在高通量基因表达研究中,由于实验过程、实验条件等因素的不同,不同样本之间的基因表达量数据往往存在一定的不一致性。如果直接进行差异分析或聚类分析等,可能会将这些技术差异误认为是生物差异,导致分析结果出现偏差。因此,需要对数据进行标准化处理,消除这些技术差异。
Quantile normalization的做法是将不同样本中基因表达量的排名顺序进行统一,使得各个样本的数据分布在相同的位置上。这样可以消除技术差异,让不同样本之间成为可比较的数据,提高了分析结果的可信度和稳定性。

Q3问题重新生成:(得到类似但不同的结果)
Quantile normalization是一种常用的数据标准化方法,主要应用于高通量基因表达数据分析中。做Quantile normalization的目的是消除样本之间的技术变异(如批次效应、不同实验处理等)与生物变异对基因表达量的影响,使得样本间的基因表达值具有可比性。
Quantile normalization的具体步骤是将每个样本的基因表达值按照从小到大的顺序排列,然后将排名相同的基因表达值分配给相应的样本,从而使得每个基因在不同样本中的表达值的分布均匀,且每个样本的基因表达量分布保持不变。
通过Quantile normalization,我们可以快速、有效地比较不同样本之间的基因表达量差异,从而有助于进一步发现基因调控机制、诊断疾病等方面的研究。

Q4-1: 如何做Quantile normalization?

Quantile normalization是一种数据标准化方法,用于将不同样本之间的数据分布进行比较和统一。以下是基于R语言的实现方法:

  1. 导入需要进行标准化处理的数据集。
  2. 对数据集进行排序。
data_sorted <- apply(data, 2, sort)
  1. 计算每一行的分位数。
quantiles <- apply(data_sorted, 1, quantile, probs = seq(0, 1, length = nrow(data) + 1))
  1. 对数据集进行标准化。
data_norm <- apply(data, 2, function(x) {
  rank <- order(x)
  quantiles[rank]
})
  1. 对标准化后的数据进行检查。
summary(apply(data_norm, 2, quantile, probs = seq(0, 1, length = nrow(data) + 1)))

以上就是Quantile Normalization的基本实现方法。

对Q4问题竟然直接给出代码的示例还是有些惊喜的,代码是直接实现的,我以为会直接调用归一化处理的R包:preprocessCore,至于代码准确性还有待测试。我还是希望用Python给出答案,就发出提问:

Q4-2: 如何用python做Quantile Normalization?

Quantile normalization是一种常见的数据预处理技术,用于将不同样本或实验的数据进行标准化,使得它们具有相同的分布。下面是一个用Python实现Quantile Normalization的示例代码:

import numpy as np
from scipy.stats import rankdata

def quantile_normalize(data):
    # 对每一列数据进行排序
    sorted_data = np.sort(data, axis=0)

    # 计算每一行的分位数
    row_quantiles = np.mean(sorted_data, axis=1)

    # 对每一列数据进行排序,并将其映射到对应的分位数
    rank_data = rankdata(data, axis=0)
    mapped_data = np.zeros_like(data)
    for i in range(data.shape[1]):
        mapped_data[:, i] = row_quantiles[rank_data[:, i]-1]

    return mapped_data

使用示例:

# 生成随机数据
data = np.random.rand(10, 5)

# 将数据进行Quantile Normalization
normalized_data = quantile_normalize(data)

该函数输入一个矩阵数据,输出一个Quantile Normalization后的矩阵。函数首先对矩阵的每一列进行排序,然后计算每一行的分位数。接着,对于每一列的数据,映射到对应的分位数。最后,输出Quantile Normalization后的矩阵。

python代码比较意外的是还添加了中文注释,不禁有些感叹自己也不一定能短时间写出这些代码。与R脚本相同,并没有使用包,而是根据QN的原理直接实现,至于代码准确性还是需要细节上的修改:
在这里插入图片描述
报错应该是在映射对应的分位数时错误,报错原因是根据索引获取元素时,索引应该是整数,这里rankdata输出的值是浮点型。

根据报错调整代码:

import numpy as np
from scipy.stats import rankdata

def quantile_normalize(data):
    # 对每一列数据进行排序
    sorted_data = np.sort(data, axis=0)

    # 计算每一行的分位数
    row_quantiles = np.mean(sorted_data, axis=1)
    
    # 对每一列数据进行排序,并将其映射到对应的分位数
    rank_data = rankdata(data, axis=0)
    mapped_data = np.zeros_like(data, dtype=float)  #【修改】初始化指定数据类型为浮点型
    for i in range(data.shape[1]):
        # mapped_data[:, i] = row_quantiles[rank_data[:, i]-1]
        mapped_data[:, i] = row_quantiles[[int(i) for i in rank_data[:, i]-1]]  # 【修改】索引为整型
        
    return mapped_data

注意:代码中,当一列(某样本)出现相同值(基因表达值相同)时的排位问题,直接按计算排位均值后下取整数来获取对应值。具体来说:某列有n个相同数值,应排位为并列第m个,此时rankdata对这n个数的排位都是: m + ( m + 1 ) + . . . + ( m + n − 1 ) n \frac{m+(m+1)+...+(m+n-1)}{n} nm+(m+1)+...+(m+n1),比如,有2个数都排位第3个,则在rankdata排位为: 3 + 4 2 = 3.5 \frac{3+4}{2}=3.5 23+4=3.5,代码中取整(int是下取整),则为3;若有3个数都排位第3个,则在rankdata排位为: 3 + 4 + 5 2 = 3 \frac{3+4+5}{2}=3 23+4+5=3,代码中取整,则为排位取3。

但是, 实际排位中,对于相同的值,使用的是排位后对应值的均值(而不是排位的均值)。也就是上面代码还需要进一步完善:对相同值的排位问题

上面调整后的代码执行结果:

在这里插入图片描述

可视化分位数归一化处理前后发生的变化

先直观得看几个示例QN前后的结果,输入数据:

import pandas as pd
import qnorm
df1 = pd.DataFrame({'C1': {'A': 5, 'B': 2, 'C': 3, 'D': 4},
                   'C2': {'A': 6, 'B': 1, 'C': 7, 'D': 9},
                   'C3': {'A': 3, 'B': 4, 'C': 6, 'D': 8}})
dfn1 = qnorm.quantile_normalize(df1, axis=1)

df2 = pd.DataFrame({'C1': {'A': 5, 'B': 2, 'C': 3, 'D': 4},
                   'C2': {'A': 4, 'B': 1, 'C': 4, 'D': 2},
                   'C3': {'A': 3, 'B': 4, 'C': 6, 'D': 8}})
dfn2 = qnorm.quantile_normalize(df2, axis=1)

df3 = pd.DataFrame({'C1': {'A': 5, 'B': 2, 'C': 3, 'D': 4},
                   'C2': {'A': 4, 'B': 1, 'C': 4, 'D': 4},
                   'C3': {'A': 3, 'B': 4, 'C': 6, 'D': 8}})

dfn3 = qnorm.quantile_normalize(df3, axis=1)

在这里插入图片描述
可视化QN前后的数据:

import matplotlib.pyplot as plt

fig, axs = plt.subplots(3, 2)
plt.rcParams.update({'font.size':5})
i = 0
for df, dfn in zip([df1, df2, df3], [dfn1, dfn2, dfn3]):
    axs[i, 0].scatter(range(len(df.T['A'])), df.T['A'], label='A')
    axs[i, 0].scatter(range(len(df.T['B'])), df.T['B'], label='B')
    axs[i, 0].scatter(range(len(df.T['C'])), df.T['C'], label='C')
    axs[i, 0].scatter(range(len(df.T['D'])), df.T['D'], label='D')
    axs[i, 0].legend(loc='upper left', shadow=True)
    axs[i, 0].set_xticks([0, 1, 2], [1, 2, 3])

    axs[i, 1].scatter(range(len(dfn.T['A'])), dfn.T['A'])
    axs[i, 1].scatter(range(len(dfn.T['B'])), dfn.T['B'])
    axs[i, 1].scatter(range(len(dfn.T['C'])), dfn.T['C'])
    axs[i, 1].scatter(range(len(dfn.T['D'])), dfn.T['D'])
    axs[i, 1].set_xticks([0, 1, 2], [1, 2, 3])
    i += 1
    
fig.tight_layout()
plt.show()

图分两列,左侧一列为原始数据,右侧一列分位数归一化(QN)后的数据。从原始数据到QN后的数据,可以发现,右侧图中每个样本(一列)的4个数据的排列顺序没有发生变化。(注意:有的看起来是<4个数据,是因为原始数据有相同的值,点重叠了)

在这里插入图片描述
手动推算一遍会更理解分位数归一化的基本思路:将每个样本的数据值按照从小到大的顺序进行排列,然后将排列后的数据值替换为对应分位数。

分位数归一化方法:http://bmbolstad.com/stuff/qnorm.pdf

step1: 每个样本的feature按从小到大排序;
step2: 与原始数据对应,获取排位后的序号(rank i/ii/iii/iv);
step3: 计算从小到大排序之后每个featrue的算术平均数;
step4: 将step2中数据排位替换为step3中排位对应的算术平均数;

在这里插入图片描述

什么时候该用/不该用分位数归一化

参考:http://www.bio-info-trainee.com/2043.html

虽然前面对“INSCODE AI创作助手”的提问也有类似什么时候用QN,但是概况性回答了一些QN应用场景,没有很具体或专业的表述。

有一篇文献中专门研究了什么时候使用分位数归一化:文献pdf

在这里插入图片描述
该文献中给出了QN的使用策略:

在这里插入图片描述

【翻译】:(没有仔细研读文献,翻译谨慎参考)

  1. 组内方差小、组间方差小(变异小)→ 技术变化小,无全局变化 → 可使用QN(但是没有必要)
  2. 组内方差大、组间方差小(变异小)→ 技术变化大或组内批次效应,无全局变化 → 使用QN
  3. 组内方差小、组间方差大(变异大)→ 【只用原始数据不能检测到差异】→ 将 检测技术 和 生物变异 导致的全局差异
    1)组间全局技术差异或批次效应 → 使用QN
    2)组间全局生物学差异 → 不使用QN

文献中开发了quantro包:

R包quantro是:提出了一个数据驱动的方法来测试全局标准化方法的假设。证明了文献方法(quantro)的效用,通过将其应用到多个基因的表达和DNA甲基化,并显示全局标准化方法时的例子是不合适的。


【2023.5.31】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593474.html

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

相关文章

VScode软件下载与中文设置

目录 一、下载软件 二、中文设置 一、下载软件 1.网站上下载 2.百度网盘链接下载 链接&#xff1a;https://pan.baidu.com/s/1PMhxaExwhurDVVPkkbbYmw?pwd507o 提取码&#xff1a;507o 就选择路径->同意许可->完成下载 二、中文设置 1.在左侧扩展图标中打开“EXT…

Linux - 第20节 - 网络基础(网络层)

1.IP协议 • IP协议全称为“网际互连协议&#xff08;Internet Protocol&#xff09;”&#xff0c;IP协议是TCP/IP体系中的网络层协议。 • 在主机通信的过程中&#xff0c;上层应用程序解决从应用层代码中获取数据并处理数据的问题&#xff0c;应用层解决的是读取完整报文、序…

Lion:Adversarial Distillation of Closed-Source Large Language Model

Lion:Adversarial Distillation of Closed-Source Large Language Model IntroductionMethodologyexperiment Introduction 作者表明ChatGPT、GPT4在各行各业达到很好的效果&#xff0c;但是它们的模型与数据都是闭源的。现在的主流的方案是通过一个老师模型把知识蒸馏到学生模…

明明开发薪资高,是这几点让我依旧选了测试...

不管是对刚毕业的大学生、工作几年的打工仔亦或者是久不入职场的老人来说&#xff0c;进入职场的方向都值得我们深思。 今天我就来解答下大家最常问的问题&#xff1a;开发和测试作为一个项目中很重要的角色&#xff0c;他们有什么区别呢&#xff1f; Python自动化测试&#x…

Benewake(北醒) 快速实现TFmini-S-IIC与电脑通信的操作说明

目录 1. 概述2. 测试准备2.1 工具准备2.2通讯协议转换 3. IIC通讯测试3.1 引脚说明3.2 测试步骤3.2.1 TFmini-S-IIC 与 PC 建立连接3.2.2 获取测距值3.2.3 更改 slave 地址 1. 概述 通过本文档的概述&#xff0c;能够让初次使用测试者快速了解测试 IIC 通信协议需要的工具以及…

Svn安装

目录 一. 软件环境 二. SVN服务端 1. yum安装svn 2. 查看安装的文件列表 3. 建立版本库 3.1 修改数据存储默认位置 3.2 使用svnadmin建立版本库 4. 配制 4.1 添加用户 4.2 配制读写权限 4.3 配制服务 5. 启动服务 5.1 停止服务 5.2 启动服务 5.3 拉取项目 三.…

Vivado下组合逻辑模块的仿真

文章目录 与门或门非门异或门同或门比较器半加器全加器乘法器数据选择器3-8 译码器三态门 组合逻辑电路的特点是任意时刻的输出仅仅取决于输入信号&#xff0c;输入信号变化&#xff0c;输出立即变化&#xff0c;其变化不依赖于时钟。 本文中的例子中模块名都是gate&#xff0c…

HSE健康安全环境管理,已成现代企业必备的一种管理工具

什么是HSE健康安全环境管理 HSE是英文单词Health&#xff0c;Safety&#xff0c;Environment的缩写&#xff0c;中文翻译就是健康、安全、环境管理的意思。HSE管理是一种科学、系统的企业管理方式&#xff0c;目的是为了以人为本&#xff0c;保障员工和环境的健康和安全&#…

express的使用(三) multer处理表单提交

个人博客 欢迎关注公众号:express的使用(三) multer处理表单提交 看前提示 本篇的主要流程是使用在前端提交一个文件&#xff0c;在nodejs编写的后端使用multer以及express进行接收&#xff0c;包括遇到的版本问题&#xff0c;如果是想要学习用body-parser、formidable、mul…

node.js版本与node-sass版本不一致解决

版本比较图 查看版本对比图&#xff1a; https://www.npmjs.com/package/node-sass node.js版本与node-sass版本不一致时npm install是可能会报错的。 安装对应版本 查看nodejs版本 CMD查看nodejs版本 node -v卸载不一致的node-sass npm uninstall node-sass安装指定版…

JAVA并发编程之锁应用

Java并发包是Java中提供的一个用于支持多线程编程的工具包。Java并发包提供了多种机制来控制线程的执行&#xff0c;保证线程的安全性和可靠性。下面我们将介绍Java并发包的使用方法&#xff0c;并给出示例。 synchronized public class SynchronizedDemo { ​private int v;…

华为云认证有什么?考试难不难?

最近几年华为云的市场占比越来越大&#xff0c;逐渐占据了我们生活中的方方面面&#xff0c;而且很多政企单位&#xff0c;也选择华为云作为合作伙伴&#xff0c;因此市场上也需要越来越多的华为云人才&#xff0c;早在几年前&#xff0c;华为云就已经推出了自己的人才认证系统…

条件随机场模型

条件随机场模型&#xff08;Conditional Random Fields, CRF&#xff09; 条件随机场是给定一组输入随机变量条件下&#xff0c;另一组输出随机变量的条件概率分布模型&#xff0c;其特点是假设输出随机变量构成马尔可夫随机场。线性链条件随机场&#xff0c;是输入序列对输出…

用 JavaScript 对抗 DDOS 攻击

继续趣事分享。 上回聊到了大学里用一根网线发起攻击&#xff0c;今天接着往后讲。 不过这次讲的正好相反 —— 不是攻击&#xff0c;而是防御。一个奇葩防火墙的开发经历。 第二学期大家都带了电脑&#xff0c;于是可以用更高端的方法断网了。但设备先进反而没有了 GEEK 的…

第十七章行为性模式—状态模式

文章目录 状态模式解决的问题反例 结构实例存在的问题使用场景 状态模式与策略模式的区别 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。行为型…

Java中常见转换-数组与list互转、驼峰下划线互转、Map转Map、List转Map、进制转换的多种方式

场景 Java中数组与List互转的几种方式 数组转List 1、最简单的方式,Arrays.asList(array); 创建的是不可变列表&#xff0c;不能删除和新增元素 String[] array new String[]{"a","b"};List<String> stringList Arrays.asList(array);System.ou…

嵌入式和单片机

凡是从事信息技术相关工作的&#xff0c;一定都听说过嵌入式和单片机。 大家都知道&#xff0c;这两个名词&#xff0c;和硬件系统有着非常密切的关系。 但是&#xff0c;如果要问具体什么是嵌入式&#xff0c;什么是单片机&#xff0c;它们之间究竟有什么区别&#xff0c;我…

【NovelAI 小说SD批量生成 文生图】Web版环境配置和使用方法

样片&#xff1a; 【样品】《谜影之夜》文生图全自动版SD一键成片 操作演示&#xff1a; 【txt2video web】携带漫画插件的Web版AI小说生成工具无声演示版 操作口述教程&#xff1a; 【NovelAI】携带漫画插件的Web版AI小说生成视频工具 该文章面向购买脚本的付费用户&#xff0…

钓鱼网站也在使用https加密,如何识别钓鱼网站?

信息安全是一个庞大的领域&#xff0c;其中涉及到很多知识点&#xff0c;但是大多公司都对其没有提及足够的重视&#xff0c;希望随着国内对于安全的越来越重视&#xff0c;更多的公司也能在信息安全领域投入越来越多的注意。 安装SSL证书是为了对数据进行加密传输&#xff0c…

轻松学会食堂管理,就这么简单!

随着科技进步和生活水平的不断提高&#xff0c;人们对于餐饮消费的需求也逐渐变得多样化和个性化。 高校食堂现状分析 01.信息化水平低&#xff0c;学校管理难&#xff0c;无法精准就餐&#xff1b; 02用户满意度低&#xff0c;学生取餐环节效率低&#xff1b; 03.管理效率低…