title: DALS025-批次效應(yīng)01-什么是批次效應(yīng)
date: 2019-08-25 12:0:00
type: "tags"
tags:
- 批次效應(yīng)
categories: - Data Analysis for the life sciences
前言
這一部分是《Data Analysis for the life sciences》的第10章批次效應(yīng)的第1小節(jié),這一部分的主要內(nèi)容涉及批次效應(yīng)(Batch Effects)的介紹,有關(guān)批次效應(yīng)的前言部分Rmarkdown文檔參見作者的Github。
什么是批次效應(yīng)
高通量研究中一個(gè)經(jīng)常被忽視的問題就是批次效應(yīng)(batch effects),批次效應(yīng)受到當(dāng)時(shí)檢測的實(shí)驗(yàn)室條件、試劑批次和人員差異的影響。當(dāng)批次效應(yīng)與我們目標(biāo)結(jié)果混淆并愜以不正確的結(jié)果時(shí),這就成了一個(gè)主要問題。在這一章中,我們將詳細(xì)地描述批次效應(yīng):對于批次效應(yīng)如何檢測、解釋、建模和調(diào)整。
批次效應(yīng)是基因組學(xué)研究中面臨的最大挑戰(zhàn),尤其是在精確醫(yī)學(xué)這個(gè)背景下。大多數(shù)情況(但并非全部)下,高通量技術(shù)已經(jīng)被報(bào)道存在著一種形式或另外一種形式的批次效應(yīng)[Leek et al. (2010) Nature Reviews Genetics 11, 733-739]。但是,批次效應(yīng)并非基因組學(xué)所特有的。實(shí)際上, 在1972年一篇文獻(xiàn)中,Mj Youden就在對物理常數(shù)的經(jīng)驗(yàn)估計(jì)的背景下提到了批次效應(yīng)。他指出,物理常數(shù)“存在著主觀估計(jì)的特征”,以及如何在不同實(shí)驗(yàn)室之間變化的。例如,在下面的Table1中,Youden就展示了來自于不同實(shí)驗(yàn)室又的天文單的估計(jì)值。這些報(bào)告包括對離差(spread)(現(xiàn)在我們稱之為置信區(qū)間)的估計(jì)。
library(rafalib)
library(downloader)
##Download the data from
url <- "https://raw.githubusercontent.com/genomicsclass/dagdata/master/inst/extdata/astronomicalunit.csv"
filename <- tempfile()
if (!file.exists(filename)) download(url, destfile=filename)
dat <- read.csv(filename)
year <- jitter(dat[,2]) ##add jitter so points are not on top of each other
##Use color to denote the labs that reported more than one measurement
labs <- as.character(dat[,1]) ##what lab did it
labs[ !labs%in%c("Jodrell Bank","Spencer Jones")] <- "Others"
labs <- factor(labs, levels=c("Others","Spencer Jones","Jodrell Bank"))
cols=as.numeric(labs)
current <- 92.956039 ##this is the current estimate in millions of mph
mypar()
plot(year, dat[,3], ylim=c(min(dat[,4]),max(dat[,5])), pch=16, col=cols,
xlab="Year",ylab="Astronomical unit (millions of miles)")
for(i in 1:nrow(dat))
lines(c(year[i],year[i]),c(dat[i,4],dat[i,5]),col=cols[i],lwd=3)
legend("topright", legend=levels(labs), col=seq_along( labs ) ,cex=0.75, lty=1,pch=16)
abline(h=current,lty=2)
text(1905,current,"Current estimate",pos=3)

