原文鏈接:https://my.oschina.net/u/4503882/blog/4511789
可以看到,腫瘤樣品的表達量整體就比正常對照樣品的表達量高出一大截,這樣的數據進行后續分析,就會出現大量的上調基因。
因為我一直強調,做表達矩陣分析一定要有三張圖,見:你確定你的差異基因找對了嗎? ,所以就讓粉絲繼續摸索,其中PCA如下:
可以看到,兩個分組是涇渭分明的,這可能是生物學差異,因為腫瘤樣品就肯定跟正常組織不一樣的啊,也有可能是批次效應。所以我給粉絲的建議是兩個策略
第一個策略是直接normalizeBetweenArrays處理,然后走差異分析。
第二是先去除批次效應,然后走差異分析。
建議你比較一下,這兩個差異分析的區別。
然后粉絲的行動也很迅速,兩三天就回復了郵件,給出了兩個摸索結果:
可以看到,直接normalizeBetweenArrays處理其實就是一個quantile的normalization而已,大家可以去看quantile normalization到底對數據做了什么 - 簡書,了解一下。
從韋恩圖可以看到,沒有進行normalizeBetweenArrays處理之前呢,上調基因真的是超級多啊!經過了normalizeBetweenArrays處理之后呢,其中616個上調基因變成了沒有顯著性改變的基因,然后637個居然由上調基因變成了下調基因,當然了,也有341個基因維持原來的上調屬性。
是不是很可怕!!!
粉絲下的這個結論很正確,這個時候使用 limma 的 removeBatchEffect 函數來矯正批次效應,肯定是錯的,因為完全沒有搞清楚矯正批次效應的統計學原理。
其實幾年前我在《單細胞天地》公眾號發起過一個談論,見:到底是批次效應還是真實生物學差異,如果你僅僅是做了兩個單細胞轉錄組樣品,想合并這兩個數據再后續分析,就面臨著兩個樣品(處理前后的生物學差異)本身的批次效應(不同時間點取樣,不同10x上機時間等等)。因為是單細胞,一個樣品里面本身就有這成千上萬個細胞,可以針對兩個樣品內部的某些具有不變屬性的單細胞來作為錨定,從而比較好的合并兩個樣品的單細胞轉錄組數據。
但是,如果是bulk轉錄組測序,或者表達量芯片,就基本上不可能做到區分具有生物學差異的兩個樣品的批次效應了。雖然說我在《生信技能樹》寫過不少相關教程,比如:多種批次效應去除的方法比較,但那樣的去除是針對生物學差異與批次效應交叉的情況來去除。比如:
- 第一個批次:2個處理,2個對照樣品
- 第二個批次:3個處理,3個對照樣品
這個時候,就可以使用 limma 的 removeBatchEffect 函數或者 sva 的 ComBat 函數,把批次效應去除掉,然后保留生物學差異供后續的差異分析。
但是如果你的實驗設計是:
- 第一個批次:3個處理樣品
- 第二個批次:3個對照樣品
那我就只能奉勸你,對這個數據集說拜拜了!
normalizeBetweenArrays
rt=read.table("lncRNA.txt",sep="\t",header=T,check.names=F)
#重復基因取均值,去重復
rt=as.matrix(rt)
rownames(rt)=rt[,1]
exp=rt[,2:ncol(rt)]
dimnames=list(rownames(exp),colnames(exp))
rt=matrix(as.numeric(as.matrix(exp)),nrow=nrow(exp),dimnames=dimnames)
rt=avereps(rt)
rt=rt[rowMeans(rt)>0,]
#1個數據集批內矯正
rt=normalizeBetweenArrays(as.matrix(rt))
boxplot(rt)
removeBatchEffect
rt1=read.table("lncRNA1.txt",sep="\t",header=T,check.names=F)
rt2=read.table("lncRNA2.txt",sep="\t",header=T,check.names=F)
rt1=as.matrix(rt1)
rt2=as.matrix(rt2)
rt3<-merge(rt1,rt2)
rownames(rt3)=rt3[,1]
exp=rt3[,2:ncol(rt3)]
dimnames=list(rownames(exp),colnames(exp))
rt3=matrix(as.numeric(as.matrix(exp)),nrow=nrow(exp),dimnames=dimnames)
#查看未作批次矯正前的表達圖
boxplot(rt3)
#多個數據集批次矯正
batch <- c(rep('con',182),rep('treat',32))
group_list <- c(rep('tumor',6),rep('normal',6),rep(c('tumor', 'normal'),each=3))
design=model.matrix(~group_list)
rt=removeBatchEffect(rt3,batch = batch,design = design)
boxplot(rt)
write.table(rt,file="rt.xls",sep="\t",quote=F)