尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
LEfSe分析全攻略:从原理到实操的微生物组差异筛选指南
做微生物多样性测序做得久了你会发现一个很有意思的现象16S扩增子或者宏基因组项目做完OTU/ASV表和物种注释一到手大家最想解决的问题其实就一个——到底哪些菌在组间有差异而且这个差异靠不靠谱。过去十多年里LEfSeLinear discriminant analysis Effect Size线性判别分析效应大小几乎成了这个问题的标配答案。不管你是跑细菌16S、真菌ITS还是做宏基因组功能通路最后文章里都少不了一张LDA条形图或者一把进化分支图。这篇博文不打算重复官方文档而是从原理、输入格式、实操命令、结果解读到避坑技巧系统地把LEfSe这个工具讲明白。新手可以照着一步步跑通老手也可以对照着查漏补缺。1. LEfSe的定位测序项目里为什么绕不开它1.1 传统差异分析工具的局限性拿到一张OTU/ASV丰度表很多人的第一反应是直接做差异分析每个物种在两组间的丰度做t检验或者Wilcoxon秩和检验p值小于0.05就算差异物种。这个操作门槛很低Excel里都能做但它有几个非常明显的问题。第一只关注显著性不关注效应大小。一个物种在A组平均丰度是0.001在B组是0.0001足足差了十倍但p值可能只有0.01换个场景另一个物种从0.5变成0.6只涨了20%p值反而可能小于0.001。如果只看p值后者会进入差异列表前者反而可能被忽略。但在真实的肠道菌群或者土壤菌群场景里十倍的变化往往意味着生态位发生了实质改变20%的变化可能只是批次波动。显著性和效应量是两个完全不同的维度只取一个很容易误判。第二多重比较问题太严重。一张OTU表动辄几千行每个特征都做一次检验哪怕真实的零假设全部成立也会因为随机性产生大量假阳性。虽然可以用FDR或者Bonferroni校正但在几千个特征的大数据集上校正之后经常什么都剩不下来完全失去探索性分析的意义。第三方法本身不考虑微生物数据的层级结构。微生物数据天然带有门、纲、目、科、属、种这种分类层级很多差异其实是某个门整体偏移往下细化到某个属才最明显。传统点对点检验看不出这种层级富集模式更谈不上利用它来增强统计功效。LEfSe恰恰是在这三点上做了针对性设计才成为大家手里的常用工具。1.2 LEfSe的差异化思路显著性之外还看效应量LEfSe的全称已经把它的核心思想写在名字里了Effect Size效应量才是重点。它的流程可以理解成一个漏斗先用非参数检验筛出有显著差异的候选类群再用配对检验排除掉不稳定的假阳性最后用线性判别分析计算每个候选类群的LDA得分用这个得分来量化效应大小。那效应大小到底怎么理解我举个例子。你想判断一个人打篮球是专业还是业余单独看身高、跑速、投篮命中率都不够精准但如果你把身高、臂展、弹跳、命中率组合成一个综合指标专业和业余在这个指标上的差距就会非常明显。LDA做的就是这件事它找到一组特征的线性组合使得两组样本在这个组合上的投影尽可能分开。对微生物数据来说如果有一百个候选物种LDA会把这一百个物种当作一百个维度寻找一个判别方向让对照组和处理组样本在这个方向上的投影差异最大。每个物种对这个方向的贡献大小就是LDA score。贡献越大越有可能是真正能把两组分开的biomarker。1.3 适用场景与边界LEfSe最常见的应用场景包括16S/ITS扩增子测序后的组间差异菌群筛选、宏基因组物种或功能丰度差异分析、代谢通路标志物挖掘以及配合PICRUSt等功能预测结果做通路层面的差异比较。在这些场景里LEfSe的输出可以直接用于文章结果和补充材料。但它的边界也很清楚。首先LEfSe适合分组明确的比较设计不适合处理连续变量比如想分析BMI或环境pH与菌群丰度的相关性应该用Spearman相关等连续变量分析方法而不是LEfSe。其次它对样本量有底线要求每组少于3个样本时统计功效极低结果基本不可信。最后LEfSe是一个分类判别工具它回答的是哪些物种能把组别区分开而不是哪些物种是因果关系中的原因变量。写文章讨论部分时千万别把LEfSe的结果直接说成因果证据审稿人会抓着这一点不放。2. LEfSe核心原理拆解三步筛选为什么靠谱2.1 第一步Kruskal-Wallis秩和检验找候选LEfSe的第一步是用Kruskal-Wallis检验在所有组之间遍历每个特征看该特征在至少一个组中的分布是否与其他组存在显著差异。Kruskal-Wallis检验是非参数方法这也是它适合微生物数据的原因。微生物丰度数据几乎永远不符合正态分布大量物种是零膨胀的有的样本测到的丰度是0有的样本是几百分布是严重右偏的。t检验或ANOVA这类参数方法对分布假设要求很严直接套用很容易出错。Kruskal-Wallis检验不要求数据服从正态分布它在排序后的秩上进行检验对偏态数据和异常值都有很强的稳健性。比如土壤样本里某个菌属通常只有几百条序列个别样本因为局部富集测到了几万条这种异常值在秩检验中的影响会被压制而在参数检验里可能会直接把均值拉垮。这一步相当于一次粗筛目的是把至少在某个组里看起来不一样的类群捞出来。默认alpha阈值是0.05实际使用中我一般不会把这一步的阈值设得更严因为它筛得太狠会把后续步骤的候选数量砍得太少宁可让它多捞一点后面精筛会兜住。2.2 第二步Wilcoxon秩和检验做两两确认当分组数大于两组时Kruskal-Wallis检验只能告诉你有差异无法指出具体是哪个组和哪个组之间有差异。LEfSe的第二步会在这一步对筛选出的特征进行两两比较使用Wilcoxon秩和检验。这里有一个很多教程都没讲透的细节LEfSe默认采用one-against-all策略也就是在当前组和其余所有样本合并成的组之间做Wilcoxon检验而不是做所有组间组合的穷举配对。这样做的好处很明显如果实验有6个组穷举配对要做15次比较组间组合爆炸不说每次比较的样本量也被切得很小而one-against-all只做6次比较每次都充分利用全部样本统计功效更高。对于多个亚类Subclass的情况这一步还会利用亚类信息进行配对检验把个体差异、部位差异等混杂因素控制住。当有同一个体的多个时间点或同一个病人的多个部位这样的重复测量设计时正确设置Subclass能显著减少个体差异对结果的干扰。2.3 第三步LDA计算效应大小并排序前两步筛出来的是有统计差异的候选者第三步决定它们差异有多大以及归属于哪个组。LEfSe将样本映射到线性判别分析的判别轴上计算每个特征在判别轴上的载荷系数这个载荷的绝对值经过对数转换后就是LDA score。默认阈值是2.0LDA score大于等于2的特征才会被认定为显著的biomarker。那LDA的判别轴是怎么来的它是找到一个方向让两组样本的均值在这个方向上的差距尽量大同时让组内方差尽量小。转换成人的话说就是组间差异要大、组内重复要稳这两个目标同时被优化。所以LDA score高的特征不一定绝对丰度最高但一定是在组间差异大且组内重复稳定的特征。一个只在某个组稳定存在的低丰度物种完全可能拿到比高丰度物种更高的LDA score因为它对组别的区分能力更强。这也是LEfSe和单纯看丰度差或log2FC的根本区别。2.4 为什么这套流程经久不衰把这套三步机制放在一起看LEfSe实际上完成了一个三重过滤Kruskal-Wallis检验解决显著性Wilcoxon配对检验增强稳健性LDA量化效应量并排序。每一步都在降低噪音最终从几千个特征里筛出少而精的biomarker集合。相比那些只看p值的方法这套机制在生物学重复不充分、数据高度稀疏的微生物组数据中要实用得多。当然LEfSe在理论上一直被统计学家挑毛病比如LDA本身假设特征服从多元正态分布、各组协方差矩阵相同这在微生物数据里几乎不可能严格成立。但Segata团队当年的实验表明即使在这些假设明显偏离的真实数据上LEfSe的排序结果和富集模式依然稳定。学术界可以争论假设是否完美实际项目中大家还是愿意拿它来筛选候选biomarker这就是它能在生信圈里活跃十几年的原因。用的时候心里有数它是实用的工具不是完美的真理。3. 跑LEfSe的三条路线Galaxy、命令行还是R3.1 Galaxy在线平台零基础的最优解LEfSe上手最简单的方式是Galaxy网页平台。Huttenhower实验室维护了集成了LEfSe全套工具的Galaxy服务从格式转换、LEfSe计算到三种可视化LDA条形图、cladogram图、特征丰度图都有现成的模块全程拖拽即可完成不需要写任何代码。这个路线特别适合生信基础薄弱但需要快速出图的人比如临床科室的科研助理、植物病理方向的研究生。它的缺点是公共服务器在高峰期可能排队而且数据是上传到外部服务器处理的涉及未发表课题或者敏感样本数据时需要先评估一下数据合规性问题。我的建议是探索性分析和测试数据可以放Galaxy上跑正式项目的关键分析尽量用本地环境。3.2 本地命令行可重复性最高的生产方式对要跑正式项目和批量处理的人来说本地命令行是更可靠的选择。LEfSe本质是Python实现的工具集合用conda安装非常简单conda create -n lefse -c bioconda -c conda-forge lefse conda activate lefse装完后常用的命令有四个lefse-format_input.py做输入格式转换run_lefse.py跑核心计算plot_res.py画LDA条形图plot_cladogram.py画进化分支图。每一步的中间文件都留在本地可以追溯、可以重新调参也可以写进snakemake或nextflow流程里做自动化批量分析。对于发表文章来说命令行方式最大的好处是复现性强把环境、输入文件和参数记录下来任何人拿同样的文件都能跑出一样的结果这在回应审稿人时特别有用。3.3 R语言替代方案项目全是R代码怎么办如果你整个分析流程都用R做的用的是phyloseq、microeco或者qiime2R这类工具不想为了一个LEfSe切换到Python那也有替代方案。CRAN上有lefser包Bioconductor生态里也有相关实现microeco包内置了cal_lefse功能用法和原版很接近。需要注意第三方R实现和原始Python版在算法细节上是存在差异的主要差异通常集中在LDA计算时对数据的预处理和矩阵分解方式上。我在实际对比中发现绝大多数情况下两者的biomarker筛选结果基本一致但LDA score的具体数值可能有小幅度出入。如果项目对分析标准要求严格或者需要和之前发表的结果保持一致性建议最终以原始Python版结果为准R版可以作为快速预览工具来用。4. 输入数据准备90%的错误出在这一步4.1 LEfSe输入格式到底长什么样LEfSe的输入文件是tab分隔的文本文件最常见的形态是一个分组信息特征丰度的单表。我直接给一个最小可运行的示例Sample1 Sample2 Sample3 Sample4 Sample5 Sample6 #Class Ctrl Ctrl Ctrl Treat Treat Treat #Subclass Day0 Day7 Day14 Day0 Day7 Day14 g__Bacteroides 0.23 0.31 0.28 0.15 0.09 0.11 g__Prevotella 0.18 0.22 0.19 0.42 0.55 0.51 g__Lactobacillus 0.05 0.03 0.04 0.11 0.14 0.12 s__Bifidobacterium_adolescentis 0.01 0.02 0.01 0.04 0.03 0.05这个文件的关键点在于第一行第一列是空的、从第二列开始是样本ID第二行以#Class开头、后面是每个样本的分组标签这一行是必填的第三行以#Subclass开头、后面是每个样本的亚类标签这一行是选填的从第四行开始每行第一列是特征名后面是各样本中的丰度或计数。Class行决定组间差异怎么比较Subclass行用来控制配对因素比如重复测量、个体配对等。如果只有两组独立样本第三行可以不要。4.2 从OTU/ASV表整理成LEfSe输入实际操作中最容易卡壳的地方是把Qiime2或DADA2出来的OTU/ASV表和物种注释整理成LEfSe需要的格式。Qiime2导出的是BIOM格式或者TSV的OTU表样本在列、OTU在行但缺少物种注释列更缺少#Class开头的分组信息。我惯用的套路是这样先在R里读入OTU表和物种注释表按分类层级比如属水平把OTU聚合起来然后把样本放在列、物种放在行导出为tab分隔的txt最后再用脚本在文件顶部插入#Class行和#Subclass行。以下是聚合的示意代码library(phyloseq) ps - readRDS(ps_rarefy.rds) # 自己项目里的phyloseq对象 ps_genus - tax_glom(ps, taxrank Genus) otu - as.data.frame(otu_table(ps_genus)) tax - as.data.frame(tax_table(ps_genus)) tax$full - apply(tax, 1, function(x) paste( paste0(p__, x[Phylum]), paste0(c__, x[Class]), paste0(o__, x[Order]), paste0(f__, x[Family]), paste0(g__, x[Genus]), sep | )) rownames(otu) - tax$full write.table(otu, lefse_input_raw.txt, sep \t, quote FALSE)写完后不要直接在Excel里粘贴编辑Excel有时会偷偷改掉制表符或者把长的数字ID变成科学计数法一个不留神输入文件就坏了。我在真实项目里吃过这个亏后来一律坚持用脚本生成和修改输入文件手动编辑只做检查。4.3 数据清洗、归一化与分类层级LEfSe本身不做归一化输入相对丰度或原始计数都能跑但我建议统一用相对丰度。因为样本测序深度不一致时原始计数的可比性太差一个测序深度是别人两倍的样本所有物种的计数都被放大了会直接影响LDA的计算结果。相对丰度天然把测序深度差异抹平了。同时推荐做一步低丰度过滤在少于10%的样本中出现、最大相对丰度低于0.01%的类群可以先去掉。这一步非常重要不然那些在绝大多数样本里都是0、只在个别样本里蹦出来的特征会给LDA计算带来大量噪音还会让cladogram图变得稠密难读到了结果图阶段你会后悔当初没过滤。分类层级的问题要重点注意。如果特征名是g__Bacteroides这种带标准分类前缀的格式LEfSe能正确解析前缀并画出包含层级关系的cladogram。如果特征名是纯OTU编号或者只写了BacteroidesLEfSe会把它当成一个孤立的节点无法构建从门到属的层次结构最终只能画LDA条形图画不出进化分支图。所以想让结果图足够漂亮、信息量足够大输入的特征名必须带完整的分类学注释理想格式是p__Firmicutes|c__Clostridia|o__Clostridiales|f__Lachnospiraceae|g__Roseburia|s__Roseburia_inulinivorans4.4 分组设计要注意的事Class的分组数不要太多。如果实验设计有7到8个组LEfSe会用one-against-all策略做很多次配对检验结果图和输出表会非常拥挤核心信息完全被淹没。一般建议差异分析时先锁定主要关心的2到4个组别做LEfSe剩下的小组或者次要组合并处理或者等主要结果出来后再单独做次级对比。每组样本量也是一个重要约束。最理想的状况是每组不少于5个生物学重复至少也要3个起步。如果低于3个第二步Wilcoxon检验的统计功效非常有限筛出来的biomarker换个批次可能就消失了复现性极差。组间样本量严重不均衡比如一组10个另一组2个时也要小心LEfSe对不均衡设计比较敏感建议先用别的图表看看分组自然分离情况再决定是否跑LEfSe。5. 完整实操从命令行跑通一个LEfSe实例5.1 准备样例输入文件我准备了一个最小的两组比较数据按上面说的格式存为lefse_input_example.txt包含4个特征、6个样本分属Ctrl和Treat两组。真实分析中特征数通常是几百到几千样本数从十几个到上百个不等但格式是同一套。在实际项目里我强烈建议在跑LEfSe之前先对样本做一个PCoA或者PCA看一下分组分离情况。如果你们的处理组和对照组在主坐标空间里完全重叠那LEfSe大概率筛不出可靠结果不如先回到实验设计或者数据质控环节找问题。这一步虽然不在LEfSe的使用流程里但能帮你避免在不可能有结果的数据上浪费时间。5.2 用format_input.py规范化数据LEfSe的第一道工序是把上面的原始输入转换成内部的格式化文件命令是lefse-format_input.py lefse_input_example.txt formatted_input.txt -c 2 -s 3 -u 1这里参数的含义-c 2Class信息在第2行也就是#Class所在的行号-s 3Subclass信息在第3行如果没有子类可以不传这个参数-u 1把值小于1的特征视为缺失这个阈值的作用是让全为零或极低丰度的特征在后续计算中获得一个合理的权重1是我常用的经验值命令执行成功后formatted_input.txt就是LEfSe的标准输入了。这一步很关键很多人在Galaxy上跑不出结果最后排查下来都是Class行号或者Subclass行号没对应上。如果输入文件里没有Subclass行那么-s参数千万别加加了反而会报错。5.3 运行LEfSe并设置LDA阈值核心计算就一条命令run_lefse.py formatted_input.txt lefse_results.txt -a 0.05 -w 0.05 -l 2.0参数说明-a 0.05Kruskal-Wallis检验的alpha阈值默认0.05-w 0.05Wilcoxon检验的alpha阈值默认0.05-l 2.0LDA score的最小阈值默认2.0筛选出的biomarker必须LDA log score不小于这个值这三个参数就是LEfSe的全部核心调控开关。关于-l的选择我给一个经验分层场景LDA阈值说明探索性分析样本量大1.5扩大候选池适合后续综合筛选常规文章筛选2.0默认值大多数项目适用结果太多需要聚焦3.0-3.5只保留判别能力最强的biomarker需要留意的是阈值最好在分析方案里提前定好不要在结果出来之后反复改参数挑最好看的图审稿人对这种操作非常敏感。5.4 可视化LDA条形图和进化分支图跑完核心计算之后可视化是重头戏plot_res.py lefse_results.txt lda_bar.png -d 300 plot_cladogram.py lefse_results.txt cladogram.png -d 300 plot_features.py lefse_input_example.txt formatted_input.txt abundant_biomarkers.png --feature_name allplot_res.py输出的是LDA score横向条形图plot_cladogram.py输出的是从门到属的进化分支图plot_features.py则把所有biomarker在各组的丰度分布箱线图拼到一张图里。-d 300是设置DPI投稿一般需要300。不管是在本地跑还是在Galaxy里跑我建议在项目目录里保留脚本和参数记录文件把LEfSe的版本号、conda环境的依赖列表都保存下来。几个月之后当你需要回复审稿意见或者被要求提供分析细节时这些记录能帮你省下大量翻聊天记录的时间。5.5 单独看某个biomarker的丰度分布在实际分析中LDA条形图只能告诉你哪些物种是marker但看不出具体的丰度分布模式。这时候plot_features.py就派上用场了它可以指定单个特征名输出该特征在各组的箱线图plot_features.py lefse_input_example.txt formatted_input.txt feature_g__Bacteroides.png --feature_name g__Bacteroides箱线图能一眼看出这个物种是普遍上调还是只在少数异常样本里高。写文章结果部分的时候这种单特征的丰度分布图非常实用经常被用作biomarker验证的补充材料。6. 结果怎么读LDA条形图、进化分支图和输出表6.1 LDA条形图一眼看出谁最能打LDA条形图是文章里最常出现的LEfSe输出。横轴是对数化的LDA score纵轴是特征名条形颜色代表该特征富集在哪个组里。柱子越长说明该特征对区分两组的贡献越大。看图时先盯最长的几条柱子基本上就是你要重点讨论的biomarker候选。要特别强调一个容易写错的地方LDA score不等于丰度。一个绝对丰度很低、但在某一组稳定存在的物种完全可以拿到很高的LDA score因为它能稳定地区分组别。写文章时描述应该是该物种在两组间具有较高的判别贡献而不是该物种丰度显著较高。判别贡献和丰度高低是两码事用错了会被懂行的人挑出来。6.2 进化分支图cladogram从门到属看清富集层级cladogram是LEfSe最具辨识度的图也是很多人做汇报时最喜欢放的一张。它把差异类群映射到物种分类树里圆心到外圈依次代表门、纲、目、科、属等层级节点大小代表相对丰度颜色代表富集组别黄色节点表示未达到阈值的类群。读图的时候从里圈往外圈看如果某个门的节点大面积被染成某个组的颜色说明这个门的整体丰度在两组间偏移继续往外圈推到具体属的节点就能定位到具体的差异marker。这种从宏观到微观的视觉层次是LDA条形图给不了的。前面已经提过一次这里再强调一遍因为这是cladogram最常见的翻车点输入特征名必须带标准的p__、c__、o__、f__、g__、s__前缀并且用竖线分隔LEfSe才能正确解析层级关系。如果只有孤立的属名cladogram会变成一个可怜的一个点什么层级结构都画不出来。6.3 结果表怎么整理成论文可用的形式lefse_results.txt是tab分隔的文本文件每一行是一个通过阈值的biomarker主要列包括特征名、LogMaxMean、富集组别、LDA score和p值。LogMaxMean指的是各组最大平均丰度的对数值可以理解为该特征在整个数据里的丰度水平参照。但原文件的列名比较生直接放进论文不合适。我通常先在R里读入重命名列名按LDA score降序排列再合并每个特征在各组的平均丰度、差异倍数等信息生成一张规范的biomarker筛选结果表放到补充材料里。写文章的时候主文表里只放最核心的十几个biomarker其余放补充材料这样既清晰又完整。7. 常见问题速查与避坑经验7.1 常见报错问题对照表我在用LEfSe这几年见过的问题基本可以汇总成一张表现象可能原因解决办法输入文件读取失败分隔符不是tab确保是制表符分隔不要用CSV编码乱码或报错文件是ANSI编码且含中文转成UTF-8最好不用中文Class行对不上-c参数行号错误检查#Class在文件中的实际行号结果为空或很少组间整体差异不显著先做PCoA看分组分离检查样本标签画不出cladogram特征名缺分类前缀补全p__、c__等标准前缀出现的marker太多LDA阈值太低把-l提高到2.5或3.0报零方差错误大量特征全为0做低丰度过滤后再跑结果无法复现版本或环境不一致记录conda环境版本和种子7.2 结果全空或太少怎么处理当LEfSe筛不出任何结果时先不要急着调低阈值。我建议按这个顺序排查第一步确认分组标签没有贴反或者贴错这是最常见的人为错误第二步用PCoA或者主成分分析看样本在组间是否自然分离如果完全混在一起再调LEfSe参数也没有意义第三步检查样本量每组只有2到3个样本时统计检验功效太低筛不出来才是正常的第四步检查归一化方式如果用的是原始计数且测序深度差异很大结果可能完全被深度差异主导。如果以上都排查完了还是空那可能就是数据本身的问题比如处理效应很弱、只有少数几个物种发生微小变化。这种情况下把LDA阈值降到1.5也许能捞到几个候选但写文章时要说明清楚否则这个结果的可靠性会被质疑。7.3 零值太多、数据太稀疏怎么办微生物数据天生就是零膨胀的但零值太多会让LEfSe的计算效率和稳定性都下降。我的习惯是先做特征过滤把那些在绝大多数样本中都不出现的特征直接删掉。具体操作上可以要求特征至少在20%的样本中出现或者最大相对丰度不低于某个阈值比如0.01%。这样既保留了解释性强的物种又大幅减少了计算噪音。如果过滤之后还是很多零可以考虑对丰度值做log变换或者使用其他专门处理零膨胀数据的策略但要明白这些变换会影响LDA得分的解释最好在方法部分写清楚。LEfSe官方没有强制要求log变换我在大多数项目里直接用相对丰度跑结果都正常。7.4 多组和亚类的实战策略分组数较多时我建议做前先想清楚实验的核心问题是什么。如果核心是疾病组与健康组那就专门用这两组跑LEfSe不要把所有中间状态都塞进去。如果核心是多个处理时间点那就需要设置好Subclass来配对个体的效应这样跑出来的biomarker会稳健很多。Subclass的正确使用是一个容易被低估的优势。有重复测量设计的项目比如同一个患者治疗前、治疗中、治疗后三个时间点的粪便样本这种数据如果不设置Subclass同一个体的三个时间点会被当作三个独立样本个体差异会淹没处理效应。正确设置Subclass后LEfSe在Wilcoxon检验阶段会按照个体进行配对比较结果会更可靠。这一步用好能明显提升结果的生物学意义。7.5 如何构建可复现的LEfSe分析环境最后分享一个我踩过坑之后养成的习惯所有LEfSe分析都做成可复现的流程。具体来说就是记录conda环境的完整包列表、LEfSe的具体版本号、每次都保留输入文件的MD5值、把所有命令行参数写进一个shell脚本里。表面上看这些都是额外工作但当你几个月后需要回复审稿意见、或者换台机器重新跑结果时你会发现这些记录比什么都值钱。科学研究的底线是可复现这不是为了别人是为了几个月后不给自己挖坑。个人体会是LEfSe跑通不难真正难的是在它之上建立自己的判断。它给出的biomarker列表永远是统计候选能不能写进文章的结论里还要结合丰度分布、生物学背景甚至独立队列验证一起来看。我现在的标准流程是先用PCoA看样本的整体分离情况再用LEfSe筛候选marker接着用箱线图人工确认每个marker的分布趋势有条件的项目再找独立队列做一次验证。这套组合下来比单跑一个LEfSe可靠得多。最后再多说一句跑之前把版本、输入文件、参数全部记下来以后不管是写方法部分还是面对审稿人都能省下大把力气。
RELATED

