方差稳定变换(Variance Stabilizing Transformation)介绍,专业生物学领域统计

news2024/10/1 7:29:02

介绍

方差稳定变换(Variance Stabilizing Transformation,VST)是一种统计方法,用于将一个具有异方差性的随机变量(即方差随着均值的变化而变化的变量)转换为方差相对稳定的变量。这种转换在数据分析和建模中非常有用,因为许多统计方法(如线性回归)假设数据的方差是恒定的,即同方差性(Homoscedasticity)。通过使用VST,可以满足这些假设,从而提高模型的有效性和准确性

方差稳定变换的背景和动机

在许多实际数据集中,响应变量的方差可能会随其均值变化。例如,在Poisson分布中,方差等于均值;在二项分布中,方差与均值的函数关系为
𝑛𝑝(1−𝑝)其中 𝑝 是成功的概率。因此,当数据存在异方差性时,直接进行统计分析可能会导致错误的结论。

方差稳定变换的主要目标是找到一个合适的变换,使得变换后的数据具有稳定的方差,这样就能更好地满足统计模型的假设。

常见的方差稳定变换

平方根变换(Square Root Transformation):
对于具有Poisson分布的计数数据,方差与均值成正比关系。通过平方根变换,可以使得方差趋于稳定。
变换公式: Y ′ Y' Y= Y \sqrt{Y} Y
这种变换通常用于计数数据,当数据的方差接近均值时特别有效

对数变换(Logarithmic Transformation)
对于数据方差随均值呈指数关系的数据,可以通过对数变换来稳定方差.
变换公式: Y ′ Y' Y=log( Y Y Y+ c c c)
其中 𝑐 是一个常数,通常用于避免对零值进行对数变换而导致的数学问题。对数变换在处理经济数据和生物数据时非常常见。
反正弦平方根变换(Arcsine Square Root Transformation)
对于比例数据或百分比数据(通常在0到1之间),可以使用反正弦平方根变换。
变换公式: Y ′ Y' Y=arcsin( Y \sqrt{Y} Y )
这种变换在生态学和遗传学中处理比例数据时经常使用
Box-Cox变换
Box-Cox变换是一种广义的变换方法,可以通过调整参数来找到最适合数据的方差稳定变换。
变换公式: Y ′ Y' Y= Y λ − 1 λ \frac{Y^\lambda-1}{\lambda} λYλ1( λ \lambda λ≠0)
当 𝜆=0 时,Box-Cox变换退化为对数变换。
通过估计最佳的 𝜆 值,Box-Cox变换能够灵活适应不同类型的数据

方差稳定变换的应用场景

生物统计学
在处理生物数据(如基因表达数据、计数数据)时,经常需要应用方差稳定变换,以使得数据满足模型的假设。
例如,在RNA-seq数据分析中,通常使用对数变换来稳定基因表达的方差
经济学和金融学
对数变换在经济和金融时间序列数据中应用广泛,如股票价格、GDP等。这些数据的方差往往随着均值的增加而增加
生态学
在生态学中,处理物种丰度、种群密度等数据时,常用平方根变换或反正弦平方根变换来处理比例或计数数据
图像处理
在图像处理领域,方差稳定变换可以用于增强图像的对比度,减少噪声对图像的影响

方差稳定变换的优缺点

优点:

使数据满足模型假设:通过稳定方差,方差稳定变换帮助数据更好地满足统计模型(如线性回归)的同方差性假设。
增强数据解释性:变换后的数据通常更适合于解释和预测,特别是在非线性关系显著的情况下。
通用性:多种变换方法可以适用于不同类型的数据和分布,具有较强的适应性

缺点:

信息丢失:某些情况下,变换可能导致数据的原始信息或直观意义丢失,特别是当变换过度时。
复杂性增加:对数据进行变换后,可能需要额外的步骤将结果转换回原始尺度进行解释,这增加了分析的复杂性。
模型误差:不适当的变换可能导致模型误差的引入,特别是如果变换后的数据依然不满足模型假设时。

本文示例

我们将使用方差稳定变换技术对这些数据进行处理,以便更好地进行下游分析(如差异表达分析或聚类分析)
假设我们有RNA-seq基因表达数据,其中每个基因的表达水平是通过测序得到的原始计数数据。由于RNA-seq数据通常具有Poisson或负二项分布的特性,这意味着这些数据的方差随着均值的增加而增加。因此,直接使用这些数据进行分析可能会导致不准确的结果。为了稳定方差,我们将使用对数变换、方差稳定化变换(如VST或rlog变换)来处理这些数据