從不同實(shí)驗(yàn)室之間的可變性以及報(bào)道的界限(可以理解為置信區(qū)間)來看,都不能解釋這種可變性,這就清楚地表明不同實(shí)驗(yàn)室之間,而非某個(gè)實(shí)驗(yàn)室內(nèi)部存在著某些效應(yīng)。這種類型的變異就是我們所謂的批次效應(yīng)。請注意,有些實(shí)驗(yàn)室報(bào)告了兩個(gè)估計(jì)值(紫色和橙色),這樣我們就在相同的實(shí)驗(yàn)室也看到了批次效應(yīng)。
我們可以使用統(tǒng)計(jì)學(xué)符號來精確地描述這個(gè)問題。我們使用下面的公式來表示這些檢測值:
其中, 表示第
個(gè)實(shí)驗(yàn)室的第
個(gè)檢測值,而
表示真實(shí)的物理常數(shù),
表示獨(dú)立的檢測誤差。為了解釋可變性,我們引入了
,隨后我們根據(jù)數(shù)據(jù)來計(jì)算標(biāo)準(zhǔn)誤。就像本書前面提到的那樣,我們使用
值均值來估計(jì)物理物理常數(shù),如下所示:
再來構(gòu)建一個(gè)置信區(qū)間:
但是,這個(gè)置信區(qū)間太小,它無法覆蓋批次效應(yīng)的變異,下面是一個(gè)更加合適的模型:
其中 表示一個(gè)實(shí)驗(yàn)室特定的偏差或批次效應(yīng)(batch effect)。從圖片上我們可以明顯看出來,實(shí)驗(yàn)室之間
的變化要遠(yuǎn)大于一個(gè)實(shí)驗(yàn)室內(nèi)部
的變化。用統(tǒng)計(jì)學(xué)的術(shù)語來描述這個(gè)問題就是,
和
無法被識別。我們可以估計(jì)
,但是無法區(qū)分開。我們可以將
視為一個(gè)隨機(jī)變量。在這個(gè)案例中,每個(gè)實(shí)驗(yàn)室都有一個(gè)錯(cuò)誤項(xiàng)
,這一項(xiàng)在貫穿于該實(shí)驗(yàn)室的所有檢測值,在每個(gè)檢測值中,這一項(xiàng)是相同的,但是實(shí)驗(yàn)室與實(shí)驗(yàn)室間的這一項(xiàng)則不同。因此,這個(gè)問題就可以用以下方程表示:
這是對標(biāo)準(zhǔn)差的低估,因?yàn)樗鼪]有解釋由 導(dǎo)致的實(shí)驗(yàn)室內(nèi)的相關(guān)性(這一句不懂,原文如下:
Under this interpretation the problem is that:is an underestimate of the standard error since it does not account for the within lab correlation induced by
.
如果我們假設(shè) ,那么利用來自幾個(gè)實(shí)驗(yàn)室的數(shù)據(jù),我們實(shí)際上可以估計(jì)出
?;蛘哒f我們可以將它們視為隨機(jī)效應(yīng),簡單地將它們當(dāng)成一個(gè)新的估計(jì)值,并使用所有的檢測值來計(jì)算其標(biāo)準(zhǔn)差。以下是我們將報(bào)告中的均值值視為隨機(jī)觀察值的置信區(qū)間:
avg <- mean(dat[,3])
se <- sd(dat[,3]) / sqrt(nrow(dat))
cat("95% confidence interval is: [",avg-1.96*se,",", avg+1.96*se,"]")
cat("which does include the current estimate is:",current)
結(jié)果如下所示:
> cat("95% confidence interval is: [",avg-1.96*se,",", avg+1.96*se,"]")
95% confidence interval is: [ 92.8727 , 92.98542 ]> cat("which does include the current estimate is:",current)
which does include the current estimate is: 92.95604
Youden的論文還包括最近關(guān)于光速以及策略常數(shù)的批次效應(yīng)估計(jì)的案例。在這一章里,我們只展示高通量生物數(shù)據(jù)中批次效應(yīng)的廣泛性和復(fù)雜性。
混雜
書中有一個(gè)術(shù)語,即confounding,這里譯為混雜。這一部分內(nèi)容的Rmarkdown文檔可以參考作者的Github。
當(dāng)批次效應(yīng)與我們的目標(biāo)結(jié)果混雜時(shí),就會導(dǎo)致嚴(yán)重的??。這里我們描述一下混雜(confounding),以及它與我們數(shù)據(jù)解釋的關(guān)系。
我們從這本書或者說從任何其它數(shù)據(jù)分析課程中嘗到最重要的思想之一就是“相關(guān)不等于因果”。這句話多數(shù)情況就是真的,一個(gè)常見的案例就是混雜(confounding)。簡單地講,當(dāng)我們觀察到 和
之間存在著相關(guān)(correlation)或關(guān)聯(lián)(association)時(shí),往往就會存在著混雜,但嚴(yán)格來說,這是因?yàn)?
和
都依賴于一個(gè)無關(guān)的變量
。這里我們會描述一個(gè)Simposon悖論,這是一個(gè)基于一個(gè)著名的法律案件的案例,接著,我們還會提到一個(gè)在高通量生物學(xué)研究中的一個(gè)混雜案例。
案例之Simpson悖論
加州大學(xué)伯克分校(UCB)1973年的入學(xué)數(shù)據(jù)顯示,在錄取的學(xué)生中,44%是男性,30%是女性,顯著男性更多,以下是這些數(shù)據(jù):
library(dagdata)
data(admissions)
admissions$total=admissions$Percent*admissions$Number/100
##percent men get in
sum(admissions$total[admissions$Gender==1]/sum(admissions$Number[admissions$Gender==1]))
##percent women get in
sum(admissions$total[admissions$Gender==0]/sum(admissions$Number[admissions$Gender==0]))
結(jié)果如下所示:
> sum(admissions$total[admissions$Gender==1]/sum(admissions$Number[admissions$Gender==1]))
[1] 0.4451951
> ##percent women get in
> sum(admissions$total[admissions$Gender==0]/sum(admissions$Number[admissions$Gender==0]))
[1] 0.3033351
卡方檢驗(yàn)的結(jié)果明確拒絕零假設(shè),即錄取的性別是獨(dú)立的,兩者不受影響(也就是說,男女錄取公平),如下所示:
##make a 2 x 2 table
index = admissions$Gender==1
men = admissions[index,]
women = admissions[!index,]
menYes = sum(men$Number*men$Percent/100)
menNo = sum(men$Number*(1-men$Percent/100))
womenYes = sum(women$Number*women$Percent/100)
womenNo = sum(women$Number*(1-women$Percent/100))
tab = matrix(c(menYes,womenYes,menNo,womenNo),2,2)
print(chisq.test(tab)$p.val)
p值如下所示:
> print(chisq.test(tab)$p.val)
[1] 9.139492e-22
但經(jīng)過更仔細(xì)的觀察會發(fā)現(xiàn)一個(gè)自相矛盾的結(jié)果,以下是按專業(yè)劃分后,不同性別的錄取百分比:
y=cbind(admissions[1:6,c(1,3)],admissions[7:12,3])
colnames(y)[2:3]=c("Male","Female")
y
結(jié)果如下所示:
> y
Major Male Female
1 A 62 82
2 B 63 68
3 C 37 34
4 D 33 35
5 E 28 24
6 F 6 7
從結(jié)果中我們可以發(fā)現(xiàn),不同專業(yè)之間沒有性別偏見。
但是,我們在前面使用了卡方檢驗(yàn)發(fā)現(xiàn),入學(xué)和性別之間存在著某種關(guān)系。然而,當(dāng)我們的數(shù)據(jù)按照不同專業(yè)進(jìn)行分組時(shí),這種依賴性似乎消失了,這是怎么一回事呢?
這就是Simpson悖論的一個(gè)案例。
我們上面進(jìn)行的卡方檢驗(yàn)表明,入學(xué)和性別之間存在依賴關(guān)系。然而,當(dāng)數(shù)據(jù)按專業(yè)分組時(shí),這種依賴性似乎消失了。到底怎么回事?現(xiàn)在我們繪制一個(gè)能顯示申請專業(yè)的人,以及最終進(jìn)入這個(gè)專業(yè)讀書的人的百分比的圖形,用于說明男女在錄取比例方面的問題,如下所示:
y=cbind(admissions[1:6,5],admissions[7:12,5])
y=sweep(y,2,colSums(y),"/")*100
x=rowMeans(cbind(admissions[1:6,3],admissions[7:12,3]))
library(rafalib)
mypar()
matplot(x,y,xlab="percent that gets in the major",
ylab="percent that applies to major",
col=c("blue","red"),cex=1.5)
legend("topleft",c("Male","Female"),col=c("blue","red"),pch=c("1","2"),box.lty=0)

