生信数据批次矫正合集转录组收入即学习

生信小白--关于批次效应的学习及实战

2020-04-12  本文已影响0人  脸妹大雅雅

参考教程:
微信公众号:生信星球
批次效应处理实例:combat和removebatcheffect的对比
特别感谢:
人美心善爱护小白的花花老师
小洁忘了怎么分身

作为一个非常想搞事情的生信小白,我一直想做不同数据集合并分析,下面我就把我的两个数据集合并的心路历程给大家还原一下

希望大家提出意见或者问题,一起进步~

1. 批次效应(Batch Effects)

可以理解为:样本受到检测的实验室条件、试剂批次和人员差异的影响,对结果的准确性造成了影响

2.多组数据集合并分析的流程

(1)条件

(2)流程

3.我的流程

首先,了解数据

我想合并的两个数据集,取材相同,同一芯片平台
(GEO网站上都能找得到)

然后,读入数据,提取数据

rm(list = ls())
options(stringsAsFactors = F)
library(GEOquery)
library(stringr)
gse = "GSE79704"
eSet1 <- getGEO("GSE79704", 
                destdir = '.', 
                getGPL = F)
eSet2 <- getGEO("GSE83582", 
                destdir = '.', 
                getGPL = F)
#(1)提取表达矩阵exp
exp1 <- exprs(eSet1[[1]])
exp1[1:4,1:4]
exp2 <- exprs(eSet2[[1]])
exp2[1:4,1:4]
#将两个数据集行数调整一致,不然没办法合并
table(rownames(exp1) %in% rownames(exp2))
#TRUE 
#25560
length(intersect(rownames(exp1),rownames(exp2)))
#[1] 25560
exp1 <- exp1[intersect(rownames(exp1),rownames(exp2)),]
exp2 <- exp2[intersect(rownames(exp1),rownames(exp2)),]
#(2)提取临床信息
pd1 <- pData(eSet1[[1]])
pd2 <- pData(eSet2[[1]])
#(3)提取芯片平台编号
gpl1 <- eSet1[[1]]@annotation
gpl2 <- eSet2[[1]]@annotation
#两个gpl均为GPL19983

两者的boxplot如下:

exp1.png
exp2.png

然后我仔细思考了要不要先进行组间校正再合并

所以如下我进行了两条路线

(1)直接批次矫正

【1】合并数据
#开始合并
exp = cbind(exp1,exp2)
#合并group_list
group_list1 = c(rep('NN',20),rep('PP',12),rep('GPP',32))
group_list2 = c(rep('NN',12),rep('PP',12),rep('NN',8),rep('EP',30),rep('IP',40))
group_list = c(group_list1,group_list2)
table(group_list)
#group_list
#EP GPP  IP  NN  PP 
#30  32  40  40  24 

boxplot如下:

#boxplot
boxplot(exp,las=2,main='exp-before')
exp-before.png

cluster如下:

#有没有批次效应,看一下聚类的情况
dist_mat <- dist(t(exp))
clustering <- hclust(dist_mat, method = "complete")
plot(clustering,labels = group_list)
cluster-exp-before.png

PCA如下:

#PCA
  dat=as.data.frame(t(exp))
  library(FactoMineR)#画主成分分析图需要加载这两个包
  library(factoextra) 
  # pca的统一操作走起
  dat.pca <- PCA(dat, graph = FALSE)
  fviz_pca_ind(dat.pca,
               geom.ind = "point", # show points only (nbut not "text")
               col.ind = group_list, # color by groups
               #palette = c("#00AFBB", "#E7B800"),
               addEllipses = TRUE, # Concentration ellipses
               legend.title = "Groups"
  )
PCA-exp-before.png
【2-1】limma方法
#处理批次效应:limma
library(limma)
#?removeBatchEffect()

batch <- c(rep("A",64),rep("B",102))
y2 <- removeBatchEffect(exp, batch)

boxplot如下:


exp-limma.png

cluster如下:


cluster-exp-limma.png

PCA如下:


pca-exp-limma.png
【2-2】combat方法
#处理批次效应(combat)
library(sva)
?ComBat

batch <- c(rep("A",64),rep("B",102))
mod = model.matrix(~as.factor(group_list))

y = ComBat(dat=exp, batch=batch, mod=mod)
#Found2batches
#Adjusting for4covariate(s) or covariate level(s)
#Standardizing Data across genes
#Fitting L/S model and finding priors
#Finding parametric adjustments
#Adjusting the Data

boxplot如下:

exp-combat.png

cluster如下:


cluster-exp-combat.png

PCA如下:


pca-exp-combat.png

(2)先组间校正再批次校正

【1】组间校正
#归一化
exp1 = limma::normalizeBetweenArrays(exp1)
exp2 = limma::normalizeBetweenArrays(exp2)
boxplot(exp1,las=2,main='exp1-normalization')
boxplot(exp2,las=2,main='exp2-normalization')

boxplot如下:


exp1-normalization.png exp2-normalization.png
【2】合并数据

boxplot如下:


exp-n-before.png

cluster如下:


cluster-exp-n-before.png

PCA如下:


PCA-exp-n-before.png
【3-1】limma方法

boxplot如下:


exp-n-limma.png

cluster如下:


cluster-exp-n-limma.png

PCA如下:


pca-exp-n-limma.png
【3-2】combat方法

boxplot如下:

exp-n-combat.png

cluster如下:


cluster-exp-n-combat.png

PCA如下:


pca-exp-n-combat.png

4.我把我提前组间校正的数据拿去咨询了花花老师,还是可以看出前后差异的,有时候聚类不成功也是正常的

我对比了一下发现两种方法效果是差不多的

所以总结一下

(1)先组间校正,再批次校正

(2)到底要不要组间校正

我之前看过很多人的分析,众说纷纭……

我个人的理解是,还得是具体实例具体分析。这个问题没有对错。

如果有异常样本(经花花老师校正这个不叫离群值!!!),可以选择去掉异常的样本或者直接组间校正

如果看着蛮规整的,均值相近,做不做归一化都是可以的

所以我是如何处理的呢,我没有处理组间校正,直接批次校正了

最后,再次感谢生信星球的教程跟花花老师超级耐心的指导(我都不知道烦了老师多少次……超级羞愧)~

欢迎大家提出问题或者自己的见解,我们一起探讨

上一篇下一篇

猜你喜欢

热点阅读