转录组数据去批次方法整理(combat,combat-seq,removeBatchEffect)

news2024/9/22 21:17:07
为什么需要去除批次效应?

批次效应是指样本在不同批次处理及测量的情况下引入与生物学情况不相关的技术误差,比如不同试剂耗材,不同操作者,不同的实验时间等。

正是因为这些非生物学的因素存在就有可能会导致我们的结果偏离真实的情况,那么实际分析的过程中研究者应当评估是否存在批次效应,并决定是否要进行去批次处理。

值得注意的是,即使使用了所谓的去批次效应的工具,批次效应仍不能被完全消除,只是尽可能的减少了批次带来的干扰!

载入数据并可视化探索
1.加载R包
rm(list = ls())
library(bladderbatch)
library(sva)
library(ggplot2)
library(FactoMineR) # PCA函数
library(factoextra) # fviz_pca_ind函数
library(pheatmap) # pheatmap函数
library(sva) # 用于combat和combat_seq
library(limma) # 用于removeBatchEffect

proj = "bladderbatch"
2.加载示例数据
data(bladderdata)

pheno = pData(bladderEset)
head(pheno)[1:4,1:4]
#              sample outcome batch cancer
# GSM71019.CEL      1  Normal     3 Normal
# GSM71020.CEL      2  Normal     2 Normal
# GSM71021.CEL      3  Normal     2 Normal
# GSM71022.CEL      4  Normal     3 Normal

exprSet = exprs(bladderEset)
head(exprSet)[1:4,1:4]
#           GSM71019.CEL GSM71020.CEL GSM71021.CEL GSM71022.CEL
# 1007_s_at    10.115170     8.628044     8.779235     9.248569
# 1053_at       5.345168     5.063598     5.113116     5.179410
# 117_at        6.348024     6.663625     6.465892     6.116422
# 121_at        8.901739     9.439977     9.540738     9.254368

batch = pheno$batch
head(batch)
# [1] 3 2 2 3 3 3
3.原始数据可视化
# 样本表达总体分布-箱式图--------------------------------------
mythe <- theme_bw() + theme(panel.grid.major=element_blank(),
                            panel.grid.minor=element_blank())

# 构造绘图数据
data <- data.frame(expression=c(exprSet),
                   sample=rep(colnames(exprSet), 
                              each=nrow(exprSet)))
head(data)
dim(data)

# 箱线图
p <- ggplot(data = data, aes(x=sample, y=expression, fill=sample))
p1 <- p + geom_boxplot() + 
      mythe + 
      theme(axis.text.x = element_text(angle = 90)) + 
      xlab(NULL) + ylab("Expression of genes") #+ scale_fill_nejm()
p1
ggsave("1.sample_boxplot.png", plot = p1, dpi = 600, width = 12, height = 6, units = "in")

# PCA分析--------------------------------------------------
# PCA图时要求是行名时样本名,列名时探针名,因此此时需要转换
exp = t(exprSet)
# 将matrix转换为data.frame 
exp = as.data.frame(exp)
dim(exp)
exp[1:4, 1:4]
#              1007_s_at  1053_at   117_at   121_at
# GSM71019.CEL 10.115170 5.345168 6.348024 8.901739
# GSM71020.CEL  8.628044 5.063598 6.663625 9.439977
# GSM71021.CEL  8.779235 5.113116 6.465892 9.540738
# GSM71022.CEL  9.248569 5.179410 6.116422 9.254368

# 添加分组信息
ac <- data.frame(
  row.names = rownames(exp), 
  Group = pheno$cancer)

# 设置图片标题
pro = proj
this_title <- paste0(pro, '_PCA')