從圖片上我們可以發(fā)現(xiàn),男生更想申請那些“容易”的專業(yè)。也就是說,男生這個(gè)變量與“容易”專業(yè)這個(gè)變量發(fā)生了混雜。
混雜的圖形解釋
在這一部分里,我們將混雜圖形化。在下面的圖形中,每個(gè)字母表示一個(gè)學(xué)生。被錄取的人用綠色表示,字母表示專業(yè)。在第1張圖中,所有相同性別的學(xué)生都被放在一起,我們可以發(fā)現(xiàn),男生中綠色的比較更大,如下所示:
###make data for plot
library(rafalib)
mypar()
CEX=0.5
NC <- 70
tmp=rowSums(tab)
FNC <- round(NC*tmp[2]/tmp[1])
SCALE <- 1
makematrix<-function(x,n,addx=0,addy=0){
m<-ceiling(length(x)/n)
expand.grid(1:n+addx,addy+1:m)[seq(along=x),]
}
males<- sapply(1:6,function(i){
tot=admissions[i,2]*SCALE
p=admissions[i,3]/100
x=rep(c(0,1),round(tot*c(1-p,p)))
})
allmales<-Reduce(c,males)
females<- sapply(7:12,function(i){
tot=admissions[i,2]*SCALE
p=admissions[i,3]/100
rep(c(0,1),round(tot*c(1-p,p)))
})
allfemales<-Reduce(c,females)
mypar(1,1)
malepoints <- makematrix(allmales,NC)
femalepoints <- makematrix(allfemales,FNC,NC+NC/10)
NR <- max(c(malepoints[,2],femalepoints[,2]))
plot(0,type="n",xlim=c(min(malepoints[,1]),max(femalepoints[,1])),ylim=c(0,NR),xaxt="n",yaxt="n",xlab="",ylab="")
PCH=LETTERS[rep(1:6,sapply(males,length))]
o<-order(-allmales)
points(malepoints,col=2-allmales[o],pch=PCH[o],cex=CEX)
PCH=LETTERS[rep(1:6,sapply(females,length))]
o<-order(-allfemales)
points(femalepoints,col=2-allfemales[o],pch=PCH[o],cex=CEX)
abline(v=NC+NC/20)
axis(side=3,c(NC/2,NC+NC/2),c("Male","Female"),tick=FALSE)

