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

为什么需要去除批次效应?

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

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

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

载入数据并可视化探索
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) # 用于removeBatchEffectproj = "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 NormalexprSet = 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.254368batch = 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.rhkb.cn/news/388529.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络通信---UDP

前两天做了个mplayer项目&#xff0c;今日继续学习 网络内容十分重要&#xff01;&#xff01;&#xff01; 1.OSI七层模型 应用层:要传输的数据信息&#xff0c;如文件传输&#xff0c;电子邮件等&#xff08;最接近用户&#xff0c;看传输的内容类型到底是什么&#xff09; …

精进日常:每日练习与明智取舍的艺术

目录 题目1.对于非运行时异常&#xff0c;程序中一般可不做处理&#xff0c;由java虚拟机自动进行处理。2.下面哪个关键字可以用于Java的构造方法上&#xff1f;3.以下代码执行的结果显示是多少&#xff08; &#xff09;&#xff1f;注解总结 题目 选自牛客网 1.对于非运行时…

[工具推荐]前端加解密之Burp插件Galaxy

如果觉得该文章有帮助的&#xff0c;麻烦师傅们可以搜索下微信公众号&#xff1a;良月安全。点个关注&#xff0c;感谢师傅们的支持。 免责声明 本号所发布的所有内容&#xff0c;包括但不限于信息、工具、项目以及文章&#xff0c;均旨在提供学习与研究之用。所有工具安全性…

前后端demo-WarehouseManagement

前端 数据库 其他 1.git下来&#xff0c;解决依赖问题&#xff0c;前端报错因为字体文件丢失&#xff0c;下载字体放到fonts文件夹字体.zip官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 2.后端login验证&#xff0c;前端需要账号格式&#xff0c;linqq.com 3.自己…

国产麒麟操作系统下搞单机版

去年纪委单位的一个项目&#xff0c;因为单位保密性质&#xff0c;档案必须要保密&#xff0c;要求采用单机版&#xff0c; 要求跟EXE那样&#xff0c;双击打开&#xff0c;阿公单位信息人员电脑操作水平化滞后还是相当严重啊。 去年已经给他花了时间按他们的要求实现了。 上周…

嵌入式C++、ROS 、OpenCV、SLAM 算法和路径规划算法:自主导航的移动机器人流程设计(代码示例)

在当今科技迅速发展的背景下&#xff0c;嵌入式自主移动机器人以其广泛的应用前景和技术挑战吸引了越来越多的研究者和开发者。本文将详细介绍一个嵌入式自主移动机器人项目&#xff0c;涵盖其硬件与软件系统设计、代码实现及项目总结&#xff0c;并提供相关参考文献。 项目概…

Day14-Servlet后端验证码的实现

图片验证码的生成采用的是Kaptcha&#xff1b; Kaptcha是一个高度可配置的验证码生成工具&#xff0c;由Google开源。它通过一系列配置文件和插件&#xff0c;实现了将验证码字符串自动转换成图片流&#xff0c;并可以与session进行关联&#xff0c;从而在验证过程中使用&#…

unity2D游戏开发17战斗精灵

导入 将PlayerFight32x32.png拖Player文件夹进去 设置属性 创建动画剪辑 选中前四帧,右键Create|Animation,将动画命名为player-ire-east 其他几个动画也创建好后,将其拖到Animations|Animations文件夹 选中PlayerController,再点击Animator 创建新的Blend Tree Graph,并重…

mysql逻辑架构与sql执行过程

目录 1.背景 2.mysql逻辑架构图 3.逻辑架构解读 第一层:连接层 第二层:服务层 1.Management Serveices & Utilities 2.SQL Interface:SQL接口 3.Parser:解析器 4.Optimizer:查询优化器 5.Caches 和 Buffers:查询缓存组件 第三层:存储引擎层 第四层:数据存储层 …

后端笔记(2)--JDBC