核心代码

% 清理工作区
clear;
clc;
close all;

%% Step 1: 生成或导入RNA-seq基因表达计数数据
% 假设我们有500个基因和100个样本的表达数据
numGenes = 500;
numSamples = 100;

% 生成Poisson分布的模拟数据,基因表达水平不同,方差随均值变化
rng(0); % 固定随机种子
trueMean = randi([10, 1000], numGenes, 1); % 每个基因的真实表达均值
countData = poissrnd(repmat(trueMean, 1, numSamples)); % 生成计数数据

% 可视化原始计数数据的分布
figure;
subplot(1,2,1);
histogram(log10(countData(:) + 1), 50);
title('Log10 of Raw Counts');
xlabel('Log10(Count + 1)');
ylabel('Frequency');
grid on;

% 基因表达的均值-方差关系
meanExpression = mean(countData, 2);
varExpression = var(countData, 0, 2);
subplot(1,2,2);
scatter(meanExpression, varExpression);
title('Mean-Variance Relationship');
xlabel('Mean Expression');
ylabel('Variance');
grid on;

%% Step 2: 方差稳定变换

% 对数变换
logData = log2(countData + 1);

% 方差稳定化变换(使用伽马分布逼近)
% 近似的方差稳定化变换可以考虑 rlog 转换
% 这里我们用 log(countData + pseudo-count) 的变体来近似


% 使用DESeq2等软件包实现的rlog变换通常是推荐的,这里展示简单近似
% 实际中可以考虑使用第三方包进行处理

% 可视化变换后的数据分布
figure;
subplot(1,2,1);
histogram(logData(:), 50);
title('Log2 Transformed Data');
xlabel('Log2(Count + 1)');
ylabel('Frequency');
grid on;

subplot(1,2,2);
histogram(vstData(:), 50);
title('Variance Stabilized Data');
xlabel('Transformed Expression');
ylabel('Frequency');
grid on;

% 变换后的均值-方差关系
meanVstExpression = mean(vstData, 2);
varVstExpression = var(vstData, 0, 2);
figure;
scatter(meanVstExpression, varVstExpression);
title('Mean-Variance Relationship (After VST)');
xlabel('Mean Expression');
ylabel('Variance');
grid on;

%% Step 3: 差异表达分析
% 生成两个条件下的样本(50个样本每个条件)
condition1 = vstData(:, 1:50); % 条件1的样本
condition2 = vstData(:, 51:100); % 条件2的样本

% 简单t检验来评估差异表达(实际中更常用的是DESeq2, edgeR等专用方法)


% 使用Benjamini-Hochberg方法进行p值调整
adjPValues = mafdr(pValues, 'BHFDR', true);

% 显示显著差异表达的基因数量
significantGenes = sum(adjPValues < 0.05);


% 可视化火山图(Volcano Plot)
logFoldChange = mean(condition2, 2) - mean(condition1, 2);
figure;
scatter(logFoldChange, -log10(pValues));
hold on;
scatter(logFoldChange(adjPValues < 0.05), -log10(pValues(adjPValues < 0.05)), 'r');
title('Volcano Plot');
xlabel('Log2 Fold Change');
ylabel('-Log10(p-value)');
grid on;

%% Step 4: 主成分分析和聚类分析


% 可视化前两个主成分
figure;
scatter(score(1:50, 1), score(1:50, 2), 'r', 'DisplayName', 'Condition 1');
hold on;
scatter(score(51:100, 1), score(51:100, 2), 'b', 'DisplayName', 'Condition 2');
xlabel(['PC1 (' num2str(explained(1), '%.2f') '%)']);
ylabel(['PC2 (' num2str(explained(2), '%.2f') '%)']);
legend('show');
title('PCA of Variance Stabilized Data');
grid on;

