草庐IT

kraken2 微生物物种分类

BeeBee生信 2023-03-28 原文

kraken 是微生物组分析进行物种分类的工具,目前已经是第二代 kraken2 了。kraken2 对比 kraken 重点优化了数据库创建速度和数据库大小,以及分类速度。

kraken 用 k-mer 方法对输入数据的每一条序列进行分类分析。将每一条序列分成多个 k-mers, 每个 k-mer 在分类数据库寻找 LCA (lowest common ancestor), 序列所有 k-mers 所在的分类及其祖先组成一个分类树————属于总分类树的子集,这个分类树每个节点的权重是序列 k-mers 分配到该分类的次数。分类树上每个 RTL (root-to-leaf) 路径得分是这些权重总分,得分最高的路径是分类路径。然后将该路径分类 left 标签分配给该序列。如果有多个路径得分相等,那么他们的共同祖先标签分配给该序列。
从上面原理可以看出,用 kraken2 分析时提供合适的分类数据库至关重要。比如你期望分类到物种(species)水平,那么 silva 的 16S 数据库是不合适的,因为 silva 数据库本身只分类到属(genus)。如果你提供的分类数据库根本不包含样品主要物种,那么分析肯定是错误的。
完成 kraken2 分析得到每个序列的分类,再用 bracken 对各分类进行丰度估计。


kraken 原理

分类数据库
分类数据库可以用 kraken2-build 命令创建,也可以从 Index zone by BenLangmead 下载现成的。默认下载的包含 50, 75, 100, 150, 200, 250, 300 k-mers 索引。

kraken2 提供现成的数据库下载

kraken2-build 命令创建时需要安装标记低复杂度区域的 dustmasker 工具,如果没有用 --no-masking 取消标记,否则工具会出错。创建标准的数据库直接用 --standard 命令,这将下载 NCBI 分类数据库,包含细菌、古细菌、病毒、人类和一些已知质粒载体。

kraken2-build --standard --threads 12 --no-masking --db ${db_dir}

普通数据库先下载 NCBI 分类数据,然后下载参考序列数据(archaea, bacteria, viral, human, fungi, ...)。这一步可以下载多个数据库到同一目录,最后一起创建成分类数据库。

kraken2-build --download-taxonomy --db ${db_dir}
kraken2-build --no-masking --download-library bacteria --db ${db_dir}
kraken2-build --build --threads 8 --db ${db_dir}

除 NCBI 分类数据库,也可以创建别的,比如 silva 16S 数据库,使用 --special 参数设置对应的 "TYPE". 比如 "silva/greengenes/rdp",这些数据库是 kraken2 下载对应数据库,并处理为 kraken2 可用的格式。

kraken2-build --db $DBNAME --special TYPE

如果不是下载处理好的,需要自己 bracken-build 命令创建 bracken 定量数据库。

bracken-build -d kraken2db -t 12

分类与定量
kraken2 输入是需要分类的序列,可以是 fasta 格式也可以是 fastq 格式。

kraken2 --paired --gzip-compressed --use-names --threads 8 --output ${kraken2_dir}/${sample}.kraken \
--report ${kraken2_dir}/${sample}.kreport --db ${kraken2_db} \
${clean_dir}/${sample}_R1.fq.gz ${clean_dir}/${sample}_R2.fq.gz

设置 --confidence 给每个序列分类增加过滤阈值,根据 From defaults to databases: parameter and database choice dramatically impact the performance of metagenomic taxonomic classification tools 这个参数对结果有比较明显影响。
"confidence" 的得分计算:每个序列的每个分类得分为 其中 是该序列分配到某个 LCA 的 k-mer 数目, 是该序列不包含未知(ambiguous)碱基的 k-mer 数目。以下面第 5 条 LCA 记录为例,#561 是 #562 的父节点,#562 的分数是

#561 的分数是

如果设定的 --confidence 大于 16/21 那么 kraken2 会将序列分类到 #561; 如果大于 20/21 那么序列会是未分类。

