菜??的第一次正式上手R,相當于翻譯了
edgeR
這個包的 UserGuide,跑了第一個 case
眼看寫了這么多字,還是發一下比較好,萬一有人看呢
edgeR簡介
edgeR 可以應用于任何可產生基因組特征數據(read counts)的技術,能夠為 RNA-seq 實驗中評估差異表達、ChIP-seq 實驗中差異標記提供統計程序。該R包具備適用于多組實驗的精準統計法,同時還具備廣義線性模型(glms)的統計學方法——適用于不同復雜程度的多因素實驗。有時人們將前者稱為 classic edgeR,將后者稱為 glm edgeR。然而上述兩種方法是互補的,并且時常在數據分析中被結合使用。大多數 glm 函數可以通過函數名稱中的 "glm" 識別,這類函數可利用似然比檢驗或擬似然F檢驗檢測差異表達。edgeR 的功能的一個重要特點是,不論 classic 和 glm 兩種方法,都屬于經驗貝葉斯方法,從而能夠在實驗只具有最小水平的生物學重復時,依然能夠判斷出基因特異的生物學差異。edgeR 可應用于不同水平的差異表達,如基因、外顯子、轉錄本、標簽等,分析外顯子水平時可輕易地檢測出可變剪切或異構體特異性差異表達。
案例分析
RNA-seq —— 口腔腫瘤 vs 對應的正常組織 (RNA-Seq of oral carcinomas vs matched normal)
分析的目的是檢測腫瘤和正常組織對比下差異表達的基因,這個案例可以體現 edgeR 中 GLM 法的工作能力。
1.edgeR 安裝
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("edgeR")
2.數據讀取
下載文章 Tumor Transcriptome Sequencing Reveals Allelic Expression Imbalances Associated with Copy Number Alterations 中的 Table S1。
-
去除多余列項、重命名列名
> rawdata <- read.delim("TableS1.txt", check.names=FALSE, stringsAsFactors=FALSE)
> rawdata <- rawdata[,c(1:9)]
> names(rawdata)[1:9]<-c("RefSeqID","Symbol","NbrOfExons","8N","8T","33N","33T","51N","51T")
這里不小心把表格的一二行的行數弄沒了,后面需要注意數字
結果到
DEGList
這一步時出現報錯“The count matrix is a data.frame instead of a matrix and the first 6 columns are non-numeric.” 用了as.matrix()后表格里所有內容又都變成了factor...??**所以,最后還是直接在excel表格里解決了行名??
更新:其實這個很好解決,然這是第一次正式,沒錯“正式”,用R....
-
加載edgeR, 用
DEGList
構建列表> library(edgeR) Loading > y <- DGEList(counts=rawdata[,4:9], genes=rawdata[,1:3])
3.注釋
-
篩選轉錄本
這篇文章發表已經是幾年前了,數據中一些 RefSeq ID 可能和現在一般使用的 RefSeq ID 有出入,所以只需要保留
org.HS.eg.db
中有的、具有 NCBI 注釋的那部分轉錄本。> library(org.Hs.eg.db) > idfound <- y$genes$RefSeqID %in% mappedRkeys(org.Hs.egREFSEQ) > y <- y[idfound,] > dim(y)
可以看出有15548個基因
-
將 Entrez Gene ID 加入注釋
> egREFSEQ <- toTable(org.Hs.egREFSEQ) > head(egREFSEQ)
> m <- match(y$genes$RefSeqID, egREFSEQ$accession) > y$genes$EntrezGene <- egREFSEQ$gene_id[m]
-
利用 Entrez Gene ID 更新 gene symbol
> egSYMBOL <- toTable(org.Hs.egSYMBOL) > head(egSYMBOL)
> m <- match(y$genes$EntrezGene, egSYMBOL$gene_id) > y$genes$Symbol <- egSYMBOL$symbol[m]
5.篩選及歸一化 (Normalization)
-
篩選出 count 數最多的轉錄本
每個 gene symbol 保留一個轉錄本
> o <- order(rowSums(y$counts), decreasing=TRUE) > y <- y[o,] > d <- duplicated(y$genes$Symbol) > y <- y[!d,] > nrow(y)
-
重新計算文庫大小
> y$samples$lib.size <- colSums(y$counts)
-
將 Use Entrez Gene ID 設為行名
> rownames(y$counts) <- rownames(y$genes) <- y$genes$EntrezGene > y$genes$EntrezGene <- NULL
-
TMM歸一化 (trimmed mean of M-values normalization)
> y <- calcNormFactors(y) > y$samples
6.數據挖掘 (Data Exploration)
-
利用
plotMDS
繪制MDS (Multidimensional scaling) 圖首先應該分析樣本的離群值和其他關系,函數
plotMDS
能夠生成樣本之間距離與生物差異系數 (biological coefficient of variation, BCV) 相對應的圖表。> plotMDS(y)
圖中橫坐標將腫瘤樣本和正常樣本區分開來(左T右N),縱坐標則大致對應了患者編碼,這些應證了樣本的配對特性??梢钥闯瞿[瘤樣本的分布比正常樣本更不均勻。
7.設計矩陣
-
檢測差異表達
在擬合負二項 GLM 之前,需要根據實驗設計優化設計矩陣。接下來需要在同一患者的腫瘤和正常組織樣本中檢測差異表達,即調整患者之間的差異。統計學意義上,這是把患者作為區組因子的一種可加線性模型。
> Patient <- factor(c(8,8,33,33,51,51)) > Tissue <- factor(c("N","T","N","T","N","T")) > data.frame(Sample=colnames(y),Patient,Tissue)
> design <- model.matrix(~Patient+Tissue) > rownames(design) <- colnames(y) > design
這種可加模型適用于成對設計或具批次效應 (batch effect) 的實驗。
8.估計數據分布
-
估計數據組的負二項分布
> y <- estimateDisp(y, design, robust=TRUE) > y$common.dispersion
公共離散值 (common dispersion) 的平方根,即生物差異 (biological variation) 的差異系數 (coefficient of variation),為0.4。
> plotBCV(y)
9.差異表達
-
擬合基因層面 GLM
> fit <- glmFit(y, design)
-
腫瘤樣本 vs 正常組織,做似然比檢驗,列出差異最為顯著的基因
> lrt <- glmLRT(fit) > topTags(lrt)
這個檢驗類似配對t檢驗。排列靠前的標簽/基因的p值、FDR都很小,差異倍數 (FC) 很大。
進一步地??
-
單個樣本中這些基因的每百萬 count 數 (counts-per-million)
ps.根據p值排序
> o <- order(lrt$table$PValue) > cpm(y)[o[1:10],]
可以看出,這些基因在腫瘤樣本和正常組織中的變化,在三個患者中是一致。
-
以 FDR(錯誤發現率)為5%,查看差異表達基因的數量
> summary(decideTests(lrt))
-
繪制 log-FC 與 log-cpm 均值 - 差異圖 (mean-difference plot)
圖中的藍色橫線代表2倍差異 (2-fold changes)。> plotMD(lrt) > abline(h=c(-1, 1), col="blue")
10.GO分析
-
針對生物學過程 (biological process, BP)做GO分析
> go <- goana(lrt) > topGO(go, ont="BP", sort="Up", n=30, truncate=30)
腫瘤中表達上調的基因可能與細胞分化、細胞遷移、組織形態發生相關。