相关推荐

Flutter鸿蒙适配实战:json_rpc_2库双向通信改造全解析

Flutter鸿蒙适配实战:json_rpc_2库双向通信改造全解析

最近把公司的 Flutter 应用向鸿蒙系统做迁移适配,整个过程里,json_rpc_2 这个三方库的鸿蒙化适配算是比较典型的一个案例。json_rpc_2 是 dart-lang 官方维护的一个 JSON-RPC 2.0 协议实现,许多 Flutter 项目拿它来做长连接双向通信、组件间调…

📅 2026/10/6 3:49:48
运筹优化算法岗笔试全解析:从建模到工程实战

运筹优化算法岗笔试全解析:从建模到工程实战

2017年阿里内推的算法工程师(运筹优化)笔试题,放到今天来看依然很能说明问题。那几年正是互联网公司开始认真对待运筹优化方向的时候,阿里在电商、物流、调度、定价这些场景里积累了大量的业务需求,急需能把数学建模和…

📅 2026/10/6 3:49:48
ApolloAuto自动驾驶平台入门:从环境搭建到仿真Demo跑通全攻略

ApolloAuto自动驾驶平台入门:从环境搭建到仿真Demo跑通全攻略

百度ApolloAuto这名字,在自动驾驶圈子里算是绕不开的存在。不管你是准备参加全国大学生智能汽车竞赛的百度智慧交通创意组,还是单纯想研究一套开源无人车系统到底怎么跑起来,ApolloAuto都是目前能接触到的最完整的开源自动驾驶平台之一。这篇…