1.JDBC简介 *JDBC(Java DataBase Connectivity)就是使用java语言操作关系型数据库的一套API *JDBC本质&#xff1a;&#xff08;可以使用同一套代码&#xff0c;操作不同的关系型数据库&#xff09; ​ *官方定义的一套操作所有关系型数据库的规则&#xff0c;即接口 ​ *各…

基于java的人居环境整治管理系统(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝20W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

“八股文”面试题:是招聘程序员的金科玉律?

引言 随着互联网的发展&#xff0c;现代企业对程序员的需求日益增加。在招聘过程中&#xff0c;许多公司采用了“八股文”式的面试题目来筛选候选人。这些题目往往涵盖了算法、数据结构、系统设计等方面的基础知识。然而&#xff0c;对于“八股文”在实际工作中的作用&#xf…

为什么越来越多的IT青年转行网络安全?

目前&#xff0c;我国互联网已经从爆发增长期进入平稳发展阶段&#xff0c;同时每年大量计算机相关专业的毕业生涌入就业市场&#xff0c;导致IT行业逐渐趋于饱和状态&#xff0c;甚至出现裁员现象&#xff0c;去年很多大厂都有裁员&#xff0c;不少程序员再就业成了难题。 面…

网络安全相关工作必须要有证书吗?

在当今数字化时代&#xff0c;网络安全已成为至关重要的领域。然而&#xff0c;对于从事网络安全相关工作的人员来说&#xff0c;证书是否是必不可少的呢? 一、网络安全证书的重要性 网络安全证书在一定程度上能够证明从业者具备相关的知识和技能。例如&#xff0c;CISP 作为国…

昇思25天学习打卡营第XX天|RNN实现情感分类

希望代码能维持开源维护状态hhh&#xff0c;要是再文件整理下就更好了&#xff0c;现在好乱&#xff0c;不能好fork tutorials/application/source_zh_cn/nlp/sentiment_analysis.ipynb MindSpore/docs - Gitee.com

python:plotly 网页交互式数据可视化工具

pip install plotly plotly-5.22.0-py3-none-any.whl pip install plotly_express 包含&#xff1a;GDP数据、餐厅的订单流水数据、鸢尾花 Iris数据集 等等 pip show plotly Name: plotly Version: 5.22.0 Summary: An open-source, interactive data visualization librar…

使用 Elasticsearch 和 LlamaIndex 保护 RAG 中的敏感信息和 PII 信息

作者&#xff1a;来自 Elastic Srikanth Manvi 在这篇文章中&#xff0c;我们将研究在 RAG&#xff08;检索增强生成&#xff09;流程中使用公共 LLMs 时保护个人身份信息 (personal identifiable information - PII) 和敏感数据的方法。我们将探索使用开源库和正则表达式屏蔽 …

【Linux】文件描述符 fd

目录 一、C语言文件操作 1.1 fopen和fclose 1.2 fwrite和fread 1.3 C语言中的输入输出流 二、Linux的文件系统调用 2.1 open和文件描述符 2.2 close 2.3 read 2.4 write 三、Linux内核数据结构与文件描述符 一、C语言文件操作 在C语言中我们想要打开一个文件并对其进…

【达梦数据库】通过线程pid定位会话SQL

【达梦数据库】通过线程pid定位会话SQL 1、查找数据库进程 ps -ef|grep dmserver2、通过进程pid去找对应的线程 top -H -p $pid -------------------- top命令经常用来监控linux的系统状况&#xff0c;是常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用…

大学新生如何高效入门编程?全面指南来助力

引言 在当今数字化时代&#xff0c;编程已经成为一项必备技能。无论你未来从事什么职业&#xff0c;编程能力都能为你的职业生涯增添光彩。对于即将步入大学的新生来说&#xff0c;如何高效入门编程是一道关键课题。本文将从如何选择编程语言、制定学习计划、找到顶尖学习资源…