% 使用k-means聚类
k = 2; % 假设我们知道有两个群体
clusterIdx = kmeans(vstData', k);

% 可视化聚类结果
figure;
gscatter(score(:, 1), score(:, 2), clusterIdx);
xlabel(['PC1 (' num2str(explained(1), '%.2f') '%)']);
ylabel(['PC2 (' num2str(explained(2), '%.2f') '%)']);
title('K-means Clustering on PCA Results');
grid on;

代码说明

数据生成或导入:
生成了500个基因在100个样本中的RNA-seq计数数据,使用Poisson分布模拟表达水平不同的基因表达数据。

方差稳定变换:
对数变换:应用 log2(count + 1) 变换以降低方差。
方差稳定化变换:使用简单的伽马分布逼近方法来实现VST(方差稳定化变换),这是一种更复杂的对数变换。

差异表达分析:
对两个条件下的样本进行差异表达分析,使用 t-test 和Benjamini-Hochberg方法进行p值调整,并生成火山图(Volcano Plot)来可视化显著差异表达基因。

主成分分析和聚类分析:
使用PCA将数据降维,并可视化前两个主成分的分布。
使用 k-means 聚类方法对数据进行聚类分析,并将聚类结果与PCA结果结合进行可视化。

效果图示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创新扩展

rlog 变换:在实际应用中,推荐使用DESeq2等工具包实现的rlog变换,这些工具会根据数据的特性自动进行复杂的方差稳定化处理。
更复杂的统计分析:使用更复杂的差异表达分析工具,如 DESeq2、edgeR 或 limma-voom,它们专为处理RNA-seq数据而设计。
多组数据比较:可以扩展分析到多个条件下的数据比较,并使用更高级的多变量统计方法

完整代码获取

关注下列卡片公众号,回复“VST”获取完整代码

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

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

相关文章

【网络】TCP协议详解(下)

上文介绍了TCP传输控制协议的报头&#xff0c;并且渗透了TCP保证可靠性的策略&#xff1a;如流量控制、按序到达、确认应答机制以及超时重传。本文继续讲解TCP剩下的协议&#xff0c;剩下俩个大话题&#xff0c;难度都比较麻烦。 本文将介绍TCP协议最常见的三次握手和四次挥手…

腾讯地图SDK Android版开发 7 覆盖物示例1

腾讯地图SDK Android版开发 7 覆盖物示例1 前言界面布局MapMarker类常量成员变量初始值Marker点击事件Marker拖拽事件创建覆盖物移除覆盖物设置属性 MapMarkerActivity类控件响应事件 运行效果图 前言 文本介绍Marker的常用属性、交互和碰撞示例。 示例功能如下&#xff1a; …

【计算机网络】认识端口号 认识传输层协议 认识网络字节序 认识socket套接字

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

收银系统源码—千呼新零售【硬件篇】

连锁店收银系统源码—多商户平台入驻商城已上线-CSDN博客文章浏览阅读1k次。零售行业连锁店收银管理系统多商户入驻本地生活即时零售平台商城https://blog.csdn.net/V15850290240/article/details/141310629 详细介绍请查看上方文章↑↑↑ 详细介绍请查看上方文章↑↑↑ 详细…

[大模型]配置文件-Langchain-Chatchat-V0.3 (1)

文章目录 简述本地配置配置文件model_settings.yaml使用Ollama配置模型配置 使用Xinference配置模型配置修改默认使用的模型 对话基础对话知识库对话 简述 针对Langchain-Chatchat-V0.3版本&#xff0c;对配置文件与模型使用说明&#xff0c;本文建议使用Ollama配合Chatchat使…

用Python实现9大回归算法详解——09. 决策树回归算法

1. 决策树回归的基本概念 决策树回归&#xff08;Decision Tree Regression&#xff09;是一种树状结构的回归模型&#xff0c;通过对数据集进行递归分割&#xff0c;将数据分成更小的子集&#xff0c;并在每个子集上进行简单的线性回归。决策树的核心思想是通过选择特征及其阈…

centos7.9系统安装cloudpods并使用ceph存储(二)

1.ceph安装 1.1 环境准备 配置hosts&#xff1a; $ vim /etc/hosts 10.121.x.x node01设置ssh无密码登录&#xff1a; # ssh-keygen -t rsa # ssh-copy-id -i /root/.ssh/id_rsa node01关闭selinux、firewalld # setenforce 0 # sed -i "s#SELINUXenforcing#SELINUXd…

国自然研究热点、“C位出圈”的类器官研究离不开细胞因子

前 言&#xff1a; 目前&#xff0c;类器官已从基础研究发展至药物开发和精准治疗。在疾病建模、药物开发、肿瘤研究、再生医学、精准医学等领域发展迅速。类器官与体内器官在功能和结构上的高度相似&#xff0c;使其广泛用于发育生物学和疾病建模。传统的2D细胞模型和模式动物…

k8s之Pod对象多种调度方式

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Redis数据库一文入门

Redis 是一个用于存储和管理数据的开源内存数据结构存储系统。它以其高性能和丰富的数据结构支持而闻名&#xff0c;是构建高效、可扩展应用程序的理想选择。本文将带你入门 Redis&#xff0c;并探讨其基本概念、安装步骤和一些常见的使用场景。 什么是 Redis&#xff1f; Re…

疯感工牌的风还是吹到了L4级无人驾驶

俗话说得好&#xff0c;打工人哪有不疯的&#xff1f; 最近你是不是也被“发疯工牌梗”刷屏了 一张张看似情绪稳定的工牌 以独特的方式展现了属于打工人自己的个性 这不&#xff0c;疯感工牌的风也吹到了无人驾驶 无人车也有了属于自己的时尚单品 看看它们都是如何介绍自己的&a…

Wot Design Uni:一个高颜值、轻量化的uni-app组件库,uni-app生态的新宠

一、介绍 wot-design-uni组件库基于vue3Typescript构建&#xff0c;参照wot design的设计规范进行开发&#xff0c;提供70高质量组件&#xff0c;支持暗黑模式、国际化和自定义主题&#xff0c;旨在给开发者提供统一的UI交互&#xff0c;同时提高研发的开发效率。 特性&#x…

新的网络钓鱼方法针对 Android 和 iPhone 用户

关注公众号网络研究观获取更多内容。 ESET 研究人员发现了一种针对 Android 和 iPhone 用户的不常见网络钓鱼活动。 他们分析了一起针对捷克某知名银行客户的网络钓鱼案例。 网络钓鱼流程 这种技术值得注意&#xff0c;因为它会从第三方网站安装钓鱼应用程序&#xff0c;而无…

数据可视化大屏模板-美化图表

Axure作为一款强大的原型设计软件&#xff0c;不仅擅长构建交互式界面&#xff0c;更在数据可视化方面展现出了非凡的创意与实用性。今天&#xff0c;就让我们一起探索Axure设计的几款精美数据可视化大屏模板&#xff0c;感受数据之美。 立体图表的视觉冲击力 Axure的数据可视…

【大模型理论篇】基于3D可视化视角理解GPT

1. 背景介绍 先前我们通过多篇技术文章来分析大模型的原理&#xff0c;包括&#xff1a; 《Transformer原理及关键模块深入浅出》《GPT系列预训练模型原理讲解》、《大模型时代下Bert去哪啦》、《关于LLaMA 3.1 405B以及小模型的崛起》、《LLaMA3结构关键模块分析》、《强化学习…

JS基础进阶2-操作元素

目录 1.操作元素-修改DOM&#xff08;文档对象模型&#xff09;元素 1. 修改元素的文本内容 2. 修改元素的样式 3. 修改元素的属性 4. 修改元素的类名 5.修改body元素 2.修改自定义属性 2.1H5中设置自定义属性、 2.2使用JavaScript修改自定义属性 3.节点操作 3.1节点概…

不懂就问,换毛季猫咪疯狂掉毛怎么办?宠物浮毛该如何清理?

最近天气变热了&#xff0c;每天都30度以上&#xff0c;我家猫狂掉毛&#xff0c;床上、地板上堆积了不少。第一次养猫的我没见过这种阵仗&#xff0c;以为它生病了&#xff0c;连忙带它去看医生。医生告诉我&#xff0c;这是正常的猫咪换毛现象&#xff0c;我才放下心来。原来…

Python代码加密打包发布

本博客主要介绍&#xff1a; 1. 将python代码编译为so&#xff08;win环境是pyd&#xff09; 2.打包生成wheel文件&#xff0c;可以使用pip 进行安装 1. 项目结构 注意&#xff0c;__init__.py文件是必须的&#xff0c;内容可为空 2. example.py 里面是自己写的一些方法&am…

【hot100篇-python刷题记录】【滑动窗口最大值】

R6-子串篇 目录 Max Sort 单调队列法&#xff1a; Max 完了&#xff0c;我好像想到python的max class Solution:def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:ret[]left,right0,kwhile right<len(nums):ret.append(max(nums[left:right]))ri…

聊聊 PHP 多进程模式下的孤儿进程和僵尸进程

在 PHP 的编程实践中多进程通常都是在 cli 脚本的模式下使用&#xff0c;我依稀还记得在多年以前为了实现从数据库导出千万级别的数据&#xff0c;第一次在 PHP 脚本中采用了多进程编程。在此之前我从未接触过多进程&#xff0c;只知道 PHP-FPM 进程管理器是多进程模型&#xf…