Bioconductor分析RNA-seq數據

參考學習《R語言與Bioconductor生物信息學應用》第六章

前言

Y叔的公眾號biobabble發過一篇【聽說你想學R?】,七月份發的但昨天推送了一次,所以我看到了,看到了對《R語言與Bioconductor生物信息學應用》這本書的強力吐槽,而我發的這篇筆記,連同上次發的Bioconductor分析基因芯片數據都是來自于對該書內容的提煉和學習。所以呢我覺得有必要在這里說幾句。

坦白說,這本書確實有很多問題,我自己講講幾點吧:首先,它有點過時了,公眾號評論就有人說基因芯片分析過時了,我個人覺得不客觀,但確實這本書有些過時,由此產生了一系列問題,特別要提到的就是代碼的可重復性,我個人在運行書中一些代碼時很多時候會不work,然后我會自己思考怎么讓它work,實在不行就放棄;第二點,它不適合R入門的人,特別是你去看它的第一章,云里霧里,好歹我也摸了半年R了啊,好吧,我就直接跳過了;第三點,它的流程不完整,就是不是很連續的都能讓你從頭到尾的go through下去,自然心里會感覺不爽快。如此種種。

接著你心里已經有準備聽我下面要將的“but”的跳轉了,我為什么會學它并做筆記,乃至分享出來?首先,在我需要學習芯片和RNAseq分析的時候身邊剛好有這本書,我也不知道是誰的,好吧,那就拿起來看看,發現正是我需要的,所以我看它,第一章看不太懂,沒意思,我也不想看,直接跳過從第二章看起,到現在整本書基本看了大半,看過的代碼都嘗試著去運行過,確實有所收獲,所以我會寫前言,算是對這本書的客觀評價吧;其次,我想談談有哪些收獲,我本人可以算是有編程基礎的,算不得菜鳥,但是對于基因芯片的基礎也好,RNAseq乃至基因組分析流程、背景等等可以說是菜鳥的不能再菜鳥,這本書給了我對芯片數據來源、處理流程的一些基本認知,其實這在一些國內資源上是找不到的。有一點我心里非常的不服氣,為什么我聽說中國做生信非常厲害的人很多,找得到的中文資料卻很少?為什么百度其他搜索引擎很強大,一涉及科研領域就非常之垃圾?這也是我挺佩服生信技能樹或類似的這樣的團隊以及相關個人,當我們在噴一些書籍很垃圾,而實際它確實有很多問題的時候,我們能不能貢獻自己的力量呢?幾個月的學習里我深知自己才能有限,所知甚少,所以不斷模仿和記錄。我把這些筆記陳列出來并不是它寫的有多好,多值得模仿,而是它能夠給予我們新的知識,又能夠在我們忘記時方便查詢。學習必然是一個探尋和思索的過程,技能的掌握它不是一本書可以帶給你的,特別是一本技術類書籍,它給了你一個看似可行的方案,你要實際去操作它,然后心里給予評價,在你不確定時,需要多方面整理實踐不同的解決方案,然后找到自己的出路,建立自己對該某個問題處理的完整體系。

這篇筆記并不會帶你真正學好RNA-seq的分析,至少我看完之后沒有,但它確實可以補一些知識的模塊。它不適應入門R,也不適應完全模仿做具體的分析,而是適合你在掌握R之后,你在做測序分析之前想了解的一些知識。當你知道它非你所需,你可以完全不看它。

整體而言,這本書非常短,整體評價偏差,但國內在這個方面學習恐怕沒有比這好的中文書籍吧?(所以我建議多看網絡資料,這也是我在交互學習的,比如生信媛公眾號文章目錄)我希望那些厲害的人物(教授級人物們)能夠多拓展一些中文科研的視界(提升國內人員對生信的整體認知與分析能力,加速學習周期),我也會持續記錄這樣一些知識,與生信技能樹里面的小伙伴一起從不同的研究方向,角度去拓展形形色色的基礎知識與理論。我再次強調,我專注于筆記的目的除了自身學習以外,是當你在面對一些概念或者問題的疑惑時,你能鍵入百度搜索后快速地鏈接到本文,并從中找到可執行的方案或者幫助你理解,而不是完完全全整篇的通讀。而當你確實是需要對所有的知識點有學習的需求時,你再選擇讀它,不僅僅是這一篇筆記或博文。不要浪費自己的時間,也要耐心地投入自己的時間。


