標籤:

Analyzing RNA-seq data with DESeq2翻譯(1)

為了深入學習DESeq包以及差異基因表達分析,我開始對Bioconductor網站上的DESeq包的說明進行翻譯。以下是部分選譯內容。

Quick start

DESeq2分析的基本步驟如下:

dds <- DESeqDataSetFromMatrix(countData = cts, colData = coldata, design = ~batch + condition)ndds <- DESeq(dds)nres <- results(dds, contrast=c("condition","treated","control"))n

cts是count matrix

coldata是table of sample information

design是指明如何對樣本進行比較的信息。上述代碼中是為了在控制批次效應的同時研究condition間的效應。

數據輸入

  • Salmon, Sailfish, kallito等軟體輸出的transcript quantification轉錄本定量文件,可以用DESeqDataSetFromTximport導入。
  • htseq-count軟體輸出的結果可以用DESeqDataSetFromHTSeq導入。
  • RangedSummarizedExperiment用DESeqDataSet導入。

輸入數據

為何必須輸入非標準化(非均一化)的counts值?

EDSeq2要求輸入數據是高通量測序實驗得到的,整數值組成的矩陣。該矩陣中第i行和第j列的交點代表在樣品j中有多少條reads落在基因i上(就是說矩陣中樣品為列,基因為行)。

矩陣中的數據應當是沒有標準化後的,這樣才能保證DESeq2所用的統計模型的分析結果的準確性。DESeq2的統計模型會自動根據矩陣大小進行校正,因此根據矩陣大小轉化後的或者標準化(均一化)的矩陣不能作為DESeq2的輸入數據。

DESeqDataSet

DESeqDataSet是DESeq2包中儲存read counts以及統計分析過程中的數據的一個「對象」,在代碼中常表示為「dds」。

一個DESeqDataSet對象必須關聯相應的design公式。design公式指明了要對哪些變數進行統計分析。該公式(上文中的design = ~batch + condition)以短波浪字元開頭,中間用加號連接變數。design公式可以修改,但是相應的差異表達分析就需要重新做,因為design公式是用來估計統計模型的分散度以及log2 fold change的。

注意:要將你感興趣的變數放在design公式的後面,對照變數放在前面。

以下介紹4種不同pipiline下構建DESeqDataSet方法:

  1. 從轉錄本丰度文件以及tximport構建
  2. 從count matrix 構建
  3. 從htseq-count文件構建
  4. 從SummarizedExperiment對象構建

導入轉錄本丰度文件以及tximport文件生成的矩陣

該方法是最新的及推薦的方法。 具體是將上游的快速轉錄本丰度定量軟體獲得的基因水平的count matrix,然後用tximport包導入,這種方法支持的軟體有:

  • Salmon
  • Sailfish
  • kailisto
  • RSEM

用以上軟體進行轉錄本丰度估計的優點有:

  • 校正了潛在的不同樣本間基因長度導致的錯誤。
  • 運行速度快,與alignment-based的方法相比需要的內存和硬碟空間少。
  • 避免將那些比對到帶有同源序列的多個基因上的片段丟棄,從而增加敏感度。

以下我們演示如何將Salmon軟體導出的定量文件「quant.sf」導入到DESeq2中。

library("DESeq2")nddsTxi <- DESeqDataSetFormTximport(txi, colData = samples, design =~condition)n

導入count matrix矩陣

用DESeqDataSetFromMatrix命令導入count matrix。除count matrix外,使用者還需要將count matrix的列名單獨建立一個DataFrame,以及一個design formula。 以下我們演示DESeqDataSetFromMatrix的用法,主要過程是從pasilla包中載入count data,讀取的count matrix命名為cts,樣品信息表命名為coldata。下邊演示的方法是從featureCounts的輸出結果中提取以上信息。

library("pasilla")nnpasCts <- system.file("extdata", "pasilla_gene_counts.tsv",package="pasilla",mustWork=TRUE)nnpasAnno <- system.file("extdata", "pasilla_sample_annotation.csv", packages="pasilla", mustWork=TRUE)nncts <- as.matrix(read.csv(pasCts, sep="t", row.names="gene_id"))nncoldata <- read.csv(pasAnno,row.names=1)nncoldata <- coldata[,c("condition", "type")]n

看一下cts和coldata的內容

head(cts,2)n

untreated1untreated2untreated3untreated4treated1treated2FBgn0000003000000FBgn000000892161767014088

coldatan