# 绘图
dat.pca <- PCA(exp, graph = FALSE)
p.pca <- fviz_pca_ind(dat.pca,
                   # 只显示点而不显示文本,默认都显示
                   geom.ind = "point",  #c( "point", "text" ) / "point",
                   # geom.ind = 'text',
                   # 设定分类种类
                   col.ind = ac$Group, # color by groups
                   # 设定颜色
                   palette = "jco", # jco/Dark2
                   # 添加椭圆
                   addEllipses = TRUE, # Concentration ellipses
                   # 添加图例标题
                   legend.title = "Groups") +
  ggtitle(this_title) + 
  theme(plot.title = element_text(size=16, hjust = 0.5))
p.pca

# 热图——————————————————————————————————

# 设置图片标题
pro = proj
this_title <- paste0(pro, '_PCA')

# 取方差top1000的基因绘制热图
# 因为基因表达矩阵过大,选择性进行基因过滤
# apply按行('1'是按行取,'2'是按列取)取每一行的方差,从小到大排序,取最大的1000个
cg = names(tail(sort(apply(exprSet, 1, sd)), 1000))
head(cg)
exprSet = exprSet[cg, ] 
exprSet[1:4, 1:4]
dim(exprSet)
# [1] 1000   57

# 绘制热图-check
pheatmap(exprSet, show_colnames = F, show_rownames = F) 

# 数据标准化化及绘图
# scale()函数将每一列看作一个样本数据
n = t(scale(t(exprSet))) 
n[n>2]=2 
n[n< -2]= -2
head(n)

# 标准化后的数据绘制热图-check
pheatmap(n, show_colnames = F, show_rownames = F)

# 添加分组信息
ac <- data.frame(
  row.names = colnames(n), 
  Group = pheno$cancer,
  batch = pheno$batch)

# 绘制添加分组信息热图
p.heatmap <- pheatmap::pheatmap(n,
                         main = pro, # 设置图片标题
                         annotation_col = ac,# 添加列分组信息
                         show_colnames = T,# 不展示列名
                         show_rownames = F,  # 不展示行名
                         breaks = seq(-3, 3, length.out = 100)) # 设置间隔
p.heatmap

# 绘制组间相关性热图(样本-样本)-check
pheatmap::pheatmap(cor(exprSet, method = 'spearman')) 
# 添加分组信息
ac = data.frame(row.names = colnames(exprSet),
                Group = pheno$cancer,
                batch = pheno$batch)

# 绘制组间相关性热图
p.heatmap.cluster <- pheatmap::pheatmap(cor(exprSet),
                          annotation_col = ac, # 添加列分组信息
                          display_numbers = F, # 不显示相关系数
                          show_rownames = F, # 不展示行名
                          show_colnames = T, # 不展示行名
                          main = pro) # 设置图片标题
p.heatmap.cluster

方法一:combat-sva

combat函数是基于贝叶斯框架下的调整数据批次效应的函数,主要适用于已经被过滤和标准化后的数据(芯片数据/非count数据)。

combat去批次-可视化
# 官方展示了三种函数设置方式
# combat_edata1 = ComBat(dat=edata, batch=batch, mod=NULL, par.prior=TRUE, prior.plots=FALSE)
# 参数方法 (par.prior=TRUE): 这种方法假设数据的批次效应可以通过正态分布的参数(均值和方差)来调整。mod=NULL: 这表示在调整批次效应时没有考虑其他协变量。这是一个纯粹的批次效应调整,不考虑如癌症状态等其他因素。
# combat_edata2 = ComBat(dat=edata, batch=batch, mod=NULL, par.prior=FALSE, mean.only=TRUE)
# 非参数方法 (par.prior=FALSE): 这种方法不假设批次效应的参数分布,而是直接估计和调整每个批次的效应,更加灵活地适应各种数据分布。只调整均值 (mean.only=TRUE):这种调整只考虑批次间的均值差异,不调整方差。适用于批次间方差相似,但均值有偏差的情况。
# combat_edata3 = ComBat(dat=edata, batch=batch, mod=mod, par.prior=TRUE, ref.batch=3)
# 包含协变量 (mod=mod): 这里的模型矩阵 mod 包括了癌症状态(cancer),这意味着调整批次效应的同时也会考虑癌症状态的影响,以防止这些生物变量的影响被误当作批次效应调整掉。指定参考批次 (ref.batch=3): 在进行批次效应调整时,将第三个批次作为参照(基准),调整其他批次的数据以匹配这个参照批次的分布。这适用于当某个批次被认为是质量最高或最标准的情况。

