ubiome類似數據dada2處理探索6

接着前面的內容,這裏再進行下數據庫的處理,看看從參考數據庫就按測序數據處理是不是能提高物種註釋的精度。這裏先預報一下,種的分類結果並不能有明顯的提升,或許是因爲序列長度的缺陷,即使再努力提高技巧,終究不能解決根本的問題,250bp的長度,對比1500bp左右的全長,顯然還是太短了,難以實現精確的分類,所以,要想更精確,只有上16S全長,這隻能寄望於Pacbio,Oxford Nanopore,和10x linked reads或者類似的技術,比如華大的sLtFR等技術提升讀長了。再激進些,等測序成本足夠低,上宏基因組,宏轉錄組了。

Anyway,記錄一下我這次探索的過程。

1.使用qiime2截取V4區域

其實,自己寫腳本也是能搞定的,但是,畢竟自己的水平自己清楚哈,能用大神的就用大神的。大神經驗豐富,能夠解決引物配的問題,比如兩個鹼基模糊匹配,以模擬真實PCR過程中的錯配情況等等。要我做的話,只能簡單正則表達式解決完全匹配的情況,註定要miss一些序列,這會對準確性造成一定影響,特別是碰巧這些序列是你需要的話。以下是我的步驟:

#激活conda和進入qiime環境,如果你需要conda推薦這篇[1]
source ~/Miniconda3/bin/activate
conda activate qiime2-2019.10
#導入Silva132數據庫中的原始序列(99%相似度聚類)
#下載自這裏https://www.arb-silva.de/fileadmin/silva_databases/qiime/Silva_132_release.zip
qiime tools import \
  --type 'FeatureData[Sequence]' \
  --input-path SILVA_132_QIIME_release/rep_set/rep_set_16S_only/silva_132_99_16S.fna \
  --output-path s_otus.qza
 ##截取V4區域,使用515F-806R,  V4最新引物,emp 16s protocol[2]
time qiime feature-classifier extract-reads \
  --i-sequences s99_otus.qza \
  --p-f-primer GTGYCAGCMGCCGCGGTAA \
  --p-r-primer GGACTACNVGGGTWTCTAAT \
  --o-reads sref-seqs.qza

2.序列探索和處理

首先,把序列提取出來,qiime2的序列qza文件是可以直接重命名爲zip格式文件解壓的,就解壓sref-seqs.qza後從文件夾裏的data子文件夾裏找到了序列文件,dna-sequences.fasta,368240條序列。

稍微統計了一下序列長度分佈,以及在其中找不找得到引物。發現只有少部分的序列能夠找到引物,一般是隻能找到一端,應該講,軟件是可以直接切去引物的,留下的應該只有v4區的真正序列而已。而這少部分能找到引物的序列,應該是在其他位置錯誤匹配到了引物序列。中間有個小插曲,最後一個序列始終會丟掉,由於幾個月沒怎麼用python,算法有點生疏了,於是只能在獲得的序列直接加了個隨便的序列名暫時解決了。用了個腳本來解決:

def deal_with_seq(seq,seq_name):
  '''
  簡單的以引物中不存在簡併的幾個鹼基來查找序列中引物存在與否,以及其位置
  然後,處理這些序列爲120+10+120
  '''
	primer_F = 'GCCGCGGTAA'
	primer_R = 'ATTAGA'
	seq_F = ''
	seq_R = ''
	if primer_F in seq and primer_R not in seq: #只找到正向引物的情況
		seq_F = seq.split(primer_F)[1][1:120] #正向引物後120bp,對應之前的測序reads切到120bp
		seq_R = seq.split(primer_F)[1][-120:] #同上
		print(len(seq.split(primer_F)[1])) #看下除了引物後的序列長度
		seq = seq_F + "NNNNNNNNNN" + seq_R #以10個N連接,對應之前的數據處理
	elif primer_R in seq and primer_F not in seq: #只找到反向引物的情況 
		seq_R = seq.split(primer_R)[0][-120:]
		seq_F = seq.split(primer_R)[0][:120]
		#print(seq_F, seq_R)
		print(len(seq.split(primer_R)[0]))
		seq = seq_F + "NNNNNNNNNN" + seq_R
	elif  primer_F in seq and primer_R  in seq: #雙向引物都找到的情況
    print(len(seq.strip()))
		seq_F = seq.split(primer_F)[1][:120]
		seq_R = seq.split(primer_R)[0][-120:]
		seq = seq_F + "NNNNNNNNNN" + seq_R
	else: #其他的情況,默認是隻有v4區序列了
		print(len(seq.strip()))
		seq = seq[:120] + "NNNNNNNNNN" + seq[-120:]
	return seq


