数据存在批次效应?来这里让大海哥教你怎么处理






数据存在批次效应?来这里让大海哥教你怎么处理

大海哥  生信果  2023-09-06 19:00:56

点击蓝字 关注我们

大家好,我是大海哥,今天大海哥给大家带来的不同于以往只是简单的技术分享,今天要分享的更是我们追求科研真实性路上的一个重要方法,没错,就是数据批次效应。那么很多不了解的小伙伴就要问了,数据批次效应是什么呢?大海哥先来给大家介绍一下其原理。
批次效应(Batch Effect)是在实验设计和高通量实验数据分析中常见的一个概念,它指的是同一实验中的不同批次(或者来源、时间、实验条件等不同因素)之间引入的系统性变异。这些批次效应可能会对实验结果的解释和数据分析造成干扰,因为它们可能掩盖了与感兴趣因素无关的变异,从而导致误解。批次效应在基因表达分析、蛋白质组学、代谢组学等高通量数据研究中特别常见。

主要的批次效应可能包括:

技术批次效应:

这种效应源自于实验设备、试剂、操作者等技术因素的差异,可能会导致数据在不同批次之间产生变异。

生物批次效应:

这种效应可能是由于实验样本来源的变化,如不同的动物个体、人体样本、细胞系等,以及实验环境的变化,如温度、湿度等,引起的系统性变异。
时间批次效应:如果实验在不同时间点进行,可能会引入时间相关的变异,如季节性变化、生长阶段变化等

数据处理批次效应:

在数据分析过程中,如果采用了不同的数据处理方法、参数或软件工具,也可能导致批次效应。
今天,大海哥就要对存在批次效应的基因表达数据进行处理,让他们可以完美融合!

今天,大海哥就要对存在批次效应的基因表达数据进行处理,让他们可以完美融合!

#首先,我们下载一下对应的数据#我们选择GEO数据的两个存在批次效应的数据哦!rm(list = ls())options(stringsAsFactors = F)library(GEOquery)eSet1 <- getGEO("GSE83521",                destdir = '.',                getGPL = F)#(1)提取表达矩阵expexp1 <- exprs(eSet1[[1]])exp1[1:4,1:4]dim(exp1)#然后我们看一下这个数据的箱型图# 一定要看boxplotboxplot(exp1,las=2)
pd1 <- pData(eSet1[[1]])#(3)提取芯片平台编号gpl1 <- eSet1[[1]]@annotation#然后开始下载第二个数据eSet2 <- getGEO("GSE89143",                destdir = '.',                getGPL = F)#(1)提取表达矩阵expexp2 <- exprs(eSet2[[1]])exp2[1:4,1:4]dim(exp2)boxplot(exp2,las=2)
#从上面的箱线图结果可以看到,数值的表达量并不在同一条水平线上,并且有成败上千,也有零,很明显是没有经过log的。这是需要把数据log后再用boxplot来看数据的分布#log(x+1)预处理一下exp2 = log2(exp2+1)boxplot(exp2,las=2)
#然后我们再使用一个厉害的函数normalizeBetweenArrayslibrary(limma)exp2=normalizeBetweenArrays(exp2)boxplot(exp2,las=2)
#可以看到,现在数据集2的数据都基本上处于统一范围区间了,可以进行下一步操作了#探针注释#这一步也是我们日常使用GEO数据必须要有的操作,这里也顺便介绍一下吧#(2)提取临床信息pd2 <- pData(eSet2[[1]])#(3)提取芯片平台编号gpl2 <- eSet2[[1]]@annotationgpl2gpl1#是同一个平台!很不错if(T){  library(GEOquery)  gpl<- getGEO('GPL19978', destdir=".")  dim(gpl)  colnames(Table(gpl)) #查一下列明  head(Table(gpl)[,c(1,2)])  ids=Table(gpl)[,c(1,2)]  ids <- ids[-c(1:2),]  ids <- ids[-c(1:13),]  save(ids,file='ids.Rdata')}

#看一下对应关系


#本次使用的算法是支持lp、distr以及crank,所以上图中对应的指标都支持哦!#同样支持IBS指标,我们看看,一行搞定p$score(msrs("surv.brier"))
#合并数据x1 <- exp1[rownames(exp1) %in% ids$ID,]x2 <- exp2[rownames(exp2) %in% ids$ID,]boxplot(x1,las=2)boxplot(x2,las=2)cg=intersect(rownames(x1),rownames(x2))x_merge=cbind(x1[cg,],x2[cg,])#我们看一下合并后的结果boxplot(x_merge)
#上面这张图,就是非常明显的看到了,由于后面的三个样本就是来自另一个数据集的。所以这种就是说明其存在批次效应#差异分析去除批次效应pd1$titlepd2$characteristics_ch1group_list <- c(rep('tumor',6),rep('normal',6),rep(c('tumor', 'normal'),each=3))gse <- c(rep('GSE83527',12),rep('GSE89143',6))table(group_list,gse)dat <- x_mergelibrary(sva)library(limma)## 使用 limma 的 removeBatchEffect 函数dat[1:4,1:4]batch <- c(rep('GSE83521',12),rep('GSE89143',6))design=model.matrix(~group_list)ex_b_limma <- removeBatchEffect(dat,                                batch = batch,                                design = design)dim(ex_b_limma)#这个时候一定要看 boxplot,不然就白看了这么久了!

从上面的图可以看到了,去除了批次效应后,数据的表达水平基本符合正常了,这也说明本次代码实现了我们的目的。大功告成!


总结一下,重要的如下:
第一点,我们要理解boxplot的重要性,来看数据集是否需要log,以便后面才能用limma包进行差异分析,第二点,normalizeBetweenArrays只能是在同一个数据集里面用来去除样本的差异,不同数据集需要用limma 的 removeBatchEffect函数去除批次效应。
好了,今天的分享就到这里啦,大家结束后一定要自己动手试试哦!看看有没有新发现!(最后推荐一下大海哥新开发的零代码云生信分析工具平台包含超多零代码小工具,上传数据一键出图,感兴趣的小伙伴欢迎来参观哟,网址:http://www.biocloudservice.com/home.html)

点击“阅读原文”进入网址