ubiome類似數據dada2處理探索2

繼續之前未完成的筆記,前面實現了使用qiime2-dada2插件初步探索,結果以無敵的報錯失敗告終,這裏進入R包,更靈活地處理數據,下面是我的詳細步驟。

1.上次未完成的準備工作

#設置R包的工作目錄,不是R語言的,這只是個變量而已
path <- "/Users/zd200572/Biodata/16S/process-ubiome-16S/primer-cutted"
# 獲得目錄中的數據列表
fnFs <- sort(list.files(path, pattern="_1.fastq", full.names = TRUE))
fnRs <- sort(list.files(path, pattern="_2.fastq", full.names = TRUE))
# 獲取樣本名稱
sample.names <- sapply(strsplit(basename(fnFs), "_"), `[`, 1)
#看下樣本,爲了簡單,我就放了一個樣本
fnFs
[1] "/Users/zd200572/Biodata/16S/process-ubiome-16S/primer-cutted/sIL10-2-S-4_1.fastq"

2.數據質量質控

質量控制是必由之路,看下這個質量圖,與qiime2的交互動態圖不同,這個是靜態的,

#看看質量情況,可以看出最後的質量值差到不忍直視了,難怪拼接率只有3%
plotQualityProfile(fnFs[1:2]) #正向質量
plotQualityProfile(fnRs[1:2]) #反向質量

3.過濾和修剪

這裏還有個嚴重不合格樣本的數據過濾,爲了流程命名不變,我也走一遍。

# Place filtered files in filtered/ subdirectory
filtFs <- file.path(path, "filtered", paste0(sample.names, "_F_filt.fastq.gz"))
filtRs <- file.path(path, "filtered", paste0(sample.names, "_R_filt.fastq.gz"))
names(filtFs) <- sample.names
names(filtRs) <- sample.names

然後,我又通過fastqc看了下,序列基本上都是在120bp以後質量顯著下降,於是正反向從120bp開始截取。

out <- filterAndTrim(fnFs, filtFs, fnRs, filtRs, truncLen=c(120,120),
                     maxN=0, maxEE=c(2,2), truncQ=2, rm.phix=TRUE,
                     compress=TRUE, multithread=TRUE) # On Windows set multithread=FALSE
head(out)
                    reads.in reads.out
sIL10-2-S-4_1.fastq   198387    194949
errF <- learnErrors(filtFs, multithread=TRUE)
errR <- learnErrors(filtRs, multithread=TRUE)
plotErrors(errF, nominalQ=TRUE)

這裏說明一下,如果用之前我說的github上ubiome裏面的數據的話,可能還要按照具體情況具體分析,應該是已經質控好的,直接加N即可,不過估計切到120再做也可以,就是損失幾個鹼基而已。

4.訓練錯誤率模型?