現(xiàn)在我們按照專業(yè)對不同性別的學(xué)生進(jìn)行分級。這里我們要注意,大多數(shù)被錄取的學(xué)生(綠色)來源于兩個(gè)容易的專業(yè),即A和B,如下所示:
mypar()
malepoints <- vector("list",length(males))
femalepoints <- vector("list",length(males))
N<- length(males)
ADDY <- vector("numeric",N+1)
for(i in 1:N){
malepoints[[i]] <- makematrix(males[[i]],NC,0,ADDY[i])
femalepoints[[i]] <- makematrix(females[[i]],FNC,NC+NC/10,ADDY[i])
ADDY[i+1] <- max(malepoints[[i]][,2],femalepoints[[i]][,2])+1
}
plot(0,type="n",
xlim=c( min(sapply(malepoints,function(x)min(x[,1]))),max(sapply(femalepoints,function(x)max(x[,1])))),
ylim=c(0,max(sapply(femalepoints,function(x)max(x[,2])))),xaxt="n",yaxt="n",xlab="",ylab="")
for(i in 1:N){
points(malepoints[[i]],col=2+sort(-males[[i]]),pch=LETTERS[i],cex=CEX)
points(femalepoints[[i]],col=2+sort(-females[[i]]),pch=LETTERS[i],cex=CEX)
if(i>1) abline(h=ADDY[i])
}
abline(v=NC+NC/20)
axis(side=3,c(NC/2,NC+FNC/2),c("Male","Female"),tick=FALSE)
axis(side=2,ADDY[-1]/2+ADDY[-length(ADDY)]/2,LETTERS[1:N],tick=FALSE,las=1)

分層后的均值
在下圖中,我們可以看到,我們根據(jù)專業(yè)設(shè)定條件或分層后,然后再看差異,也就是說,當(dāng)我們控制了混雜項(xiàng)后,這就混雜效應(yīng)就消失了,如下所示:
y=cbind(admissions[1:6,3],admissions[7:12,3])
matplot(1:6,y,xaxt="n",xlab="major",ylab="percent",col=c("blue","red"),cex=1.5)
axis(1,1:6,LETTERS[1:6])
legend("topright",c("Male","Female"),col=c("blue","red"),pch=c("1","2"),
box.lty=0)