📅 2026/10/6 3:49:48
MORE NEWS

更多资讯

📰

微信小程序护肤购物系统实践:数据建模与2MB主包优化

1. 项目概述与设计思路1.1 这个选题解决了什么问题先聊点实在的。做毕业设计或者个人项目选型,最难的不是实现本身,而是“这个题目最后能不能作为一个完整的故事讲出来”。护肤购物系统这个题目,名字里三个关键词缺一不可:微信小程…

📰

嵌入式Linux入门:从裸机到命令行,开发者必须掌握的实用命令与调试技巧

从单片机裸机开发转向嵌入式Linux,第一道坎往往不是C语言,也不是中断、寄存器这些老熟人,而是那个黑乎乎的终端界面。串口工具连上开发板,光标停在#符号前面,你突然发现自己连“看看目录里有什么”都做不到&#xff0c…

📰

莫以skill小而不为:AI Agent技能虽小却有大能量

大概两年前,我第一次在AI工具里看到"skill"这个词的时候,心里想的是:这不就是一段提示词打包成文件吗,能有什么技术含量。直到后来一个几十KB的小skill,让我在项目里少写了两百行逻辑,我才意识到…

📰

多智能体协作触达监控框架Agent-Reach:设计、指标与踩坑实践

最近我把自己搭的一个多智能体协作框架翻出来做了一次大的重构,顺手把所有"触达"相关的问题收敛成了一个独立模块,项目代号暂时就叫Agent-Reach。可能有人一听这个名字会以为是个网络探测或者渠道触达的工具,但其实不是&#xff0c…

📰

AI编程超级能力:本地化开发工具链的范式迁移

1. “Superpowers”不是功能,是开发者工具链的范式迁移最近在几个技术社区和内部分享里,反复听到一个词——“superpowers”。它既不是某个新发布的开源库,也不是某家大厂刚推出的SaaS服务,更不是什么玄学概念。它本质上是一类以A…

📰

基于Hadoop的智能图书推荐系统:从用户行为日志到协同过滤的完整实践

简介:基于Hadoop框架与用户行为特征感知的智能图书推荐系统设计的学士学位毕业论文,原为西南财经大学毕业论文,主要面向计算机科学与技术、软件工程等专业的本科、专科毕业生,也适合对大数据处理与个性化推荐感兴趣的学习者。论文…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