介绍反污染R包.欢迎用户支持,功能请求,评论和建议消除污染问题跟踪器.的预印本介绍decontam包括性能基准测试,并演示decontam
-对数据进行更准确的微生物群落分析。
环境微生物群落和微生物组的研究已经被最近广泛采用的免培养高通量测序方法所改变。在扩增子测序中,从感兴趣的群体提取的DNA中扩增出特定的遗传位点,然后在下一代测序平台上测序。在鸟枪宏基因组学中,从感兴趣的群体中提取大块DNA并进行测序。这两种技术都提供了低成本和免培养的微生物群落特征。
然而,这些方法的准确性在实践中受到了限制,因为引入了样本群落中并不真正存在的污染DNA。这种污染DNA可能来自多种来源,如测序反应中使用的试剂,并可能严重干扰下游分析,特别是在低生物量环境中。的decontam
包提供了简单的统计方法来识别和可视化污染DNA特征,允许它们被删除,并从标记基因和宏基因组数据中构建更准确的样本群落图像。
第一个decontam
Ingredient是一个从原始数据中衍生出来的特征表,即每个样本(行)中序列特征(列)的相对丰度表。这些“序列特征”可以是各种各样的特征类型中的任何一种,包括扩增子序列变体(ASVs)、操作分类单位(OTUs)、分类组或系统类型(例如属)、同源基因或宏基因组组装基因组(MAGs)——任何从标记基因或宏基因组数据中获得数量丰度的东西。
第二个decontam
Ingredient是两种元数据类型之一:
DNA定量数据,记录每个样品中DNA的浓度。大多数情况下,这是在将样品混合成等摩尔比例进行测序之前(以及在扩增子测序后)测量荧光强度的形式收集的,但有时它是通过qPCR或其他提取DNA的方法收集的。
一组明确的“阴性对照”样本,其中对空白进行测序,不添加任何生物样本。提取对照是首选,在扩增子测序中阴性对照也应通过PCR步骤进行,因为工作流程中的每一步都有可能引入新的污染物。
最后,这些数据需要导入到r中。特征表应该作为一个按特征的样本导入矩阵
和样例元数据作为向量
长度是样本的个数。或者,您可以使用phyloseq
包来导入数据phyloseq
对象。
的decontam
package使用标准R . xml格式的特性表矩阵
,但它更容易使用phyloseq
对象从的phyloseq
包,旨在简化标记基因和宏基因组数据集的分析。
在这个入门教程中,我们将从阅读phyloseq
工作对象:
图书馆(phyloseq);packageVersion(“phyloseq”)
## [1] '1.41.0'
图书馆(ggplot2);packageVersion(“ggplot2”)
## [1] '3.3.5'
图书馆(decontam);packageVersion(“decontam”)
## [1] '1.17.0'
ps <- readRDS(system。文件(“extdata”、“MUClite。Rds ", package="decontam")) ps
## phyloseq-class实验级对象## otu_table() OTU表:[1951类群和569个样本]## sample_data()样本数据:[569个样本由6个样本变量]## tax_table()分类表:[1951类群由6个分类等级]
这个phyloseq对象有一个1951扩增子序列变体(ASVs)的表,由DADA2算法来自16S rRNA基因V4区扩增子测序数据。phyloseq对象还包括使用所需的样例元数据信息decontam
.
头(sample_data (ps))
3 1101舌2829 ## P1101C01702R00 P1101C01702R00 P1101C01702R00 3 1101舌1227 ## P1101C08701R00 P1101C08701R00 P1101C08702R00 3 1101舌1227 ## P1101C08702R00 P1101C08702R00 3 1101舌1227 ## P1101C08702R00 P1101C08703R00 P1101C08703R00 3 1101 Cheek_Left 5872 ## sample_or00 True Sample ## P1101C01702R00 True Sample ## P1101C01703R00 True Sample ## #P1101C08701R00真样品## P1101C08702R00真样品## P1101C08703R00真样品##
关键的样本变量是quant_reading
,是由荧光强度测量的每个样品中的DNA浓度,以及Sample_or_Control
它告诉我们哪些样本是阴性对照。
让我们先快速看一下每个样本中的库大小(即读取数),作为该样本是真阳性样本还是阴性对照的函数:
df <- as.data.frame(sample_data(ps)) #将sample_data放入ggplot-friendly data.frame df$LibrarySize <- sample_sum (ps) df <- df[order(df$LibrarySize),] df$Index <- seq(nrow(df)) ggplot(data=df, aes(x=Index, y=LibrarySize, color=Sample_or_Control)) + geom_point()
阳性样本库的阅读量主要在15,000到40,000之间,但也有一些阅读量较低的异常值。阴性对照样本的读数比预期的要少。注意:现在重要的是保留低读数样品,因为我们想使用这些阴性对照来帮助识别污染物!
我们将使用的第一种污染物识别方法是“频率”法。在这种方法中,每个序列特征的频率分布作为输入DNA浓度的函数被用于识别污染物。
在phyloseq对象中,“quant_reading”
保存浓度信息的样本变量:
- is污染物(ps, method="frequency", conc="quant_reading")
##频率prev p.freq p.prev p污染物## Seq1 0.323002694 549 1.000000e+00 NA 1.000000e+00 FALSE ## Seq2 0.098667396 538 1.000000e+00 NA 1.000000e+00 FALSE ## Seq3 0.003551358 160 1.135975e-18 NA 1.135975e-18 TRUE ## Seq4 0.067588419 519 9.999998e-01 NA 9.999998e-01 FALSE ## Seq5 0.045174743 354 1.000000e+00 NA 1.000000e+00 FALSE ## Seq6 0.040417101 538 1.000000e+00 NA 1.000000e+00 FALSE
这个计算返回了adata.frame
有几个列,最重要的是$ p
其中包含用于污染物分类的概率,以及美元的污染物
它包含真正的
/假
分类值为真正的
表明相关序列特征是污染物的统计证据超过了用户可设置的阈值。由于我们没有指定阈值,所以默认值为阈值= 0.1
被使用过,而且污染物美元= TRUE
如果$p < 0.1
.
表(contamdf.freq污染物美元)
## ##假的真## 1893 58
头((contamdf.freq污染物美元))
## [1] 3 30 53 80 152 175
1901个ASV中只有58个被归类为污染物,但这包括一些非常丰富的序列,包括第三个(!)最丰富的ASV。
让我们来看看一个清晰的非污染物(第一个ASV)和一个清晰的污染物(第三个ASV)是什么样子的:
plot_frequency(ps, taxa_names(ps)[c(1,3)], conc="quant_reading") + xlab("DNA浓度(PicoGreen荧光强度)")
在该图中,黑线虚线显示了非污染序列特征的模型,其频率预计与输入DNA浓度无关。红线显示了污染序列特征的模型,其频率预计与输入DNA浓度成反比,因为在总DNA很少的样本中,受污染的DNA将占总DNA的更大比例。显然,Seq3非常符合红色污染物模型,而Seq1则不是。
让我们检查更多被归类为污染物的asv,以确保它们看起来像我们预期的那样:
set.seed(100) plot_frequency(ps, taxa_names(ps)[sample(which(polludf .freq$ polluq),3)], conc="quant_reading") + xlab("DNA浓度(PicoGreen荧光强度)"))
这些看起来都像污染物!
现在我们已经确定了可能的污染物,让我们从phyloseq对象中删除它们:
ps
## phyloseq-class实验级对象## otu_table() OTU表:[1951类群和569个样本]## sample_data()样本数据:[569个样本由6个样本变量]## tax_table()分类表:[1951类群由6个分类等级]
ps.noncontam <- prune_taxa(! pollution .freq$污染物,ps) ps.noncontam
## phyloseq-class实验级对象## otu_table() OTU表:[1893类群和569个样本]## sample_data()样本数据:[569个样本由6个样本变量]## tax_table()分类学表:[1893类群由6个分类等级]
现在我们开始分析污染物过滤后的数据!
看到phyloseq网站用于通过phyloseq R包提供的许多强大分析的文档。
我们将使用的第二种污染物识别方法是“流行度”方法。在这种方法中,将真阳性样品中每个序列特征的流行度(在样品中存在/不存在)与阴性对照中的流行度进行比较,以识别污染物。
在phyloseq对象中,“Sample_or_Control”
保存负控件信息的示例变量。我们将把该数据总结为一个逻辑变量,使用真正的
对于对照样品,因为这是所要求的形式isContaminant
.
sample_data (ps)是美元。neg <- sample_data(ps)$Sample_or_Control == "Control Sample"prev <- is污染物(ps, method="盛行率",neg="is.neg") table(污染.prev$污染物)
## ##假真## 1827 124
头((contamdf.prev污染物美元))
## [1] 30 80 152 175 176 193
在这个数据集中,基于流行度的污染物识别识别出了更多数量的污染物(124个),而基于频率的方法(58个),但也遗漏了非常清晰和高度丰富的污染物Seq3
,因为Seq3
在几乎所有的样本中都有-阴性和阳性。
请注意,与前面一样,污染物的默认阈值是它在正在执行的统计测试中达到0.1的概率。在流行度测试中有一个特殊的值值得了解,阈值= 0.5
,它将所有在阴性对照中比阳性样本中更普遍的序列识别为污染物。让我们尝试使用这个更激进的分类阈值,而不是默认的。
contamdf。prev05 <- is污染物(ps, method="患病率",neg="是。阴性”,阈值=0.5)表(污染f.prev05$污染)
## ##假真## 1809 142
让我们来看看这些分类群在阴性对照和阳性样本中被观察到的次数。
#使phyloseq对象的存在-缺席在阴性对照和真样本ps.pa <- transform_sample_counts(ps, function(abund) 1*(abund>0)) ps.pa.neg <- prune_samples(sample_data(ps.pa)$Sample_or_Control ==“控制样本”,ps.pa) ps.pa.pos <- prune_samples(sample_data(ps.pa)$Sample_or_Control ==“真样本”,ps.pa) #使数据的患病率在阳性和阴性样本的框架df. pa。Pa <- data.frame(Pa .pos=taxa_sum (ps.pa.pos), Pa .neg=taxa_sum (ps.pa.neg),污染物=污染物.prev$污染物)ggplot(data=df. prev$污染物)pa, aes (x = pa。底片,y =。pos, color=污染物))+ geom_point() + xlab("患病率(阴性对照)")+ ylab("患病率(真实样本)"))
分类单元似乎非常清晰地分裂成一个分支,主要出现在阳性样本中,另一个主要出现在阴性对照中,而污染物分配(默认概率阈值)很好地识别了那些主要出现在阴性对照中的分支。
实现的两个基本方法是频率
而且患病率
方法,但是还有许多其他方法可以利用这些方法。的结合
,最低
而且独立的
模式都使用频率
而且患病率
方法来识别污染物,但结合两种方法的结果以不同的方式(见isContaminant ?
以获取更多信息)。还有一个批处理
允许在不同批次(例如测序运行或不同研究)中独立识别污染物的功能,这些污染物预计具有不同的污染物概况。
我们都知道污染物在标记基因和宏基因组数据中是一个问题。现在,通过对阴性对照进行测序来解决污染问题,然后什么都不做是普遍的做法,这在很大程度上是因为还没有容易使用的工具来识别这类数据中的污染物。这就是decontam
包裹进来了。decontam
提供了一个简单的界面,可以接收您的序列特征表(asv, OTUs, MAGs,属等),并根据已演示过的污染特征将每个序列特征分类为污染物许多以前的研究.
去除污染物使标记基因和宏基因组测序提供的特征更准确.它可以防止探索性分析中的假阳性。它减少了不同研究和测序运行之间的批量效应。它通过减少花在污染物测序特征上的额外假设来提高统计能力。
清除污染物可以使数据更好,这总是值得做的。