如果想了解測序基本原理和知識,查看我整理的測序與平臺的幾個鏈接。

使用的學習數據:NCBI SRA (Sequence Read Archive)數據庫,數據集編號SRA091277

使用的是菊花轉錄組樣品,分析過程包括原始數據獲取、數據清理、質量控制、轉錄組拼接、轉錄本定量、標準化和表達差異分析等過程。

樣品名稱 樣品描述 RUN編號 測序長度
T1 處理組(脫水處理3小時) SRR921340 100bp
T2 處理組(脫水處理3小時) SRR921341 100bp
T3 處理組(脫水處理3小時) SRR921342 100bp
T1-1 處理組(脫水處理3小時) SRR921346 51bp
T2-1 處理組(脫水處理3小時) SRR921344 51bp
T3-1 處理組(脫水處理3小時) SRR921345 51bp
CK1 對照組(不做任何處理) SRR921321 100bp
CK2 對照組(不做任何處理) SRR921322 100bp
CK3 對照組(不做任何處理) SRR921324 100bp
CK1-1 對照組(不做任何處理) SRR921336 51bp
CK2-1 對照組(不做任何處理) SRR921337 51bp
CK3-1 對照組(不做任何處理) SRR921338 51bp

高通量測序基礎知識

(這里只記錄書中重要的知識點并加以理解)

基于第二代測序建立起來的基因組測序、RNA-seq和Small RNA-seq等應用,都由樣本收集、文庫制備和測序三個過程組成,不同之處在于樣品收集和文庫制備。

rna-seq.jpg

第二代測序儀(Illumina)測的序列,無論來自DNA-seq文庫還是RNA-seq文庫,從左到右依次分為3個區域:5'接頭(Adapter)區、目標序列區和3'接頭區。當多個樣品在一個泳道(Lane)中同時測序時,我們可以使用多樣品(Multiplex)技術,具體而言是給每個樣品分配一個不重復的條形碼(Barcode),其實質是一個6-8位的DNA序列,測序后可以通過這個序列將不同的樣品分開。單端測序(Single end)指僅從正向測序;雙端測序(Paired end)指先從正向測序,然后從反向測序。Barcode則根據另一引物“Sb”獨立測序得到。

理論上,由于制備的RNA-seq文庫插入長度的峰值常常為200或300bp,所以測序應該只得到文庫中目標序列5'端開始的部分(這就是常說的read了,以前總搞不懂~)。但是呢,文庫中會有少量目標序列不到測序長度(比如測100bp實際目標序列只有幾十),那么測序就可能會測到3'端接頭序列,這就是所謂的接頭污染。數據預處理時,如果發現接頭序列過多,一般是RNA-seq文庫插入長度沒有控制好;如果出現大量全長的3'接頭,一般是接頭過量,導致了大量接頭自連(Self ligation)。

實際應用中,估計測序深度使用更多的是達到質量標準的有效數據量,而不是原始數據量。當RNA-seq有效數據比例過低時,無法檢測一些低豐度的轉錄本,要考慮重新測序。

測序深度,也叫乘數,指每個堿基被測序的平均次數,是用來衡量測序量的首要參數。測序覆蓋度,也叫覆蓋率,指被測序到的堿基占全基因組大小的比率。假如用Illumina 2000測序儀完成一次人類基因組(3G大小)單端測序,即可得到300G數據(假設全部是有效數據),估計的測序深度即為100倍(300G/3G),常見表示為100X。將所有讀段比對到人類基因組,如果發現只有2.7G的堿基至少有1個讀段覆蓋到,其實際測序深度為111X(300G/2.7G),測序覆蓋度為90%(2.7G/3G)。

不同的測序目的要使用不同的測序策略。如DNA組裝使用較多的是2X100bp或更長的雙端測序;RNA-seq使用較多的是100bp或更長的單端鏈特異性測序;small RNA-seq多用50bp單端測序。

從測序得到的讀段組裝成目標基因組或者轉錄組的基因策略是比對和拼接,比對是把讀段定位到參考基因組或者轉錄組上,然后再拼接成連續序列;拼接也膠從頭組裝(Denovo assembly),是在沒有參考基因組或者轉錄組前提下,根據讀段之間的重疊區,把所有讀段拼接起來,直接獲得基因組或者轉錄組(參考文章)。

轉錄組比對常用的軟件有BWA、Bowtie和Tophat;拼接常用的軟件是Trinity。