kraken2 的输出每条序列分类结果,每一列内容是:

  1. 第一列 "C/U" 分别表示该 reads 是否被分类
  2. 第二列是序列 ID
  3. 第三列是分类 ID, 如果 0 表示未分类,比如:Lactobacillus jensenii (taxid 109790)
  4. 第四列是序列长度,双端测序的话用 "|" 分割,比如:"100|98"
  5. 第五列是序列 kmer 的 LCA 记录,比如 "562:13 561:4 A:31 0:1 562:3" 表示:
    • 前 13 kmer 分类到分类 ID #562
    • 接下去 4 kmer 分类到 #561
    • 接下去 31 kmer 包含 ambiguous 碱基
    • 下一个 kmer 不在分类数据库
    • 最后 3 kmer 分类到 #562
      注意如果是双端测序会出现 |:| 表示一个 reads 的结束和另一个 reads 的开始

用 kraken2 分类结果进行 bracken 定量分析。

bracken -d ${kraken2_db} -i ${kraken2_dir}/${sample}.kreport \
-o ${kraken2_dir}/${sample}.bracken -t 8

分析输出 *.bracken 后缀结果,未分类或低于分类层级的 reads 会被移除,剩下 reads 计算百分比。

name    taxonomy_id     taxonomy_lvl    kraken_assigned_reads   added_reads     new_est_reads   fraction_total_reads
Aureimonas sp. AU20     1349819 S       33      1       34      0.00000
Granulicatella adiacens 46124   S       8       0       8       0.00000
Bacillus velezensis     492670  S       35      23      58      0.00000
Clostridium manihotivorum       2320868 S       8       0       8       0.00000
Candidatus Fonsibacter ubiquis  1925548 S       11      0       11      0.00000

输出 *bracken_species.kreport 文件按分类学从大到小统计序列占比。至此完成了分类与定量,另外说一下 KrakenTools 提供了 kraken 分析相关的小工具,比如提取指定物种的序列。

参考资料
Wood, Derrick E., and Steven L. Salzberg. "Kraken: ultrafast metagenomic sequence classification using exact alignments." Genome biology 15.3 (2014): 1-12.
Home · DerrickWood/kraken2 Wiki · GitHub