因爲我是一個樣本,速度還是挺快的,幾乎是秒完成。i3-3120M處理器,比較老啦,湊和還能用兩年。然後做下來結果擬合度對比官方的感覺還挺好。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-kuOzSjc0-1577780207817)(https://github.com/zd200572/mp_kejijizhe/raw/master/blogs/Rplot.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4nxsqL7E-1577780207818)(http://benjjneb.github.io/dada2/tutorial_files/figure-html/plot-errors-1.png)]

官方的,區別不大吧,所以應該是可以用的,直接繼續了。

5.樣本自參考

這應該是把上面建好的模型應用於我們的序列,這一步還是比較快的,也可能我只有一個樣本的原因。作者提示如果windows系統要把multithread設置爲FALSE。

dadaFs <- dada(filtFs, err=errF, multithread=TRUE)
#Sample 1 - 194949 reads in 11507 unique sequences.
dadaRs <- dada(filtRs, err=errR, multithread=TRUE)
#Sample 1 - 194949 reads in 11385 unique sequences.
dadaFs[[1]]
TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGCGAGTTAAGTCAGCGGTAAAAGCCCGGGGCTCAACCCCGGCCCGCCGTTGAAACTGGCTGGCTTG                                                                                        35756 

6.合併雙向reads

這裏就是最最關鍵合併步驟了,justConcatenate=TRUE把序列直接以10個N拼接,亮眼的10個N。

mergers <- mergePairs(dadaFs, filtFs, dadaRs, filtRs, verbose=TRUE, justConcatenate=TRUE)
head(mergers[[1]]) #這裏可以很明顯地看到10個N
$TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGCGAGTTAAGTCAGCGGTAAAAGCCCGGGGCTCAACCCCGGCCCGCCGTTGAAACTGGCTGGCTTG
[1] "TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGCGAGTTAAGTCAGCGGTAAAAGCCCGGGGCTCAACCCCGGCCCGCCGTTGAAACTGGCTGGCTTGNNNNNNNNNNGCAGGCGGAATGCGCGGTGTAGCGGTGAAATGCATAGATATCGCGCAGAACCCCGATTGCGAAGGCAGCCTGCCGGCCCCACACTGACGCTGAGGCACGAAAGCGTGGGTATCGAACAGG"

7.構建序列表

這就是當年的OTU表,現在流行的ASV featuretable了,這裏與之前OTU的區別應該是相似度,現在都是以100%相似度聚類了。

seqtab <- makeSequenceTable(mergers)
dim(seqtab)
[1]   1 500

8.去嵌合

去嵌合步驟中,作者提示如果大部分樣本被除去,或者序列長度不對,要運行一下注釋的那句。

table(nchar(getSequences(seqtab)))
#seqtab2 <- seqtab[,nchar(colnames(seqtab)) %in% 250:256]
seqtab.nochim <- removeBimeraDenovo(seqtab, method="consensus", multithread=TRUE, verbose=TRUE)
head(seqtab.nochim)
#   TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGCGAGTTAAGTCAGCGGTAAAAGCCCGGGGCTCAACCCCGGCCCGCCGTTGAAACTGGCTGGCTTGNNNNNNNNNNGCAGGCGGAATGCGCGGTGTAGCGGTGAAATGCATAGATATCGCGCAGAACCCCGATTGCGAAGGCAGCCTGCCGGCCCCACACTGACGCTGAGGCACGAAAGCGTGGGTATCGAACAGG
#[1,]                                                                                                                                                                                                                                                      35670
sum(seqtab.nochim)/sum(seqtab)
[1] 0.9975397

9.最後的檢查

這裏相當於彙總一下序列從原始到各個步驟,去除了多少條。

getN <- function(x) sum(getUniques(x))
track <- cbind(out, getN(dadaFs), getN(dadaRs), getN(mergers), rowSums(seqtab.nochim))
colnames(track) <- c("input", "filtered", "denoisedF", "denoisedR", "merged", "nonchim")
rownames(track) <- sample.names
head(track)

10.物種註釋

#下載數據庫,第一次運行
#download.file("https://zenodo.org/record/158955/files/gg_13_8_train_set_97.fa.gz?download=1",destfile = 'gg_13_8_train_set_97.fa.gz')
taxa <- assignTaxonomy(seqtab.nochim, "gg_13_8_train_set_97.fa.gz", multithread=TRUE)
#這個步驟不好用,可能是N太多導致不能更好分析到種,應該說對於這種盲目拼接的序列,到屬是最好的選擇,因爲可能存在序列+10N之後拼接起來indel有多個。還可能是greengenes本身這個訓練集不能到種,需要換另外的RDP或者Silva,以後再處理這個問題,而且後面我選擇使用qiime2進行物種註釋,發現這樣結果更好些。
#taxas <- addSpecies(taxa, "/Users/zd200572/Biodata/16S/process-ubiome-16S/primer-cutted/rdp_species_assignment_16.fa.gz")
#Error in .Call2("ACtree2_build", tb, pp_exclude, base_codes, nodebuf_ptr,  : 
#  non base DNA letter found in Trusted Band for pattern 1
taxa.print <- taxa # Removing sequence rownames for display only
rownames(taxa.print) <- NULL
head(taxa.print)[1,]
           Kingdom             Phylum              Class              Order 
     "k__Bacteria" "p__Bacteroidetes"   "c__Bacteroidia" "o__Bacteroidales" 
            Family              Genus            Species 
        "f__S24-7"              "g__"              "s__" 
#雖然這個只註釋到科,還是可以接受的,畢竟v4只有1/8 16S全長序列。

12.導出序列

因爲我R語言水平不咋的,就直接使用劉大哥的代碼了:

#保存導出文件
setwd(path)
seqtable.taxa.plus <- cbind('#seq'=rownames(taxa), t(seqtab.nochim), taxa)
# ASV表格導出
write.table(t(seqtab.nochim), "dada2_counts.txt", sep="\t", quote=F, row.names = T)
# 帶註釋文件的ASV表格導出
write.table(seqtable.taxa.plus , "dada2_counts.taxon.species.txt", sep="\t", quote=F, row.names = F)
# track文件保存
write.table(track , "dada2_track.txt", sep="\t", quote=F, row.names = F)
#————————————————
#版權聲明:本文爲CSDN博主「劉永鑫Adam」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
#原文鏈接:https://blog.csdn.net/woodcorpse/article/details/86773312

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