事實(shí)上,在不同專業(yè)錄取的學(xué)生中,性別差異僅表示為,男生比女生高3.5%,如下所示:
mean(y[,1]-y[,2])
結(jié)果如下所示:
> mean(y[,1]-y[,2])
[1] -3.5
棒球中的Simpson悖論
在棒球比賽的統(tǒng)計(jì)中我們也經(jīng)常看到Simpson悖論,現(xiàn)在我們來看一個(gè)有名的案例,在1995年和1996年,David Justice的平均擊球率高于Derek Jeter,但是Jeter的擊球率卻高于整體平均水平,如下所示:
| 1995 | 1996 | Combined | |
|---|---|---|---|
| Derek Jeter | 12/48 (.250) | 183/582 (.314) | 195/630 (.310) |
| David Justice | 104/411 (.253) | 45/140 (.321) | 149/551 (.270) |
這里的混雜項(xiàng)就是比賽場次,Jeter的比賽場次數(shù)目更多,但是結(jié)果卻是Justice擊球率更高。
混雜之高通量案例
為了描述我們在生物學(xué)中遇到的混雜問題,我們將會使用《Common genetic variants account for differences in gene expression among ethnic groups》這篇文獻(xiàn)中的數(shù)據(jù)集,這篇文獻(xiàn)指出,兩個(gè)不同種族的血液大約有50%的差異基因,現(xiàn)在我們來下載這個(gè)數(shù)據(jù)集:
我們使用Bioconductor中的函數(shù)exprs和pData就能提取基因的表達(dá)數(shù)據(jù)與樣本信息,如下所示:
geneExpression = exprs(e)
sampleInfo = pData(e)
需要注意,樣本按照不同的時(shí)間進(jìn)行了處理,如下所示:
Note that some samples were processed at different times.
head(sampleInfo)
結(jié)果如下所示:
> head(sampleInfo)
ethnicity date filename
1 CEU 2003-02-04 GSM25349.CEL.gz
2 CEU 2003-02-04 GSM25350.CEL.gz
3 CEU 2002-12-17 GSM25356.CEL.gz
4 CEU 2003-01-30 GSM25357.CEL.gz
5 CEU 2003-01-03 GSM25358.CEL.gz
6 CEU 2003-01-16 GSM25359.CEL.gz
日期是一個(gè)無關(guān)的變量,它理論上不影響這個(gè)數(shù)據(jù)集中基因的表達(dá)值,然而,正如我們在前面分析中看到的那樣,這個(gè)日期似乎也起了一些作用,因此我們在這里就來講一下這個(gè)日期的因素。
我們可以明顯看到,日期和種族這兩個(gè)因素幾乎完全混雜了:
year = factor( format(sampleInfo$date,"%y") )
tab = table(year,sampleInfo$ethnicity)
print(tab)
結(jié)果如下所示:
> print(tab)
year ASN CEU HAN
02 0 32 0
03 0 54 0
04 0 13 0
05 80 3 0
06 2 0 24
通過t檢驗(yàn)以及生成的火山圖我們可以發(fā)現(xiàn),不同種族之間似乎存在著數(shù)千個(gè)差異基因。但是,當(dāng)我們僅僅對2002年和2003年的CEU人群進(jìn)行比較發(fā)現(xiàn),我們又發(fā)現(xiàn)了數(shù)千個(gè)差異基因:
library(genefilter)
##remove control genes
out <- grep("AFFX",rownames(geneExpression))
eth <- sampleInfo$ethnicity
ind<- which(eth%in%c("CEU","ASN"))
res1 <- rowttests(geneExpression[-out,ind],droplevels(eth[ind]))
ind <- which(year%in%c("02","03") & eth=="CEU")
res2 <- rowttests(geneExpression[-out,ind],droplevels(year[ind]))
XLIM <- max(abs(c(res1$dm,res2$dm)))*c(-1,1)
YLIM <- range(-log10(c(res1$p,res2$p)))
mypar(1,2)
plot(res1$dm,-log10(res1$p),xlim=XLIM,ylim=YLIM,
xlab="Effect size",ylab="-log10(p-value)",main="Populations")
plot(res2$dm,-log10(res2$p),xlim=XLIM,ylim=YLIM,
xlab="Effect size",ylab="-log10(p-value)",main="2003 v 2002")

練習(xí)
P419