最近有朋友和我交流納米孔16S測序數據的分析,發現真的沒有從頭完成過一次這方面的數據分析,然後發現這方面的資料也比較少,於是學習一下,和大家分享。坦白說,牛津納米孔測序技術在16S多樣性研究方面還是有些不足的,只能說勉強夠用,主要應用場景是在一些現場快速檢測方面,主要是病原菌這種。但是,相信隨着測序準確度的提高和分析軟件的改進,相信它的應用會越來越多。感謝互聯網的便利和分享精神,今天的我們可以方便地獲得測序的原始數據,並可以自由進行分析。
1.軟件和數據準備
處理牛津納米孔的測序數據,首先當然要安裝相關的專用軟件了,基本上原廠出的,原廠品質,放心!還有就是minimap2和yacrd,用於去嵌合。數據來自一篇文章,文件不大,直接下載或者ascp下載均可。
#這個流程可參考https://github.com/tetedange13/stage_M2BI_scripts
#軟件準備
#首先是NanoPlot,用於檢測測序質量,直接pip安裝了,加速的話可使用清華源
pip install NanoPlot
#去接頭的Porechop
git clone https://github.com/rrwick/Porechop.git
cd Porechop
python3 setup.py install
porechop -h
#質控的NanoFilt,pip或bioconda安裝
pip install nanofilt
#minimap2,編譯或者下載預編譯的二進制文件均可,這裏編譯
git clone https://github.com/lh3/minimap2
cd minimap2 && make
#yacrd,conda安裝
conda install yacrd
#獲取數據,我是ascp下載
/Volumes/10.11/Users/zd200572/Applications/Aspera\ Connect.app/Contents/Resources/ascp -i ~/asperaweb_id_dsa.openssh -Tr -Q -l 100M -P33001 -L- [email protected]:vol1/fastq/ERR277/007/ERR2778177/ERR2778177.fastq.gz .
#比對工具last,一款來自日本的比對軟件,需要編譯
wget http://last.cbrc.jp/last-1060.zip
unzip last-1060.zip
cd last-1060
make
#blast diamond seqkit
conda install -c bioconda diamond blast seqkit
#如果wget或者瀏覽器下載地址是wget http://ftp.ebi.ac.uk/vol1/fastq/ERR277/007/ERR2778177/ERR2778177.fastq.gz
#ncbi的16S數據庫,由於出國網絡差,下了好久,一定要確保數據下載完整,注意下載時勾選gi號,以備後面有用
#https://www.ncbi.nlm.nih.gov/nuccore?term=33175%5BBioProject%5D
#這裏我把這個文件存在了網盤,公衆號內回覆“16S”即可獲得下載地址
2.數據預處理
基本上是質控的過程,先看下測序質量,當然納米孔的質量還是有點低的,特別是手上下載的數據是低版本的測序芯處R9.4,未來的R10可以通過兩個納米孔串聯提高到95%。接着就是去除測序的接頭,獲得真正的測序序列,是不是引物也應該切除?但是估計數據庫裏的序列也應該不包含引物,所以估計引物影響不大。然後,進行過濾,除去明顯不符合要求的序列。
#查看質量,fastq最常用,這裏用官方的試試
NanoPlot -t 4 --fastq ERR2778177.fastq.gz --plots hex dot
結果依然是類似於fastq質控報告的一個函數,不過統計指標少了幾個,有兩個把reads長度和質量分佈放在一起的圖不錯。
#去接頭,4線程,這一步耗時以小時計,對於我的五年前的雙核心四線程筆記本
porechop -t 4 -i input.fastq -o trimmed.fastq
# 質控,質量值爲9,長度200過濾,雖然有點低,這有兩個重定向
NanoFilt -q 9 -l 200 < trimmed.fastq > cleaned.fastq
#去嵌合,先minimap2自全局比對,發現嵌合,然後yacrd去除
minimap2/minimap2 -x ava-ont -g 500 cleaned.fastq cleaned.fastq > overlap.paf
yacrd -i overlap.paf -o report.yacrd -c 4 -n 0.4 scrubb -i cleaned.fastq -o reads.scrubb.fq
#卡在這時間最長,主要幾個文件要準備,需要整理的已經放在文件夾,其餘的可以ncbi下載,較大,沒放,或者直接用我建好的。
#看下文件的保留情況,大概去除了一半以上的數據
tree -h | grep q
├── [237M] ERR2778177.fastq.gz
├── [224M] cleaned.fastq
├── [200M] reads.scrubb.fq
└── [476M] trimmed.fastq
3. last比對
關於納米孔16S的數據分析,之前翻譯的那篇綜述總結了大概有兩種,一種是和之前的16S數據分析一樣聚類ASV/OTU,但是由於90%左右的準確度,看有用85%的準確度聚類的。。。另一種就是,不聚類,直接進行比對,也就是我們這次學習的blast等比對工具的方法,根據綜述作者的觀點,這幾種工具由於不是專門爲納米孔測序數據設計,不能比較好的完成物種註釋的任務(不夠準確),作者推薦的是minimap2和centrifuge這兩個軟件。但是,有很大一部分文章是以這幾個工具進行數據分析的,我們也做一下,最後進行一個比較吧!
# 構建參考數據庫
last-1060/src/lastdb -uYASS -R01 microbialdb ncbi-16S.fasta
# 比對https://gigascience.biomedcentral.com/articles/10.1186/s13742-016-0111-z#Sec12
last-1060/src/lastal -P 4 -q 1 -b 1 -Q 0 -a 1 -e 45 microbialdb cleaned.fastq > aligned.maf
# 轉換成BLAST格式
last-1060/scripts/maf-convert blasttab aligned.maf > aligned.txt
### 4.結果處理,獲得物種丰度表
由於自己水平還不夠寫腳本從比對結果中獲得物種註釋,腳本基本上來自臺灣的那個同仁的。確切的說應該還是對比對結果的數據結構不夠熟悉,爭取後面多熟悉些。爲了實現使用他的腳本,對數據庫的信息進行了一些小的提取操作,用我暫時用得比較順手的python完成的。我已經把處理好的數據上傳了百度雲,直接使用的話可以略過。
--------------我是分界線的開始-----------
`cat ncbi-16S.fasta | grep ">" > conv.txt #先獲得序列名信息備用`
```python
dic_fa = {}
i = 0
with open('conv.txt') as f:
for line in f:
i += 1
if line.strip() != '':
ac_n = line.strip().split('|')[3]
gi_n = line.strip().split('|')[1]
dic_fa[ac_n] = ''
dic_fa[ac_n] = [gi_n, line.strip()]
print(i)
j = 0
fout = open('info.txt', 'w')
with open('sequence.gb') as f1:
for line in f1:
if line[:7] == "VERSION":
seq_name = line.strip().split(' ')[1].split(' ')[0]
if '/db_xref="taxon:' in line:
tax_id = line.strip().split('/db_xref="taxon:')[1].split('"')[0]
if seq_name in dic_fa.keys():
fout.write(dic_fa[seq_name][1] + '\t' + tax_id + '\n') #+ seq_name + '\n')
seq_name = ''
tax_id = ''
j += 1
print(j)
fout.close()
--------------我是分界線的結束-----------
# 加載包,第一次看到這樣的方式
suppressMessages(library(data.table))
suppressMessages(library(tidyverse))
# 設置文件位置
id_mapping_file <- "/Volumes/Data/Biodata/Nanopore-16S/info.txt"
blastOutputs <- "/Volumes/Data/Biodata/Nanopore-16S/aligned.txt"
#導入輸入文件
id_mapping <- fread(id_mapping_file, header = FALSE, sep = "\t", stringsAsFactors = FALSE)
setkey(id_mapping, V1)
blastoutput <- fread(blastOutputs, header = FALSE, sep = "\t", stringsAsFactors = FALSE)
blastoutput_filtered <- blastoutput %>%
dplyr::filter(V3>=90 & V4>=700) %>%
group_by(V1) %>%
dplyr::filter(V3 == max(V3)) %>%
dplyr::filter(V12 == max(V12))
allreadsnum <- length(unique(blastoutput$V1))
readStats <- table(blastoutput_filtered$V2)
refseqIds <- names(readStats)
df <- data.frame(RefseqID = refseqIds,
Lineage = NA,
ReadsNum = NA,
OrgName = NA,
ReadsPerc = NA)
#循環獲得信息
for (i in 1:length(refseqIds)) {
refseqid <- refseqIds[i]
tmp <- id_mapping[.(refseqid)]
lineage <- tmp$V3
orgname <- tmp$V4
readnum <- readStats[refseqid]
perc <- readnum*100/allreadsnum
df$Lineage[i] <- lineage
df$ReadsNum[i] <- readnum
df$ReadsPerc[i] <- perc
df$OrgName[i] <- orgname
}
taxonomy <- paste(df$Lineage, df$OrgName, sep="; ")
output_df <- data.frame(Taxonomy = taxonomy, ReadsNumber = df$ReadsNum)
output_df <- aggregate(output_df$ReadsNumber,
by = list(Taxonomy=output_df$Taxonomy),
FUN = sum)
colnames(output_df)[2] <- "ReadsNumber"
ReadPercentage <- output_df$ReadsNumber*100/allreadsnum
output_df <- cbind(output_df, ReadPercentage)
output_df <- output_df[order(output_df$ReadPercentage, decreasing = TRUE),]
#output <- paste0("tax_", sub("\\.\\/Alignment\\/", "", file))
write.table(output_df, 'out.txt', sep = "\t", row.names = FALSE, quote = FALSE)
最後,如果順利,就是結果了:
Taxonomy | ReadsNumber | ReadPercentage | |
---|---|---|---|
266 | Trichocoleus desertorum strain ATA4-8-CV2 | 1046 | 41.85674270 |
159 | Neosynechococcus sphagnicola strain sy1 | 248 | 9.92396959 |
267 | Tychonema bourrellyi strain CCAP 1459/11B | 110 | 4.40176070 |
111 | Kastovskya adunca strain ATA6-11-RM4 | 104 | 4.16166467 |
168 | Okeania plumata strain FK12-27 | 74 | 2.96118447 |
120 | Loriellopsis cavernicola strain LF-B5 | 53 | 2.12084834 |
40 | Cephalothrix komarekiana CCIBt 3277 | 42 | 1.68067227 |
33 | Caedimonas varicaedens strain 221 | 41 | 1.64065626 |
12 | Aliterella antarctica strain CENA408 | 33 | 1.32052821 |
118 | Limnoraphis robusta strain CCALA 966 | 31 | 1.24049620 |