基因組和轉錄組組裝的不同點:基因組組裝希望盡量獲得唯一或較少的組裝結果,即一致性序列(Consensus sequence)。一致性序列上并不是每個位點都只有一種堿基,它實際上只代表該位點出現頻率最高的堿基,存在兩種以上堿基的位點叫做雜合位點。注意,過分追求一致性會導致過拼接,即來自不同基因的相似序列會被誤拼接到一起。基因組和轉錄組組裝可以用一個非常重要的指標N50來評價,即將所有組裝后的序列按照長度從大到小排列,累加值接近所有序列長度總和一半時的那個位置對應的序列長度。N50越大,組裝的結果越好,類似的有N90。

測序的質量分數

Phred分數

測序中常用錯誤概率P_e(Error probability)來表示每個核苷酸測量的準確性,還可以賦予一個數值來更簡便地表示這個意思,叫做測序質量分數(Quality score)。因為這個分數最開始通過Phred軟件從測序儀生成的色譜圖中得到的,所以也叫做Phred分數(Q_{Phred})。Phred分數的取值范圍是0到93,可以表示很寬的誤差范圍,即從1(完全錯誤)到非常低的錯誤率10^{-93}。Phred分數是最基本的質量分數,其他的質量計分標準都來自Phred分數。
Q_{Phred} = -10\times log_{10}P_e

Q_{Phred} P_{e} Base call accuracy
0 1 0
10 0.1 0.9
20 0.01 0.99
30 0.001 0.999
40 0.0001 0.9999
50 0.00001 0.99999

Sanger分數(Phred+33)

Phred分數包括2位數字,還需要用空格分隔,不方便閱讀,又要占用大量存儲空間,實際上文件中不采用它。為了在文件中方便地表示質量,常常將Phred分數加上33(從33到126變化,ASCII碼正好覆蓋了可打印區),并用其ASCII碼值對應的字符表示,這就是Sanger分數。Sanger分數常用于FASTQ格式的文件。

Illumina/Solexa分數(Phred+64)

分數之間的轉換公式:
Q_{Solexa} = -10 \times log_{10}(\frac{P_e}{1-P_e}) \\ Q_{Solexa} = 10 \times log_{10}(10^{\frac{Q_{Phred}}{10}}- 1) \\ Q_{Phred} = 10 \times log_{10}(10^{\frac{Q_{Solexa}}{10}}- 1) \\
Solexa分數的取值范圍是-5到62,它在FASTQ文件中需要加上64并轉換為相應的ASCII碼值(59到126)對應的字符來表示質量。2006年,Illumina公司收購Solexa公司后繼續沿用其標準。顯著Illmina采用新的標準,采用了Phred分數(范圍0-62)加64的質量分數。

Sanger分數(Phred+33)和Illumina分數(Phred+64)是當前應用最為普遍的質量分數系統。

以Phred=20(即常見的Q20標準)為例,其Sanger分數為53,對應數字5;其Illumina分數為84,對應字母T。

Bioconductor中的ShortRead包提供了SolexaQuality和PhredQuality函數分別生成Illumina分數和Sanger分數。

source("http://Bioconductor.org/biocLite.R")
biocLite("ShortRead")
library(ShortRead)
Q=20
PhredQuality(as.integer(Q))
SolexaQuality(as.integer(Q))
> Q=20
> PhredQuality(as.integer(Q))
  A PhredQuality instance of length 1
    width seq
[1]     1 5
> SolexaQuality(as.integer(Q))
  A SolexaQuality instance of length 1
    width seq
[1]     1 T

高通量測序文件格式

FASTQ格式

FASTQ格式是序列文件中常見的一種,它一般包括四部分:第一部分是由“@”開始,后面跟著序列的描述信息(對于高通量數據,這里是讀段的名稱),這點跟FASTA格式是一樣的(起頭的符號不一樣);第二部分是DNA序列;第三部分是由“+”號開始,后面或者是讀段的名稱,或者為空;第四部分是DNA序列上每個堿基的質量分數,每個質量分數對應一個DNA堿基。

Bioconductor中的ShortRead包提供了quality函數可以自動識別FASTQ文件中的質量分數的種類。

我隨便寫了一個fastq的demo文件,內容

@HWUSI-EAS100R:123:COEPYACXX:6:73:941:1973#0/1
GATTTGGGGTTCAAAGCAGTATCGATCAAAATAGTAAAATCCATTTGTTCAACTCACAGTTT
+ HWUSI-EAS100R:123:***********************
!"************************************************************