def get_250_otus():
  '''
  讀取和存儲這些序列
  '''
	fout = open('250_otus.fasta', 'w')
	f_length = open('250_otus_length.txt', 'w')
	f_undealed = open('undealed.fasta', 'w')
	dic_length = {}
	with open('dna-sequences.fasta') as f:
		seq_name = ''
		seq = ''
		for line in f:
			if line.startswith('>'):
				if seq_name != '':
					dic_length[seq_name] = 0
					dic_length[seq_name] = len(seq)
					seq = deal_with_seq(seq, seq_name)
					f_undealed.write(seq_name + seq + '\n')
					fout.write(seq_name + seq + '\n')
					f_length.write(seq_name + str(dic_length[seq_name]) + '\n')
					seq_name = line
					seq = ''
				else:
					seq_name = line
			elif line.strip() != '':
				seq += line.strip()
	fout.close()
	f_length.close()
	f_undealed.close()


if __name__ == '__main__':
	get_250_otus()

統計一下序列長度分佈:

從柱狀圖可以看出,絕大絕大多數是251-260bp的長度,其餘的序列是可以忽略的,這個結果還是比較靠譜的。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ap0LoKsU-1580622344861)(https://jiawen.zd200572.com/wp-content/uploads/2020/02/250otu.png)]

3.訓練模型,測試物種註釋效果

告別前面自己造的小輪子,迴歸qiime2的流程。

#重新導入序列
qiime tools import \
  --type 'FeatureData[Sequence]' \
  --input-path /Users/zd200572/Biodata/Refrence/8c74b73b-c49b-44f1-bfba-54df23b1c8d3/data/250_otus.fasta \
  --output-path s250_otus.qza
 #訓練模型,比較在耗時,特別是我的筆記本性能一般,大概相當於i5一代的水平,16G內存
 time qiime feature-classifier fit-classifier-naive-bayes \
  --i-reference-reads s250_otus.qza \
  --i-reference-taxonomy sref-taxonomy.qza \
  --o-classifier classifier_silva_V4.qza
  #兩個多小時,8140.54s user 1138.65s system 93% cpu 2:45:32.42 total
  #物種註釋
  time qiime feature-classifier classify-sklearn \
  --i-classifier classifier_silva_V4.qza \
  --i-reads rep-seqs.qza \
  --o-classification taxonomy250.qza
  #754.47s user 57.61s system 80% cpu 16:47.93 total

4.和之前的模型的比較

在其他分類級別上沒有明顯差別,在屬上有明顯地提升從194->283,看了一下基本上分類明確的屬,做的這一切還是比較值得的。但是還要確定是否有假陽性的情況,種上的分類情況就不忍直視了,基本上是未分類種。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-r5IZgdqu-1580622344869)(https://jiawen.zd200572.com/wp-content/uploads/2020/02/youhuahou.jpg)]

再來看看優化後屬的柱狀圖,分類確實更好了:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-o0KlyrwB-1580622344871)(https://jiawen.zd200572.com/wp-content/uploads/2020/02/barplots.jpg)]
之前的探索
1.ubiome數據分析流程學習筆記1

2.ubiome類似數據dada2處理探索2

3.ubiome類似數據dada2處理探索3

4.​ubiome類似數據dada2處理探索5

參考:

1.conda管理生信軟件一文就夠

2.16S Illumina Amplicon Protocol : Earth Microbiome Project

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章