R 讀取 FASTQ 檔

R 的 ShortRead 套件用於處理高通量定序產出的 FASTQ 檔,其功能包含讀寫 FASTQ 檔、計算序列統計量、裁切與篩選低品質序列等。目前,ShortRead 被保留在 Bioconductor ,並由開發團隊持續更新與維護。

ShortRead 支援的 function
ShortRead 支援 FASTQ 檔案操作和序列品質控管 (圖:Morgan. (2013) An Introduction to ShortRead)


在 R 視窗中,輸入以下指令即可安裝此套件。
>if (!require("BiocManager", quietly = TRUE))
    install.packages("BiocManager")

BiocManager::install("ShortRead")

FASTQ 格式簡介

FASTQ 格式以四列字串記錄每一條核酸的辨識碼、序列及定序品質。

>@A77AV140207:1:1101:10732:16139/1  \\ sequence identifier
AACGTAGGTCACAAGCGTTGTCCGGAATTACTG   \\ raw sequence letters
+ 				    \\ optional description
?ABBBFFBF5B4BBG4AEEGGB5BEE1=1<E@1   \\ quality code
  • sequence identifier:首列以 @ 起頭,藉此區分每條核酸的紀錄。這一列通常會記錄序列的標識碼、定序儀器代碼、核酸在定序晶片的位置、barcode等資訊,不同定序平台有不同的格式。值得留意的是,在雙端定序的結果中,順向序列會在首列的最後標註 1,逆向序列則會標註 2
  • raw sequence letters:次列則核酸各位置的鹼基種類,即 A、T、C、G、N(N 表示不明),所以此列長度等同定序讀長。
  • optional description+ 號列,無含義。(雖然維基百科介紹說,這列可添加額外資訊,但目前還沒看過這樣標示的當案)
  • quality code:與第二列一一對應,反映定序品質的ASCII字符。

序列的定序品質可以用 error probability(定序儀器誤判鹼基種類的機率)評估,error probability 愈低則定序的品質越高,即兩者呈負相關。

為了便於理解和檢視,error probability 需經數值轉換和 ASCII 編碼,才會成為 FASTQ 檔內的 quality code,所以 FASTQ 格式的第四列才會存在各種符號。

簡言之,error probability (P) 會先轉變為整數形式且與品質正相關的 quality value (Q)。雖然曾出現許多種轉換方式,但目前最通用方式為 phred quality score,即

$$Q = -10 log_{10}{P}$$
接著,為了方便存儲,quality value 會再依 ASCII 規範編碼成單一字符。編碼方式則依照定序平台和其版本而異,所以平台間的 quality value 範圍也各不相同。

平台間的編碼方式與 quality value 範圍各不相同(圖:https://en.wikipedia.org/wiki/FASTQ_format

綜上所述,error probability 與 quality code 之間的關係為
>  error probability (float) 
→ quality value      (int) 		
→ quality code 	     (character)

讀取 fastq 檔案

使用 readFastq 即可讀取 FASTQ 並存為 ShortRead 物件。

>> library(ShortRead)
> rfq <- readFastq("./data/G64589_R1_001.fastq")
> rfq
class: ShortReadQ
length: 13510 reads; width: 175 cycles \\ length 是序列數,width 是序列長

也可以借助檔名的共同模式,一次讀取多個 FASTQ 檔。然而,這項操作會合併所有檔案的序列,所以無法追溯各自源於哪個檔案。

>> rfqs <- readFastq("./data/", pattern = "_001.fastq")
> rfqs
class: ShortReadQ
length: 51508 reads; width: 175 cycles

檢視序列的標識碼、鹼基種類與品質分數

ShortReadQ 物件包含 @id@sread@qulity,分別對應 FASTQ 格式的ID、sequence letters 與 quality code。

瀏覽標識碼

>> rfq@id[1:2]	\\ or id(rfq)[1:2]
BStringSet object of length 2:
    width seq
[1]    32 A77AV140207:1:1101:10732:16139/1
[2]    32 A77AV140207:1:1101:10743:16162/1
id(rfq)這寫法有時會和其他套件的 function 衝突,這時要改寫為 ShortRead::id(rfq)才能順利運作。

瀏覽序列

> rfq@sread[1:2] \\ or sread(rfq)[1:2]
DNAStringSet object of length 2:
    width seq
[1]   175 AACGTAG...GATAC
[2]   175 AACGTAG...ATATG

瀏覽品質分數

> rfq@quality[1:2] \\ or quality(rfq)[1:2]
class: FastqQuality
quality:
BStringSet object of length 2:
    width seq
[1]   175 ?ABBBFF...#####
[2]   175 AAAAACF...#####

查閱每個 ASCII 記號對應的品質分數

> encoding(quality(rfq))[1:15]
 !  "  #  $  %  &  '  (  )  *  +  ,  -  .  / 
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 

取得定序品質指標

將 FastQuality class 的物件轉換為 quality value matrix。其中,row 為序列, column 則是序列上各鹼基的位置,每一元素都記錄了序列各鹼基的 quality value。

># transform FastqQuality class into matrix
> rfq_to_matrix <- function (rfq) {
	return(as(quality(rfq), "matrix"))
}
> Qval <- rfq_to_matrix(rfq)
> Qval[1:5, 1:5]
     [,1] [,2] [,3] [,4] [,5]
[1,]   30   32   33   33   33
[2,]   32   32   32   32   32
[3,]   32   32   32   32   32
[4,]   32   32   33   33   33
[5,]   34   34   34   34   34

由於 quality value matrix 不含序列 ID,所以要手動添加

>row.names(Qval) <- as.character(rfq@id)

延伸計算

Quality value,依照 Phred score 關係式回推 error probability。

># Transform phred score into error probability
errProb <- 10^-(Qval/10)

接著加總各列的定序錯誤率,可獲得各序列的 expected errors(錯誤鹼基數量期望值)

># Calculate expected errors for each read
ee <- rowSums(errProb)

最後使用內建的資料選取方式,移除低品質序列。

># Discard read with expected errors above 5
> ee[ee <= 5]

小結

># 讀取 FASTQ 為 ShortRead 物件
rfq <- readFastq(path)
# 轉換 ShortRead 物件為 quality value matrix
Qval <- as(quality(rfq), "matrix")
# 轉換 Phred score 為 error probability
errProb <- 10^-(Qval/10)
# 計算 expected errors
ee <- rowSums(errProb)

沒有留言:

張貼留言

Back to top