簡單的轉錄組差異基因表達分析 -- edgeR

經典的轉錄組差異分析通常會使用到三個工具limma/voom, edgeRDESeq2, 今天我們同樣使用一個小規模的轉錄組測序數據來演示edgeR的簡單流程。

由于,edgeRDESeq2都是使用基于負二項分布廣義線性回歸模型(GLM)來對RNA-seq數據進行擬合和差異分析,所以我們都用同一個數據來分析。

文中使用的數據來自Standford 大學的一個擬南芥的small RNA-seq數據(https://bios221.stanford.edu/data/mobData.RData

該數據包含6個樣本:SL236,SL260,SL237,SL238,SL239,SL240, 并分成了三組,分別是:

MM="triple mutatnt shoot grafted onto triple mutant root"

WM="wild-type shoot grafted onto triple mutant root"

WW="wild-type shoot grafted onto wild-type root"

簡而言之,WW組可以認為是實驗的對照組,而MMWM則是兩個處理組。

P.S. 本文的分析是基于有生物學重復的單因子差異分析,關于無生物學重復或者多因子的情況,以后有機會再做展開。

對于edgeR的分析流程而言,我們需要輸入的數據包括:

  1. 表達矩陣(counts
  2. 分組信息(group
  3. 擬合信息(design):指明如何根據樣本的分組進行建模

下面就以mobData 中的數據為例簡單介紹edgeR 的分析流程

載入數據及生成DGEList

由于mobData 中的行名沒有提供基因的ID,我們也不是為了探究生物學問題,就以mobData 的行數作為其ID

library(edgeR)
load("data/mobData.RData")
head(mobData)
##      SL236 SL260 SL237 SL238 SL239 SL240
## [1,]    21    52     4     4    86    68
## [2,]    18    21     1     5     1     1
## [3,]     1     2     2     3     0     0
## [4,]    68    87   270   184   396   368
## [5,]    68    87   270   183   396   368
## [6,]     1     0     6    10     6    12
row.names(mobData) <- as.character(c(1:dim(mobData)[1]))
# MM="triple mutatnt shoot grafted onto triple mutant root"
# WM="wild-type shoot grafted onto triple mutant root"
# WW="wild-type shoot grafted onto wild-type root"
mobGroups <- c("MM", "MM", "WM", "WM", "WW", "WW")
degs <- DGEList(counts = mobData, group = mobGroups);degs
## An object of class "DGEList"
## $counts
##   SL236 SL260 SL237 SL238 SL239 SL240
## 1    21    52     4     4    86    68
## 2    18    21     1     5     1     1
## 3     1     2     2     3     0     0
## 4    68    87   270   184   396   368
## 5    68    87   270   183   396   368
## 2995 more rows ...
## 
## $samples
##       group lib.size norm.factors
## SL236    MM   152461            1
## SL260    MM   309995            1
## SL237    WM   216924            1
## SL238    WM   208841            1
## SL239    WW   258404            1
## SL240    WW   276434            1

edgeR將數據存儲在列表形式的DGEList對象中,需要指定的參數包括countsgroup . DGEList 將表達矩陣存儲在$counts中,將樣本的信息,例如分組情況和文庫大小等存儲在$samples中。

預處理

在進行差異分析之前,需要對樣本數據的表達矩陣進行預處理,包括:

  1. 去除低表達量基因
  2. 探索樣本分組信息 -- 有助于挖掘潛在的差異樣本

這里我們根據CPM normalization后的基因表達量作為過濾低表達基因的指標

# cpm normalization
countsPerMillion <- cpm(degs)
countCheck <- countsPerMillion > 1
keep <- which(rowSums(countCheck) >= 2)
degs.keep <- degs[keep,]
dim(degs.keep)
## [1] 2861    6

edgeR默認使用 trimmed mean of M-values (TMM) 計算文庫的scale factor進行normalization,以最大程度地縮小樣本間基因表達量的log-fold change。這是因為TMM 法認為樣本間大部分的基因都沒有發生差異表達,而那些真正差異表達的基因并不會受到normalization的嚴重影響。如此一來,便將那些由于測序引起的差異表達基因的表達量給校正了,消除了一部分的假陽性。

degs.norm <- calcNormFactors(degs.keep, method = 'TMM')
plotMDS(degs.norm, col=as.numeric(degs.norm$samples$group))
legend("bottomleft",as.character(unique(degs.norm$samples$group)), col=1:3, pch=20)

這里使用plotMDS 查看樣本的分組情況(通過logFC),各組都分得很開。plotMDS在多因子的情況下可以更好地觀察各個樣本組是否有良好的分組。

  • 關于Normalization

    在差異分析中,我們常常更關注的是相對表達量的變化,例如處理組的A基因表達量相對于對照組的而言是上調還是下調了。而基因表達量的定量準確性則在差異分析中不太重要,因此,在進行差異分析時,像RPKM/FPKM這種對轉錄本長度進行normalization方法是并不常用,也是沒有必要的。

    在常規的RNA-seq中,影響基因表達量更大的技術因素往往是測序深度以及有效文庫大小(effective libraries size)。這也是一般的差異分析軟件會進行normalize的部分。

差異分析

首先,我們構建出design矩陣,指明差異分析所要比較的關系

designMat <- model.matrix(~0+mobGroups);designMat
##   mobGroupsMM mobGroupsWM mobGroupsWW
## 1           1           0           0
## 2           1           0           0
## 3           0           1           0
## 4           0           1           0
## 5           0           0           1
## 6           0           0           1
## attr(,"assign")
## [1] 1 1 1
## attr(,"contrasts")
## attr(,"contrasts")$mobGroups
## [1] "contr.treatment"

然后,進行dispersion的估計

degs.norm <- estimateGLMCommonDisp(degs.norm,design=designMat)
degs.norm <- estimateGLMTrendedDisp(degs.norm, design=designMat)
degs.norm <- estimateGLMTagwiseDisp(degs.norm, design=designMat)
plotBCV(degs.norm)
good fitting

plotBCV 反映不同表達量的基因與模型擬合的情況,如果模型擬合得好則"Tagwise"點的分布會擬合到“Trend”這條曲線上,如上圖所展示的情況。但也可以看到低表達量的基因有點離散。

  • 關于dispersion estimation

    一般而言,樣本間的變異系數(coefficient of variance,CV)是由兩部分組成的,一是技術差異(Technical CV),另一個是生物學差異(Biological coefficient of variance,BCV)。前者是會隨著測序通量的提升而消失的,而后者則是樣本間真實存在的差異。所以,對于一個基因g而言,它的BCV在樣本間足夠大的話,就可以認為基因g是一個差異表達基因。而edgeR正是通過估計dispersion來估計BCV(其中的數理不在此展開),進而擬合出線性回歸模型的參數。

    estimateGLMCommonDisp(x,design):為所有基因都計算同樣的dispersion

    estimateGLMTrendedDisp(x,design):根據不同基因的均值--方差之間的關系來計算dispersion,并擬合一個trended model

    estimateGLMTagwiseDisp(x,design):計算每個基因的dispersion,并利用經驗性貝葉斯方法(empirical bayes)壓縮至Trend Didspersion。個人認為這一項相當于GLM中每個基因的beta值

最后,根據design進行擬合,并利用likelihood ratio test(LRT)進行統計檢驗

fit <- glmFit(degs.norm, designMat)
# LRT=likelihood ratio test
# group1-group2
lrt.1vs2 <- glmLRT(fit, contrast = c(1,-1,0))
# group1-group3
lrt.1vs3 <- glmLRT(fit, contrast = c(1,0,-1))
# group2-group3
lrt.2vs3 <- glmLRT(fit, contrast = c(0,1,-1))

下面以MM組和 WW組的比較為例

topTags 提取出差異分析的數據;

decideTestsDGE 可以根據條件篩選差異基因,返回-1,0,1三個數值,分別代表下調,不顯著和上調;

plotSmear 畫一個簡單的表達量與fold change的關系圖。

degs.res.1vs3 <- topTags(lrt.1vs3, n = Inf, adjust.method = 'BH', sort.by = 'PValue')
degs.res.1vs3[1:5, ]
## Coefficient:  1*mobGroupsMM -1*mobGroupsWW 
##           logFC   logCPM        LR       PValue          FDR
## 74   -10.364020 9.042115 130.95167 2.537092e-30 7.258620e-27
## 490   -6.043444 8.401692 119.28833 9.056111e-28 1.295477e-24
## 1717  -7.056255 9.921304 114.37749 1.077199e-26 1.027289e-23
## 1963   6.492175 6.868420 102.37925 4.584800e-24 3.279278e-21
## 1111  -9.565662 8.284244  97.26908 6.051792e-23 3.462836e-20

deGenes.1vs3 <- decideTestsDGE(lrt.1vs3, p=0.05, lfc = 1)
summary(deGenes.1vs3)
##        1*mobGroupsMM -1*mobGroupsWW
## Down                            430
## NotSig                         2094
## Up                              337
detag <- rownames(lrt.1vs3)[as.logical(deGenes.1vs3)]
plotSmear(lrt.1vs3, de.tags=detag)
abline(h=c(-1, 1), col='blue')

圖中紅色的是統計學上的顯著差異表達基因

至于edgeR與DESeq2的比較其實已經有很多benchmark的文獻做過了,這里就先鴿一下,以后有機會再來填坑。

benchmark ref:https://bioconductor.org/packages/release/bioc/vignettes/SummarizedBenchmark/inst/doc/Feature-Iterative.html

參考文章:

  1. https://bioconductor.org/packages/release/bioc/vignettes/edgeR/inst/doc/edgeRUsersGuide.pdf
  2. https://www.biostars.org/p/319957/
  3. https://web.stanford.edu/class/bios221/labs/rnaseq/lab_4_rnaseq.html
  4. https://bioinformatics-core-shared-training.github.io/cruk-bioinf-sschool/Day3/rnaSeq_DE.pdf

完。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374