# 设置批次信息
batch <- pheno$batch # 批次
# 设置生物学分类,告诉函数不要把生物学差异整没了 
pheno$cancer <- factor(pheno$cancer, levels = c("Normal", "Cancer", "Biopsy"))
mod <- model.matrix(~as.factor(cancer), data=pheno)

expr_combat <- ComBat(dat = exprSet, batch = batch, mod = mod,par.prior=TRUE, ref.batch=1)

可视化代码类似就不展示了

方法二:combat_seq-sva

combat-seq函数是基于二项回归分布下的调整数据批次效应的函数,主要适用于高通量测序数据获得的count数据

combat-seq去批次
# 官方展示了三种函数设置方式
# adjusted <- ComBat_seq(count_matrix, batch=batch, group=NULL)
# group=NULL 表示没有指定生物协变量进行保留。group就是combat中的mod
# adjusted_counts <- ComBat_seq(count_matrix, batch=batch, group=group)
# group 设置了生物学分组
# cov1 <- rep(c(0,1), 4)
# cov2 <- c(0,0,1,1,0,0,1,1)
# covar_mat <- cbind(cov1, cov2)
# adjusted_counts <- ComBat_seq(count_matrix, batch=batch, group=NULL, covar_mod=covar_mat)
# cov1 和 cov2: 两个向量,表示两个不同的生物协变量。这意味着你可以在你的样本中保留两种生物学差异。

# 设置批次信息
batch <- pheno$batch
# 设置生物学分类,告诉函数不要把生物学差异整没了 
mod <- pheno$cancer
# 请注意这里的exprSet数据不是count数据!!!!只是用于演示!!!!
expr_combat_seq <- ComBat_seq(exprSet, batch = batch, group = mod)

因为数据不合适,所以没有进行可视化。

方法三:removeBatchEffect-limma

removeBatchEffect函数是基于线性模型下的调整数据批次效应的函数,主要适用于芯片数据/非count的高通量数据

removeBatchEffect去批次
# 设置批次信息
batch <- pheno$batch # 批次
# 设置生物学分类,告诉函数不要把生物学差异整没了 
pheno$cancer <- factor(pheno$cancer, levels = c("Normal", "Cancer", "Biopsy"))
mod <- model.matrix(~as.factor(cancer), data=pheno)

expr_limma <- removeBatchEffect(exprSet,batch=batch,batch2=NULL,
                                covariates=NULL,design= mod)
# batch/batch2代表的是批次信息;covariates代表那些可能对研究结果有影响的外部变量;design是分析中不会去除与实验核心目的相关的变量,可以理解为生物学分组。

可视化代码类似就不展示了

参考资料:

1、Combat: https://rdrr.io/bioc/sva/man/ComBat.html

2、ComBat-seq: https://github.com/zhangyuqing/ComBat-seq

3、removeBatchEffect:https://rdrr.io/bioc/limma/man/removeBatchEffect.html

4、生信技能树:https://mp.weixin.qq.com/s/8fhDZiGzCna8FY49l18mtQ

5、生信菜鸟团:https://mp.weixin.qq.com/s/E2HLaym_LqJrJLKHjfpX8A

致谢:感谢曾老师以及生信技能树团队全体成员。

:若对内容有疑惑或者有发现明确错误的朋友,请联系后台(欢迎交流)。更多内容可关注公众号:生信方舟

- END -

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

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

相关文章

如何模拟真实的负载情况进行测试?