conditiontypetreated1fbtreatedsingle-readtreated2fbtreatedpaired-endtreated3fbtreatedpaired-enduntreated1fbuntreatedsingle-readuntreated2fbuntreatedsingle-readuntreated3fbuntreatedpaired-enduntreated4fbuntreatedpaired-end

注意count matirx 的列與coldata的行的順序一致,DESeq2默認這兩者間的順序是一致的。

上面的結果中可以看出cts和coldata中列和行的順序並不一致,另外coldata中的行名也多了「fb」兩個字母,需要調整順序並且去掉多餘的字母。

rownames(coldata) <- sub("fb", , rownames(coldata)) #去掉fbnall(rownames(coldata)%in%colnames(cts)) n[1] TRUE #此行為運行結果nall(rowname(coldata)==colname(cts))n[1]FALSE #此行為運行結果ncts <- cts[, rownames(coldata)] #直接把列名提換了嗎?該列的數據提換了嗎?nall(rowname(coldata)==colname(cts))n

有了count matrix(cts)和sample information(coldata),我們就可以構建DESeqDataSet矩陣了

library("DESeq2")ndds <- DESeqDataSetFromMatrix(countData=cts, colData = coldata, design = ~condition)nddsn

導入htseq-count數據

通過HTSeq軟體進行read count的結果數據,可以用DESeqDataSetFromHTSeqCount導入到DESeq2中。首先要將htseq-count軟體的結果文件的位置信息保存在一個變數中。下文中我們用pasilla包中的htseq-count結果文件作為例子。

directory <- systme.file("extdata", package = "pasilla", mustWork =TRUE)nnsampleFiles <- grep("treated",list.files(directory), value=TRUE) #用list.file指明which file to read,再用grep選擇包含"treated"的文件nnsampleCondition <- sub("(.*treated).*". "1", sampleFiles)#用sub函數從sample filename得到condition statusnnsampleTable <- data.frame(sampleName =sampleFiles, fileName =sampleFiles, condition =sampleCondition)nn#build the DESeqDataSetnnlibrary("DESeq2")nnddsHTSeq <- DESeqDataSetFromHTSeqCount(sampleTable = sampleTable, directory= directory, design=~condition)nnddsHTseq #顯示該矩陣n

class: DESeqDataSet

dim: 70463 7 metadata(1): version assays(1): counts rownames(70463): FBgn0000003:001 FBgn0000008:001 ... FBgn0261575:001 FBgn0261575:002 rowData names(0): colnames(7): treated1fb.txt treated2fb.txt ... untreated3fb.txt untreated4fb.txt colData names(1): condition

預過濾

雖然提前去掉low count基因不是運行DESeq進行差異表達分析必須的,但是提前過濾掉low count基因有兩個好處:減少dds矩陣的大小,提高DESeq運行的速度。 這裡我們演示如何去掉read count在10以下的基因。 注意:更嚴格的過濾會在DESeq的results功能中自動實現

keep <- rowSums(counts(dds)) >= 10ndds <- dds[keep,]n

關於因子的說明

默認情況下,R會安裝字母順序選擇一個level作為參考level。就是說,如果沒有給DEseq2函數指定要與哪個level進行比較(即指定哪個level是對照組),默認會安裝字母順序選擇排在最前面的level作為對照組。

如果要指定哪個level是對照組,可以直接在函數#results#的參數contrast中指明對照level(下文中會具體介紹),或者直接在factor level中指明。

注意,更改design公式中變數的factor level只能在運行DESeq2分析前,分析中或分析後都不能再進行更改。更改dds矩陣中的factor level可以用以下兩個方法:

#用factorndds$condition <- factor(dds$condition, levels = c("untreated", "treated"))n#或者用relevel,直接指定參考levelndds$condition <- relevel(dds$condition, ref = "untreated")n

如果需要從dds中提取一個子集,比如說從dds中去掉部分樣品,這時有可能會同時去掉所有樣品的一個或者多個level。這種情況下,可以用droplevles函數去掉沒有對應sample的level:

dds$condition <- droplevels(dds$condition)n

摺疊技術重複

DESeq2包中的collapseReplicates函數可以用於將技術重複的定量數據摺疊成一個樣品的。注意不能把這個函數用到生物學重複上,更多信息請查看collapseReplicates的幫助頁面。


推薦閱讀:

生物信息學軟體推薦/課程總結
生物信息學編程實戰練習題大全
20160622-專欄開通
R 學習筆記:R 函數

TAG:生物信息学 |