有关kraken2 微生物物种分类的更多相关文章

  1. ruby-on-rails - 带有分类器 gem 的无效编码符号 - 2

    当我将项目添加到我的Postgres数据库时,一切似乎都运行良好。在不做任何更改的情况下,只要在我的应用程序中的任何位置启动Madeleine,我的Rails应用程序就会开始失败:EncodingErrorinEventsController#updateinvalidencodingsymbolapp/controllers/events_controller.rb:137:in`update'137是问题行:135defupdate136@event=Event.find(params[:id])137m=SnapshotMadeleine.new("bayes_data")...

  2. ruby - 贝叶斯分类器分数代表什么? - 2

    我正在使用rubyclassifiergem其分类方法返回根据训练模型分类的给定字符串的分数。分数是百分比吗?如果有,最大差值是100分吗? 最佳答案 这是概率的对数。对于大型训练集,实际概率是非常小的数字,因此对数更容易比较。从理论上讲,分数的范围从接近零的无穷小到负无穷大。10**score*100.0会给出实际概率,确实最大相差100。 关于ruby-贝叶斯分类器分数代表什么?,我们在StackOverflow上找到一个类似的问题: https://st

  3. ruby - 在 Ruby 中实现贝叶斯分类器? - 2

    我想实现一个简单的贝叶斯分类系统来对短信进行基本的情感分析。欢迎提供在Ruby中实现的实用建议。也欢迎提出除贝叶斯之外的其他方法的建议。 最佳答案 IlyaGrigorik在BayesianClassifiers上的这篇博文中对这个问题给出了很好的答案。此外,您不妨看看ai4rrubygem用于贝叶斯分类器的一些替代方法。ID3是一个不错的选择,因为它提供了即使对机器学习技术没有任何真正了解的人也能“理解”的决策树。 关于ruby-在Ruby中实现贝叶斯分类器?,我们在StackOver

  4. javascript - 多种分类的 Backbone.js 集合 - 2

    我有一个包含名称和日期的待办事项列表。我希望能够使用标题或日期对列表进行排序。我该怎么做?比较器只允许一种类型的排序。谢谢。 最佳答案 可以在比较器中实现更多逻辑,以便您可以抽象出一些排序逻辑:varCollection=Backbone.Collection.extend({model:myModel,order:'name'comparator:function(model){if(this.order==='name'){returnmodel.get('name');}else{returnmodel.get('date')

  5. javascript - 使用分类 ("active"鼠标悬停时 D3 颜色变化,真) - 2

    我是js和D3的新手。我已经生成了各种热图,并想使用D3的on.mouseover更改图block的颜色。我可以显式更改颜色,但想使用CSS事件规则。可能很容易修复。任何帮助将不胜感激。完整代码如下。谢谢。MJ-HeatmapCountryByDistrict_Port_NmeHeatmapbody{font:10pxsans-serif;}.label{font-weight:bold;}.tile{shape-rendering:crispEdges;}.axispath,.axisline{fill:none;stroke:#000;shape-rendering:crispEd

  6. B44 - 基于stm32蓝牙智能语音识别分类播报垃圾桶 - 2

    文章目录任务效果原理图指令编码语音识别模块简介代码设计驱动舵机模块简介驱动主程序源代码任务题目:基于stm32蓝牙智能语音识别分类播报垃圾桶实现功能如下:语音识别根据使用者发出的指令自动对垃圾进行分类根据垃圾的种类实时播报垃圾的类型根据垃圾种类驱动对应的舵机进行转动(模拟垃圾桶打开,并在十秒钟自动复位,模拟垃圾桶关闭)OLED显示屏实时显示四种垃圾桶的状态蓝牙app可以控制垃圾桶开关,同时显示四种垃圾桶状态效果原理图指令编码语音识别模块简介LU-ASR01是一款低成本、低功耗、体积小、高性能的离线语音识别系统。本系统集成了语音识别、语音回复、IO控制(多信号输出)、串口输出、温湿度广播等功能。

  7. javascript - 分支图、生命之树、分支学、JS 或 Canvas 中的分类法? - 2

    好人——我需要一些帮助来找到创建交互式分支图或系统发育树的方法(是的,我已经阅读了所有相关帖子,但没有找到我要找的东西)。问题是,我需要节点可以命名。一个例子是这样的我发现的大多数脚本要么是applets、flash,要么根本不显示节点分类,即在本例中它会跳过“feliformia”。这对我没用,因为我最终会得到食肉动物-匿名节点-匿名节点-匿名节点-老虎,这并不好。这棵树在理论上将覆盖所有生命,因此它可以变得相当大,并从数据库中获取英文和拉丁文的链接和名称。所以:没有Flash,没有小程序。它必须是水平的,没有super树(圆形)。我经历过这个http://bioinfo.unice

  8. javascript - plotly.js 中的分类轴顺序 - 2

    我有一个plotly.js条形图,我试图让分类轴的顺序正确。每个类别都有一个条形图,但有时它们是绿色的,有时它们是黄色的。条形图应按从高到低的顺序排列,但实际上似乎是根据不同的填充量对它们进行排序。数据:vardata=[{"marker":{"color":"#006666"},"x":["A:0122","A:0121","A:0434","A:0838","A:0083","A:0081","A:0687"],"y":[1246.0,1096.0,1000.0,200.0,0.0,0.0,0.0],"name":"Green","type":"bar"},{"marker":{"

  9. javascript - d3js 平行坐标分类数据 - 2

    我正在寻找一种将分类数据添加到d3js平行坐标的方法。D3js对我来说是新手,我能理解一些正在做的事情,但还没有想出这样做的方法。平行集不是一个好的选择,因为我的大部分数据都是连续的。如果您想到汽车示例,我希望能够按轴上的品牌进行过滤(例如,过滤以便仅显示福特的数据)。我假设需要一个变量来定义每辆车(例如Peugeot、Ford、BMW、Audi等...)这是汽车的例子。http://bl.ocks.org/1341281感谢所有回复的人。 最佳答案 实际上,您只需要一个序数标度!轴将处理其余部分。检查一下here.基本上我改变了:

  10. javascript - 如何让 dojo treeGrid 按两列分类? - 2

    我有一个简单的dojotreeGrid,它仅按第一列分类。但是如何让它也按秒分类/折叠呢?请注意,treeGrid在每个类别中都显示了总计。另外,有没有办法将总计移动到类别级别而不是底部?varlayout=[{cells:[[{field:"year",name:"Year"},{field:"childItems",children:[{field:"unid",name:"unid",hidden:true},{field:"geography",name:"Geography"},{field:"country",name:"Coungtry"},{field:"status"

随机推荐