模拟真实的负载情况是进行性能测试的关键步骤&#xff0c;它可以帮助我们了解系统在高负载下的表现&#xff0c;以及可能出现的问题。以下是一些模拟真实负载的方法&#xff1a; 1. 确定目标&#xff1a;首先&#xff0c;我们需要明确测试的目标&#xff0c;例如&#xff0c;我…

探索Python FastAPI的Annotated参数设计:提升代码的灵活性与可读性

在现代软件开发中&#xff0c;代码的可读性和灵活性是至关重要的。Python的FastAPI框架以其高性能和易用性而受到开发者的喜爱。FastAPI提供了一种名为Annotated的参数设计方式&#xff0c;它允许开发者以类型注解的形式增强函数参数的定义&#xff0c;从而提升代码的表达力和灵…

深度学习(RNN+VAE):高质量的音乐作品让音符飞舞起来

深度学习在音乐生成领域有着广泛的应用&#xff0c;其中循环神经网络&#xff08;RNN&#xff09;和变分自编码器&#xff08;VAE&#xff09;是两种重要的模型。下面是这两种模型在音乐生成中的应用概述&#xff1a; 1. 循环神经网络&#xff08;RNN&#xff09;在音乐生成中…

内存管理【C++】

C/C内存分布 栈又叫堆栈&#xff0c;主要存放非静态局部变量、函数参数、函数返回值&#xff0c;栈一般是向下增长的堆用于程序运行时动态内存分配数据段用于存储全局数据和静态数据代码段用于存储可执行代码和制度常量 C内存管理方式 C语言的内存管理方式在C中可以继续使用&…

RabbitMQ 入门篇

接上一篇《RabbitMQ-安装篇&#xff08;阿里云主机&#xff09;-CSDN博客》 安装好RabbitMQ后&#xff0c;我们将开始RabbitMQ的使用&#xff0c;根据官网文档RabbitMQ Tutorials | RabbitMQ&#xff0c;我们一步一步的学习。 1. "Hello World!" 这里先说明几个概…

电影票竞价系统:开发难度与代码规范全解析

电影票竞价系统成为了一种新兴的购票方式&#xff0c;它不仅提升了用户的购票体验&#xff0c;也为电影院带来了新的盈利模式。但是&#xff0c;这样一个系统的开发难度如何&#xff1f;代码又该如何规范&#xff1f;本文将一探究竟。 电影票竞价系统的开发难度 技术复杂性 …

【Android Studio】项目目录结构

文章目录 常用视图Android视图project视图 gradlebuild.gradleSDK 路径主题 常用视图 Android视图 project视图 gradle build.gradle SDK 路径 主题

怎么在电脑中创建虚拟的加密磁盘?

在电脑中创建虚拟的加密磁盘可以有效保护电脑数据&#xff0c;避免电脑数据泄露。那么&#xff0c;我们该怎么在电脑中创建虚拟的加密磁盘呢&#xff1f;下面我们就一起来了解一下吧。 BitLocker 在使用BitLocker加密虚拟磁盘前&#xff0c;我们需要使用虚拟磁盘工具创建一个虚…

Navicat最新版安装及免费使用教程(全网最靠谱,最简单~)

一、官网下载Navicat&#xff1a; Navicat | 下载 Navicat Premium 14 天免费 Windows、macOS 和 Linux 的试用版 二、百度网盘下载 链接: https://pan.baidu.com/s/1J-2ukx3NDTqvNoQsxnE1Jw 提取码: 5120 解压Navicat16和17补丁工具&#xff0c;然后双击执行压缩包文件中的&a…

分布式训练:大规模AI模型的实践与挑战

简介&#xff1a; 随着人工智能的发展&#xff0c;深度学习模型变得越来越复杂&#xff0c;数据集也越来越大。为了应对这种规模的增长&#xff0c;分布式训练成为了训练大规模AI模型的关键技术。本文将介绍分布式训练的基本概念、常用框架&#xff08;如TensorFlow和PyTorch&a…

