摘要
測序產生的數據內容為,每個樣本中,每個基因分配到多少個測序片段,各種類型的測序(RNA-seq,CHIP-Seq,HiC)產生的數據類似。RNA-seq數據分析的一個基本任務就是檢測差異性表達的基因。其中一個重要的問題就是對不同條件下產生的系統學差異進行量化和統計學推斷。DESeq2使用負二項式廣義線性模型來檢測基因表達的差異性,對分散和LFC的估計包含數據的先驗分布。這篇短文介紹了包的使用和工作流程。
1 標準流程
簡單例子
dds <- DESeqDataSetFromMatrix(countData = cts,
colData = coldata,
design= ~ batch + condition)
dds <- DESeq(dds)
resultsNames(dds)
res <- results(dds, name="condition_trt_vs_untrt")
res <- lfcShrink(dds, coef="condition_trt_vs_untrt", type="apeglm")
已有基因表達矩陣,通過給定樣本信息,因子公式設計來進行差異分析,最后可生成普通差異分析結果和收縮后的差異分析結果,詳細的后續。
如何獲取幫助
Bioconductor
導入的數據
- 使用未標準化的數據
DESeq2內部會根據樣本大小對counts進行調整,自帶標準化過程。 - DESeqDataSet
其在DESeq2中是一種類型,在代碼中常用dds來表示,其實例對象用來存儲counts和中間估計量。中間估計量中就包括跨基因收集的信息。這個對象必須包含design formula,用來構建模型的變量(分組信息)。這個對象可以通過四種上游途徑來構建:轉錄豐度文件;counts矩陣;htseq-count文件;SummarizedExperiment對象。這里只記錄counts矩陣方法。 - count 矩陣導入
代碼:
#使用pasilla包中附帶的數據
library("pasilla")
#讀入表達矩陣,樣本注釋
pasCts <- system.file("extdata",
"pasilla_gene_counts.tsv",
package="pasilla", mustWork=TRUE)
pasAnno <- system.file("extdata",
"pasilla_sample_annotation.csv",
package="pasilla", mustWork=TRUE)
cts <- as.matrix(read.csv(pasCts,sep="\t",row.names="gene_id"))
coldata <- read.csv(pasAnno, row.names=1)
coldata <- coldata[,c("condition","type")]
#樣本注釋修改,排序
rownames(coldata) <- sub("fb", "", rownames(coldata))
cts <- cts[, rownames(coldata)]
#加載DESeq2包,構建dds對象
library("DESeq2")
dds <- DESeqDataSetFromMatrix(countData = cts,
colData = coldata,
design = ~ condition)
#為結果附加描述信息
featureData <- data.frame(gene=rownames(cts))
mcols(dds) <- DataFrame(mcols(dds), featureData)
注:
- counts數值為整數
- 列名順序和colData樣本信息順序要一致
- 附加信息操作一般用不上
- 前過濾
代碼:
keep <- rowSums(counts(dds)) >= 10
dds <- dds[keep,]
注:
并不是必須,不影響計算結果,這樣做的優點是dds對象占用的內存小點,后續的計算耗時小點。
- 標注因子水平
代碼:
dds$condition <- factor(dds$condition, levels = c("untreated","treated"))
dds$condition <- relevel(dds$condition, ref = "untreated")
dds$condition <- droplevels(dds$condition)
注:
- 在進行后續操作前指定,如果沒有指定,采用的是默認
- levels對應的分別為,分母,分子
- ref為指定的對照組,即分母
- 當公式中的某個變量對應的樣本沒有的時候,可以通過dropleveles移除
- 折疊重復
DESeq2提供collapseReplicates函數進行去重復(非生物平行),詳見手冊。
差異性分析
代碼:
dds <- DESeq(dds)
res <- results(dds)
res <- results(dds, contrast=c("condition","treated","untreated"))
差異性分析的計算和估計過程整合到了一個函數DESeq中,其中的具體細節步驟后續會有介紹。對DESeq分析產生的結果,通過results函數生成結果表。
注:
- 可以通過contrast參數設置生成結果表的特定因子
- LFC收縮
代碼:
resultsNames(dds)
resLFC <- lfcShrink(dds, coef="condition_treated_vs_untreated", type="apeglm")
就是將DESeq函數處理后生成的的dds對象傳遞給lfcShrink函數即可,參數后續。
- 任務并行
代碼:
library("BiocParallel")
register(MulticoreParam(4))
就是利用一個包,開啟多線程。
- p值和矯正p值
代碼:
resOrdered <- res[order(res$pvalue),]
summary(res)
sum(res$padj < 0.1, na.rm=TRUE)
res05 <- results(dds, alpha=0.05)
sum(res05$padj < 0.05, na.rm=TRUE)
可以利用p值和矯正p值集合一些簡單總結函數,來得到想要的初步結果。
- 獨立假設權重
DESeq2中p值的矯正使用的是IHW包,具體原理見對應文獻及文檔。
代碼:
library("IHW")
resIHW <- results(dds, filterFun=ihw)
summary(resIHW)
sum(resIHW$padj < 0.1, na.rm=TRUE)
metadata(resIHW)$ihwResult
探索并導出結果
- MA-plot
代碼:
plotMA(res, ylim=c(-2,2))
plotMA(resLFC, ylim=c(-2,2))
效果好的話,收縮的圖形不會出現左寬右窄。
- 多種收縮方法
#查看你coef的順序序號
resultsNames(dds)
#通過序號代替全稱;三種收縮方法
resNorm <- lfcShrink(dds, coef=2, type="normal")
resAsh <- lfcShrink(dds, coef=2, type="ashr")
resApe <- lfcShrink(dds, coef=2, type="apeglm")
目前DESeq2提供了三種可選的方法,不同LFC擬合的分布來進行后續的收縮操作,具體細節參考對應方法的具體文檔。
- counts繪圖
代碼:
plotCounts(dds, gene=which.min(res$padj), intgroup="condition")
繪制特定基因的counts圖,可以通過設置return=T,來返回一個用于ggplot可以進一步設置具體參數的data.frame對象。
- 結果的更多信息
代碼:
mcols(res)$description
可以通過mcol函數來查看結果表中各個變量的含義。其中變量LFC就是變化的倍數,存在NA的可能原因有:
- 一個基因在所有樣本中的表達值都為0
- 一個基因的某個樣本的表達值為離群值(通過Cook距離檢測)
- 一個基因counts標準化后數值過低
- 結果的導出和豐富的可視化
ReportingTools,regionReport,Glimma,pcaExplorer等工具可以生成一個報表形式的結果。 - 導出結果到csv文件
利用R基礎的write.csv就可以
多因素設計
用的時候再說
2 數據轉換及可視化
- count數據的轉換
- 數據質量的檢測
3 流程中的可變步驟
4 DESeq2理論基礎
5 常見問題
參考資料
Michael I. Love, Simon Anders, and Wolfgang Huber.2018."Analyzing RNA-seq data with DESeq2".http://www.bioconductor.org/packages/release/bioc/vignettes/DESeq2/inst/doc/DESeq2.html