進行一些操作:

library(ShortRead)
# 讀入FASTQ文件
reads <- readFastq("./demo.fastq")
# 得到質量分數的類型
score_sys <- data.class(quality(reads))
# 得到質量分數
qual <- quality(quality(reads)) # 這里好像一個quality函數就夠了,還是尊重原文吧
# 質量分數轉為16進制表示
myqual_mat <- charToRaw(as.character(unlist(qual)))

# 如果是Phred+64分數表示系統
if(score_sys=="SFastqQuality"){
  # 顯示分數系統類型
  cat("The quality score system is Phred+64", "\n")
  # 輸出原始分數值
  strtoi(myqual_mat, 16L)-64
}
# 如果是Phred+33分數表示系統
if(score_sys=="FastqQuality"){
  # 顯示分數系統類型
  cat("The quality score system is Phred+33", "\n")
  # 輸出原始分數值
  strtoi(myqual_mat, 16L)-33
}

The quality score system is Phred+33 
 [1] 0 1 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9

NCBI中的FASTQ與SRA格式

NCBI的Sequence Read Archive (SRA)數據庫,接受FASTQ格式的高通量數據上傳,并將分數標準從開始的Illumina分數轉換成了Sanger分數。而且,NCBI在讀段名稱前面增加了數據在SRA庫的編號和版本,后面增加了讀段的長度。SRA數據庫為了節省存儲空間,將FASTQ文件壓縮為二進制的SRA格式進行保存。用戶如果下載SRA格式數據,可以使用工具軟件fastq-dump將數據從SRA格式轉回FASTQ格式。

QUAL格式文件

Solid測序儀產生分離的序列文件(CSFASTA格式)和質量文件(QUAL格式),兩者必須成對出現。QUAL文件采用Phred分數,而且行必須與FASTA文件中的行一一對應。CSFASTA文件與FASTA格式看似相同,但實際不同,Solid不是用核苷酸殘基表示序列數據,而是采用了顏色空間的表示方法。Solid的序列文件如果和質量文件合并,可以產生CSFASTAQ格式的文件,也可以根據顏色編碼轉為真正的FASTAQ格式的文件。

Solid的結果文件轉為標準FASTQ格式的文件需要注意兩個問題第一是第1個堿基由于來自測序引物,必須刪除;第二就是由于Solid顏色空間的編碼是前后依賴的,一旦錯一個,會導致后面連續錯誤,一般都將參考基因組反轉為顏色空間編碼再進行比對等分析,而不主張將Solid的結果文件直接轉換為FASTQ文件。

關于常見的生信數據文件格式,參見生信常見數據格式

RNA-seq技術的特點

RNA-seq對芯片的優勢

RNA-seq檢測基因表達主要在7個方面比基因芯片有優勢。

基因芯片 RNA-seq
參考序列 需要 不需要
動態范圍
背景噪聲
受降解影響
序列變異 無法檢測 可以檢測
轉錄組方向 不能確定 能確定
可重復性 一般

RNA-seq存在的問題

  • RNA-seq測序之前需要一個比較復雜的文庫構建過程,這個過程的每一步都可能帶來誤差甚至導致實驗失敗。如cDNA片段化、PCR擴增等都會帶來偏倚,最終導致有的片段被反復測了多次,有的沒有測到。rRNA去除不干凈等因素也會帶來大量污染(即非目標序列)。還有其他一些實驗問題。
  • RNA-seq檢測靈敏度和最大值是隨測序深度變化的,深度不夠,不能發現超低表達的轉錄本,需要在測序前預估轉錄本大小。而由于復雜的RNA編輯等原因,高等生物的轉錄組與其編碼基因數量沒有固定比例關系,所以預估容易產生較大誤差。
  • 參考基因組或轉錄組不準確、測序誤差、錯誤拼接或比對帶來的錯誤會大大影響各種變異或者可變剪切事件的識別。
  • 各種其他的問題。比如整個實驗流程可能引進了各種污染;原始數據預處理的數據模型不完善等等。

下面看一下如何計算由測序誤差引起的Barcode的錯誤分配,假設Barcode(Barcode唯一確定樣本)長度為6個堿基,每個Barcode兩兩之間兩個堿基不同,所有的Barcode都用滿,同時假設錯誤的發生符合二項分布,那么只要2個堿基錯誤,就會發生一次錯誤分配,在Illumina測序儀每個堿基的平均錯誤率0.5%的前提下,下面例子可以計算出一個泳道的錯誤錯誤分配概率。