企业源代码加密软件推荐,10款超好用的源代码加密软件排行榜

在现代软件开发中&#xff0c;源代码是企业的核心资产之一。保护源代码免受未经授权的访问和盗窃至关重要。源代码加密软件可以为企业提供额外的安全层&#xff0c;确保知识产权和商业秘密得到妥善保护。 1. 安秉源码加密软件 通过驱动层透明加密&#xff0c;确保开发人员在使…

ollama修改模型问答的上下文长度(num_ctx)

文章目录 一劳永逸版&#xff1a;修改模型参数临时抱佛脚之命令行生效临时抱佛脚之API生效没啥卵用之OpenAI API传参没啥卵用之OpenAI 问答传参 在使用ollama做大模型问答的过程中&#xff0c;发现存在着当输入问题过长之后&#xff0c;模型无法回答的问题。经过查询资料&#…

做一个图片马(图片木马)的四种方法 小白也能看会(详细步骤 ) 需要.htaccess等执行图片内代码

简介 图片马:就是在图片中隐藏一句话木马。利用.htaccess等解析图片为PHP或者asp文件。达到执行图片内代码目的 4种制作方法: 文本方式打开,末尾粘贴一句话木马 cmd中 copy 1.jpg/b2.php 3.jpg 16进制打开图片在末尾添加一句话木马。 ps 注意以下几点: 单纯的图片马并不…

TCP/IP_TCP协议

目录 一、TCP协议 1.1 确认应答 1.2 超时重传 1.3 连接管理 1.4 TCP状态 1.5 滑动窗口 1.6 流量控制 1.7 拥塞控制 1.8 延迟应答 1.9 捎带应答 1.10 粘包问题 1.11 异常情况 二、TCP/UDP对比 总结 一、TCP协议 TCP 协议和 UDP 协议是处于传输层的协议。 【TCP协…

WEB服务器的详解与部署

WEB服务器也称为网页服务器或HTTP服务器 WEB服务器使用的协议是HTTP或HTTPS HTTP协议默认端口号&#xff1a;TCP 80 HTTPS协议默认端口号&#xff1a;TCP 443 浏览器其实就是 HTTP 客户端 WEB服务器发布软件 微软&#xff1a;IIS(可以发布web网站和FTP站点)linux&#x…

Java:多线程(进程线程、线程状态、创建线程、线程操作)

1&#xff0c;线程概述 1.1&#xff0c;进程和线程 并发是指系统能够同时处理多个任务或操作&#xff0c;通常通过在单个处理器或多个处理器之间快速切换上下文来实现。这些任务可能不是同时进行的&#xff0c;但是它们在时间上重叠。 并行是指系统同时执行多个任务或操作&…

tkinter绘制组件(42)——工具栏按钮组件

tkinter绘制组件&#xff08;42&#xff09;——工具栏按钮组件 引言布局函数结构背景板创建按钮移动背景板完整代码函数 效果测试代码最终效果 github项目pip下载结语 引言 在TinUI中&#xff0c;并不存在工具栏这个概念&#xff0c;但是可以通过使用BasicTinUI控件&#xff…

第二证券:港股交易规则有哪些?

港股的生意规矩&#xff1a; 1、港股生意时间&#xff1a;港股商场的生意时间分为上午和下午两个时段&#xff0c;上午的生意时间通常是9:30至12:00&#xff0c;而下午的生意时间则是13:00至16:00。需求留心的是&#xff0c;港股在周末及法定节假日会休市&#xff0c;此外恶劣…

ECC加密算法:一种高效且安全的加密技术

ECC&#xff08;Elliptic Curve Cryptography&#xff09;&#xff0c;即椭圆曲线密码算法&#xff0c;是一种基于椭圆曲线数学理论的公钥加密算法。自1985年由Neal Koblitz和Victor S. Miller分别独立提出以来&#xff0c;ECC凭借其独特的数学原理和高效的性能&#xff0c;逐渐…