> p = 0.0005
> sum(sapply(2:6, FUN=function(k) choose(6,k)*p^k*(1-p)^(6-k)))
[1] 3.745003e-06

也就是說,在一個泳道,每百萬讀段就會有370個讀段分配錯誤。如果還考慮DNA簇混合和跳躍PCR引起的Barcode錯誤分配,這個數值還要高很多。這種分配錯誤對一般的轉錄組分析沒有影響,但是對一些高靈敏度的突變檢測項目影響很大。

Illumine 2000測序儀中,一次運行(Run)可以使用2個流動槽(Flow cell),每個流動槽包括8個泳道(Lane),一個泳道包含2個面(Surface),每個面還有3個條(Swath)也叫列(Column),每一列由16個小區(Tile)組成,后者又由大量DNA簇(Cluster)組成。

Illumine 2000測序儀每次運行(單端測序)理論上可以產生大約30億個DNA簇,每個DNA簇理論上可以產生一條讀段(Read),如果測序長度為100bp,一次運行可以得到3G個讀段,其原始數據量為300G個堿基。

RNA-seq數據預處理

RNA-seq數據預處理與基因芯片預處理的目的一致,都是要得到基因表達數據,這里確切說是轉錄本。但它們的實現細節和方法則有很大不同,下面逐一介紹。

質量控制

數據質量分析報告可以調用ShortRead包中的qa函數得到,另一個常用的工具是FastQC。

下面是一個用qa函數生成質量分析報告的實例,示例數據來自SRA數據庫的RNA-seq數據SRR921344。

library(BiocInstaller)
# 安裝包
biocLite("SRAdb")
biocLite("R.utils")
# 導入包
library(ShortRead)
library(SRAdb)
library(R.utils)
# download data
db_dir <- "~/Projects/coGECP-pro/db/"
sra_dbname <- paste0(db_dir, 'SRAmetadb.sqlite')    
sra_con <- dbConnect( dbDriver("SQLite"), sra_dbname )
getFASTQfile("SRR921344", sra_con, destDir = "~/Projects/coGECP-pro/fast-format/", srcType = 'ftp', ascpCMD = NULL )
dbDisconnect( sra_con )

# 解壓后改名
gunzip("../fast-format/SRR921344.fastq.gz", destname="../fast-format/T2-1.fastq")

# 需要分析的數據文件名稱
fastqfile="T2-1.fastq"
# 得到質量分析的記過
qa <- qa(dirPath = "../fast-format/", pattern=fastqfile, type="fastq")

# 輸出html格式的分析報告
report(qa, dest="qcReport", type="html")

執行完畢后會得到名為qcReport的結果目錄,主要包括質量分析的報告文件“index.html”和文件夾“image”,image文件夾下包括所有的統計信息圖示。

比較重要的圖示信息有前20個高頻出現的讀段統計信息,這對于確定接頭或者其他污染很重要。FastQC軟件帶有一個文件包括了常用的Illumina接頭序列,會把高頻出現的序列比對到這些接頭序列,并給予提示;Biocondutor則需要編程比對到NCBI UniVec數據庫(http://www.ncbi.nlm.nih.gov/tools/vecscreen/univec)來確定接頭序列。

接下來是四種堿基的逐點質量圖,該圖橫坐標是測序的循環數,對應測序時5'端開始的每個位點,縱坐標是所有該位點測量的堿基的質量分數平均數。

質量控制中最重要的一個圖是逐點質量圖,它與四種堿基逐點質量圖的區別在于不區分堿基種類,給出每個位點的測序質量分數的平均數、中位數和上下四分位線。

通過質量控制,可以確定當前樣品的數據是否應該保留進入下一步分析或者丟棄。對于通過質量控制的數據,還要進行讀段處理,清理后的數據才是實際分析中使用的數據。

讀段清理

讀段清理主要去掉讀段中多個“N”堿基,讀段兩端的低質量區域(質量分數少于Q20),讀段3'端可能混入的接頭序列,還有可能污染進來的rRNA和病毒序列。

轉錄組組裝

轉錄組組裝包括從頭組裝和基于參考序列的組裝。從頭組裝最常用的軟件是Trinity,其優點是:不依賴參考序列;能較好地重建變異的、可變剪切的或者來自染色體重組的轉錄本。從頭組裝的缺點是會消耗大量的內存資源,測序深度的需求也很高,對測序錯誤很敏感,高相似度的轉錄本可能會被誤拼到一起。基于參考序列的組裝常使用TopHat和Cufflinks(主要用于轉錄本的識別、定量、標準化與差異分析)兩種軟件的組合來完成。其優點是:內存需求小;污染影響小,因為污染讀段不能比對到參考序列;靈敏度高,所需測序深度低,能檢測低豐度的轉錄本;組裝的轉錄本序列更完整;可以增加參考基因組中的轉錄本注釋。基于參考序列的組裝的缺點:嚴重依賴參考序列及其注釋信息等。

轉錄組定量和標準化

有參的轉錄組定量,需要利用TopHat比對軟件將所有讀段比對到參考基因組上,然后由Cuffinks軟件完成定量;無參的轉錄組定量需要利用Bowtie或BWA比對軟件將所有讀段比對到組裝得到的轉錄組上直接計數。

單端測序讀段的比對比較簡單,雙端測序的質量不一致,往往是反向一端測序質量低,如果按照同樣的標準要求兩端測序的讀段都比對上,會丟失很多比對結果。一般采取的方式是兩端讀段分別依據不同的標準(例如正向允許錯配一個,反向允許錯配兩個)做單端比對,然后根據兩端對齊后中間距離抽取成對的比對結果。

轉錄組定量得到的基因表達矩陣是簡單計數得來的,因此稱作原始計數(Raw counts)。有參的轉錄組定量,可以用Bioconductor的GenomicRanges/Rsamtools軟件包中的summarizeOverlaps函數實現。輸入的數據為比對后得到的Bam或者Sam文件,經過基因水平或者外顯子水平的計數,可以直接輸出為某種預定義對象,便于下游軟件(如edgeR包和DESeq包)繼續處理。

下面例子使用summarizeOverlaps函數從Bam文件中獲取原始計數,并輸出為edgeR包和DESeq包中的數據對象。

require(BiocInstaller)
# biocLite("TxDb.Dmelanogaster.UCSC.dm3.ensGene")
# biocLite("DESeq")
require(Rsamtools)
require(DESeq)
require(edgeR)
require(pasillaBamSubset)
library(GenomicAlignments)

#此處數據已經不能用了,所以從其他包里弄了個bam格式文件試試
# bamfile <- system.file("extdata", "ex1.bam", package="Rsamtools")
# bf1 <- BamFileList(bamfile, index=character())
# features <- GRanges(seqnames = c())

# from GenomicRanges::GenomicRangesHOWTOs   
reads <- c(untrt1=untreated1_chr4(),
             untrt3=untreated3_chr4())
# single-end reads
# paired-end reads

library(TxDb.Dmelanogaster.UCSC.dm3.ensGene)
exbygene <- exonsBy(TxDb.Dmelanogaster.UCSC.dm3.ensGene, "gene")
se <- summarizeOverlaps(exbygene, reads, mode="IntersectionNotEmpty")

# back 
deseq <- newCountDataSet(assays(se)$counts, rownames(colData(se)))
edger <- DGEList(assays(se)$counts, group=rownames(colData(se)))

類似基因芯片,RNA-seq定量后的數據需要標準化,使得所有的樣品具有可比性。最常見的一個指標是RPKM(Reads Per Kilo base per Million reads),即每百萬讀段中來自某一個基因每千堿基長度的讀段數目。具體計算時使用比對到某個基因的讀段個數除以比對到基因組或者轉錄組的所有讀段個數(以百萬為單位),再除以基因或轉錄本的長度(以KB為單位)。基因表達差異分析的常用軟件edgeR軟件和DESeq都自帶了數據標準化功能,可以直接處理用原始計數表示的基因表達矩陣,RPKM表示的基因表達矩陣的使用主要是為了方便用戶直接觀察數據。

RNA-seq數據分析

RNA-seq數據與表達譜芯片數據在基因表達差異的顯著性分析流程基本相同,不同的地方只在確定差異表達基因方面。

基因表達差異的顯著性分析

表達差異分析只對比不同樣本之間的同一個轉錄本,所以不需要考慮轉錄本長度,只考慮總讀段數。一個最簡單思想就是,樣本測序得到的總讀段數(實際上是可以比對到轉錄組的總讀段數)越多,則每個基因分配到的讀段越多。因此最簡單的標準化因子就是總讀段數,用總讀段數作標準化的前提是大部分基因的表達是非顯著變化的,這與基因芯片中的基本假設相同。但是實際工作中發現很多情況下總讀段數主要是一小部分大量表達的基因貢獻的。Bullard等(2010)在比較了幾種標準化方法的基礎上發現在每個泳道內使用非零計數分布的上四分位數(Q75%)作為標準化因子是一種更穩健的選擇,總體表現是所研究方法中最優的。

Bioconductor的edgeR包和DESeq包分別提供了上四分位數和中位數來作為標準化因子,就是出于這個思想。

edgeR提供了三種標準化算法,分別是M值加權截斷均值法(Weighted trimmed mean of M-values, TMM),相對對數表達值法(Relative log expression, RLE)和上四分位法(Upperquartile),其中TMM是默認設定。這些標準化方法大同小異,其基本思想就是去除表達值較大的少數基因的影響,而保留大部分沒有顯著變化的基因。

由于基因芯片檢測雜交的熒光強度信號是連續值,往往假設它符合正態分布;而RNA-seq測量的是離散值,最簡單的假設就是二項分布。由于RNA-seq讀段數量非常多,而且一條讀段映射到一個給定基因的概率足夠小,在實際計算中,二項分布常用它的極限形式泊松分布來替代。泊松分布的一個性質是其方差等于均值,但是當有生物學重復時,RNA-seq數據會表現出比泊松分布期望的更高的變異性,對相當多的基因來說方差可能超過均值,這種現象叫過離散。對過離散數據,基于泊松分布假設的分析容易低估不同生物學重復帶來的取樣誤差而得到過多的假陽性的差異表達基因。為了允許額外的變異,一個自然的想法就是給均值加上一個散度參數,以使方差可以大于均值。于是作為泊松分布的推廣,又引入了負二項分布(NB)來作為基本假設,負二項分布是當前基因表達的顯著性分析中最常用假設

現在從百度百科摘取二項分布與負二項分布的公式,以加強理解。

二項分布,即重復n次的貝努利試驗,用\xi表示隨機試驗的結果。如果事件發生的概率是p,不發生的概率是1-p,那么N次獨立重復試驗中發生k次的概率是:
P(\xi=k)=C_n^k * p^k *(1-p)^{n-k}
期望:E_\xi = np

方差: D_\xi = npq

而負二項分布的公式(概率密度)為:
f(k; r, p)=P_r(x=k) = C_{k+r+1}^{r-1}*p^k*(1-p)^{n-k}
它表示,已知一個事件在貝努利試驗中每次的出現概率是p,在一連串貝努利試驗中,一件事剛好在第r+k次試驗出現第r次的概率。

寫作:X ~ NB(r; p)

基于負二項分布的edgeR、DESeq包是當前最主要的分析程序。在edgeR中,對于任一樣品i中的任一個基因g,假設它的分布符合負二項分布。
Y_{gi} = NB(M_ip_{gj}, \phi_g)
其中M_i是樣品i中的讀段總數(實際中是可以比對上的讀段總數);\phi_g就是基因g的散度;p_{gj}是基因g在某個實驗條件j下或者分組j中的相對豐度。第g個基因在某個實驗條件j下或分組j中,NB分布的均值為\mu_{gj}=p_gjM_i,方差為\mu_{gj}(1+\mu_{gj}\phi_g),對于表達差異分析,需要估計的是散度\phi_g,當它趨于0時,負二項分布退化為泊松分布,這時方差退化為第一項\mu_{gj},一般認為來自技術重復,方差第2項\mu^2_{gj}\phi_g來自生物學重復。

RNA-seq數據分析往往只有很小的樣本量,為每個基因估計一個散度非常困難。比較好的策略是允許不同的基因有不同的個體散度,而這些個體散度的估計可以用一些合適的統計方法借助基因間的信息來改進。相對于edgeR,DESeq默認設置采取了最保守的估計策略,即選取每個基因的經驗散度和擬合得到的散度趨勢線取值中最大的作為最終的散度估計值,因此DESeq往往選出更少的差異表達基因(為什么呢?)。DESeq由于可以利用同一個樣本基因間的數據估計散度,而不一定需要重復樣本來計算,因此可以直接用于無重復實驗的表達差異分析。

后面一些實例代碼不好重復,不再描述。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容