微生物菌株水平分析¶
一句话概述¶
利用StrainPhlAn、inStrain、DESMAN等工具从宏基因组数据中进行菌株水平的分辨和追踪,揭示同一物种内不同菌株的多样性、传播模式和功能差异。
核心知识点总览¶
| 知识点 | 关键内容 | 重要程度 |
|---|---|---|
| 菌株概念 | 种内SNV/基因组变异定义菌株 | ⭐⭐⭐⭐⭐ |
| StrainPhlAn | 基于标记基因SNP的菌株分型 | ⭐⭐⭐⭐⭐ |
| inStrain | 基于reads mapping的种群多样性 | ⭐⭐⭐⭐⭐ |
| DESMAN | 从混合群体分解菌株频率 | ⭐⭐⭐⭐ |
| 菌株追踪 | 母婴传递/FMT/院内传播 | ⭐⭐⭐⭐ |
| popANI/conANI | 种群vs共识基因组相似度 | ⭐⭐⭐ |
| 功能菌株差异 | 同种不同株的致病性/代谢差异 | ⭐⭐⭐ |
| 参考基因组选择 | 代表性基因组对分析的影响 | ⭐⭐⭐ |
各步骤详解¶
第一步:菌株水平分析的意义¶
白话解释: 同一个物种(如大肠杆菌E. coli)内部有巨大的基因组差异——有的株无害(K-12),有的致病(O157:H7)。传统16S或物种级分析看不到这些差异。菌株水平分析就是从宏基因组数据中识别具体是哪个菌株存在,并追踪其传播和演化。
技术细节: 菌株定义(计算生物学视角): - 相同物种(ANI>95%)内,基于全基因组SNV差异区分的亚群体 - 通常同一菌株间SNV密度<1/1000bp - 不同菌株间可能有基因含量差异(pan-genome变异)
应用场景: - 母婴菌群传递追踪 - FMT(粪菌移植)的定植成功评估 - 院内感染溯源 - 菌株水平的疾病关联
# 菌株分析工具对比
# | 工具 | 原理 | 输入 | 优势 |
# |------|------|------|------|
# | StrainPhlAn | marker gene SNP | MetaPhlAn输出 | 快速,无需组装 |
# | inStrain | reads→genome mapping | BAM+genome | 定量精确,种群遗传 |
# | DESMAN | 共变异推断菌株 | contig variants | 混合菌株分解 |
# | StrainGE | reference-guided | FASTQ | 直接菌株检测 |
第二步:StrainPhlAn菌株分型¶
白话解释: StrainPhlAn是MetaPhlAn的配套工具。它提取每个样本中目标物种的标记基因序列(含SNV),然后通过多序列比对和系统发育分析,判断不同样本中的菌株关系。如果两个样本的菌株SNP模式几乎一致,说明是同一菌株(可能有传播关系)。
技术细节:
# === StrainPhlAn 4 流程 ===
# 前提:已运行MetaPhlAn4获得比对输出文件
# 注意:MetaPhlAn 4.2起参数名改为 --mapout(旧版用 --bowtie2out)
metaphlan sample.fq.gz --input_type fastq \
--bowtie2out sample.bowtie2.bz2 \
-o sample_profile.txt --nproc 16
# Step1: 从MetaPhlAn比对中提取样本标记基因
# 注意:StrainPhlAn 4.1起输出从.pkl改为.json格式
sample2markers.py -i sample.bowtie2.bz2 \
-o consensus_markers/ \
--nprocs 8
# Step2: 提取目标物种的参考标记基因
extract_markers.py -c s__Escherichia_coli \
-o ref_markers/
# Step3: 运行StrainPhlAn(4.0用*.pkl,4.1+用*.json)
strainphlan -s consensus_markers/*.pkl \
-m ref_markers/s__Escherichia_coli.fna \
-r ref_genomes/*.fna \
-o strainphlan_output/ \
-n 8 \
-c s__Escherichia_coli \
--mutation_rates \
--phylophlan_mode accurate
# 输出:
# - RAxML系统发育树
# - 多序列比对
# - 突变率统计
# StrainPhlAn结果解析
import pandas as pd
from ete3 import Tree
# 读取系统发育树
tree = Tree("strainphlan_output/RAxML_bestTree.s__Escherichia_coli.tre")
# 计算样本间遗传距离
# 距离近的样本=可能同一菌株传播
for leaf1 in tree.get_leaves():
for leaf2 in tree.get_leaves():
if leaf1.name < leaf2.name:
dist = tree.get_distance(leaf1, leaf2)
if dist < 0.001: # 非常近
print(f"Possible same strain: {leaf1.name} - {leaf2.name} (dist={dist:.6f})")
第三步:inStrain详细种群分析¶
白话解释: inStrain比StrainPhlAn更深入——它将reads比对到参考基因组,然后在每个位点计算等位基因频率。通过分析SNV频率模式,可以判断样本中是否存在多个菌株(strain mixture),以及计算种群水平的遗传多样性。
技术细节:
# === inStrain 流程 ===
# Step1: 将reads比对到参考基因组
bowtie2 --very-sensitive -p 16 \
-x reference_genome \
-1 sample_R1.fq.gz -2 sample_R2.fq.gz \
| samtools sort -@ 8 -o sample_vs_ref.sorted.bam
samtools index sample_vs_ref.sorted.bam
# Step2: 运行inStrain profile
inStrain profile sample_vs_ref.sorted.bam reference_genome.fasta \
-o inStrain_output/ \
-p 16 \
--min_cov 5 \
--min_freq 0.05 \
--database_mode
# Step3: 多样本比较
inStrain compare \
-i sample1_inStrain/ sample2_inStrain/ sample3_inStrain/ \
-o compare_output/ \
-p 16 \
--database_mode
# 关键输出指标:
# - popANI: 种群平均核苷酸一致性(>99.999%=同一菌株)
# - conANI: 共识序列ANI
# - coverage: 基因组覆盖度
# - breadth: 基因组覆盖宽度
# - nucl_diversity: 核苷酸多样性(π)
# inStrain结果分析
import inStrain
import inStrain.SNVprofile
import pandas as pd
# 读取profile结果
IS = inStrain.SNVprofile.SNVprofile("inStrain_output/")
# 获取基因组级别统计(读取输出目录下的TSV文件)
genome_info = pd.read_csv("inStrain_output/output/genome_info.tsv", sep="\t")
print(genome_info[['genome', 'coverage', 'breadth', 'nucl_diversity']])
# 读取compare结果
compare_df = pd.read_csv("compare_output/comparisonsTable.tsv", sep="\t")
# 判断同一菌株
# popANI > 99.999% 且 共享位点 > 覆盖的50%
same_strain = compare_df[
(compare_df['popANI'] > 0.99999) &
(compare_df['percent_genome_compared'] > 0.5)
]
print("Likely same strain pairs:")
print(same_strain[['name1', 'name2', 'popANI']])
第四步:DESMAN菌株分解¶
白话解释: 当一个样本中存在同一物种的多个菌株时(strain mixture),inStrain能发现"多态性"但不能分解出各个独立菌株的基因型。DESMAN用概率模型从共变异(co-occurring variants)模式中"拆解"出各菌株的频率和基因型。
技术细节:
# === DESMAN 流程 ===
# 前提:已有contig binning结果,选定目标物种的bin
# Step1: 从BAM中提取变异位点频率
python Variant_Filter.py contig_coverage.csv \
-o filtered_variants/ \
-m 0.01 -f 0.05
# Step2: 运行DESMAN(尝试不同菌株数G)
for G in 2 3 4 5; do
desman filtered_variants/freq_var.csv \
-e filtered_variants/freq_df.csv \
-o desman_G${G}/ \
-g ${G} \
-s 100 \
-i 100 \
--seed 42
done
# Step3: 选择最优菌株数(基于ELBO/posterior deviance)
python resolvenhap.py desman_G2/ desman_G3/ desman_G4/ desman_G5/
# 输出:
# - 各菌株的基因型(在每个变异位点的等位基因)
# - 各样本中各菌株的相对频率
# - 模型拟合度(用于选择G)
第五步:菌株追踪应用¶
白话解释: 菌株追踪是菌株分析的重要应用。典型场景包括:新生儿从母亲获得了哪些菌株?FMT供体的哪些菌株成功定植到受体?医院内感染爆发中的菌株传播链是什么?
技术细节:
# === 母婴菌株传递分析 ===
# 使用inStrain compare的结果
compare_results <- read.csv("compare_output/comparisonsTable.tsv", sep = "\t")
# 筛选母婴配对的比较结果
mother_infant_pairs <- compare_results %>%
filter(grepl("Mother", name1) & grepl("Infant", name2))
# 判断传递:popANI > 99.999%
transmitted_strains <- mother_infant_pairs %>%
filter(popANI > 0.99999 & percent_genome_compared > 0.5)
cat(sprintf("Transmitted strains: %d out of %d species compared\n",
nrow(transmitted_strains), nrow(mother_infant_pairs)))
# 传递率统计(按物种)
transmission_rate <- mother_infant_pairs %>%
group_by(genome) %>%
summarise(
n_pairs = n(),
n_transmitted = sum(popANI > 0.99999, na.rm = TRUE),
rate = n_transmitted / n_pairs
) %>%
arrange(desc(rate))
# 可视化菌株传递网络
library(igraph)
edges <- transmitted_strains[, c("name1", "name2")]
g <- graph_from_data_frame(edges, directed = TRUE)
plot(g, vertex.size = 8, edge.arrow.size = 0.5)
第六步:功能性菌株差异分析¶
白话解释: 同一物种的不同菌株可能有重大功能差异——耐药性、毒力因子、代谢能力等。通过比较不同菌株的基因含量差异(pan-genome分析),可以理解菌株水平的功能多样性。
技术细节:
# === 菌株功能差异 ===
# 使用inStrain的基因水平分析
# 新版inStrain推荐在profile阶段直接用-g指定基因文件,gene_profile已废弃
inStrain profile sample_vs_ref.sorted.bam reference.fasta \
-g reference_genes.fna \
-o gene_profile_output/ \
-p 16
# 基因存在/缺失变异(accessory genome)
# 通过覆盖度判断基因是否存在
# coverage > 0.5 * genome_mean = present
# coverage < 0.1 * genome_mean = absent
# 菌株水平的基因含量差异
import pandas as pd
# 读取基因覆盖度
gene_coverage = pd.read_csv("gene_profile_output/gene_info.tsv", sep="\t")
# 标记基因存在/缺失
genome_mean_cov = gene_coverage['coverage'].mean()
gene_coverage['present'] = gene_coverage['coverage'] > 0.5 * genome_mean_cov
# 统计可变基因(在部分样本存在)
gene_prevalence = gene_coverage.groupby('gene')['present'].mean()
accessory_genes = gene_prevalence[(gene_prevalence > 0.1) & (gene_prevalence < 0.9)]
print(f"Accessory genes: {len(accessory_genes)}")
# 耐药基因/毒力因子的菌株特异性
# 检查哪些样本的菌株携带特定功能基因
实战命令速查¶
# StrainPhlAn
sample2markers.py -i sample.bowtie2.bz2 -o markers/
strainphlan -s markers/*.pkl -m ref_markers.fna -o output/ -c species_name
# inStrain
bowtie2 --very-sensitive -x ref -1 R1.fq.gz -2 R2.fq.gz | samtools sort -o aligned.bam
inStrain profile aligned.bam ref.fa -o profile_out/ -p 16
inStrain compare -i profile1/ profile2/ -o compare_out/
面试常问点¶
Q1: popANI和conANI的区别?什么阈值判断"同一菌株"?¶
A: popANI(population ANI)比较两个样本中该物种种群的遗传距离,考虑所有检测到的SNV频率。conANI(consensus ANI)只比较共识(主等位基因)序列。popANI > 99.999%通常判断为同一菌株(相当于在比较的区域内几乎没有固定差异)。conANI > 99.99%也是常用阈值。二者的差异在于处理种群内多态性的方式。
Q2: StrainPhlAn和inStrain适用于什么不同场景?¶
A: StrainPhlAn基于标记基因(~1Mb),速度快、内存需求低,适合大规模队列的快速菌株分型。但分辨率受标记基因数量限制。inStrain比对到全基因组(~5Mb),分辨率更高,还能做种群遗传学分析(核苷酸多样性π、微进化率等),但计算量大。推荐:初筛用StrainPhlAn,深入分析用inStrain。
Q3: 如何判断样本中是否有多个菌株共存?¶
A: (1) inStrain的nucl_diversity(π):高π值(如>0.001)提示存在多菌株;(2) 检查SNV等位基因频率分布——如果很多SNV频率在0.3-0.7之间(非0/1),说明有混合菌株;(3) DESMAN尝试分解多菌株并评估模型拟合;(4) StrainPhlAn中如果标记基因有大量杂合位点也提示混合。
Q4: 菌株追踪中如何排除独立获取同一常见菌株的可能?¶
A: 需要背景对照:如果某菌株在人群中极普遍(如B. uniformis某常见株),两人共有该株可能是独立获取而非传播。应:(1) 与人群背景数据比较该株的流行度;(2) 检测更精细的SNV差异——即使popANI>99.999%,真正的传播关系应有极少的SNV差异(与突变率×时间一致),而独立获取可能有更多差异。
Q5: 菌株水平分析需要多高的测序深度?¶
A: 目标物种需要至少5-10x基因组覆盖度才能可靠做菌株分析。对于丰度1%的物种,需要宏基因组总深度约50-100x(~15-30Gb/样本for human gut)。低丰度物种可能需要靶向富集(如探针捕获)或更深测序。
易错点¶
1. 参考基因组选择不当¶
使用远缘参考基因组会导致reads比对率低,菌株分辨力下降。应选择与样本物种最接近的参考(如使用MAG或最近的分离株基因组)。
2. 低覆盖度下的假阳性SNV¶
覆盖度<5x时,测序错误容易被误认为SNV。inStrain和StrainPhlAn都需要设置最小覆盖度阈值。
3. 将多菌株混合误判为单一高多样性菌株¶
如果不做菌株分解,混合菌株的信号看起来像一个"高度多态"的菌株。需要检查SNV频率分布来判断是否存在混合。
4. 忽略重组对系统发育的影响¶
细菌频繁发生同源重组,这会破坏基于SNP的系统发育信号。对重组率高的物种(如H. pylori),应使用重组感知的方法(如ClonalFrameML)。
5. 过度解读短时间尺度的传播¶
popANI > 99.999%不一定代表直接传播——如果菌株进化速率很低,数月前的间接传播也可能满足此阈值。需要结合流行病学信息(时间、空间)和突变率模型。
补充知识¶
其他菌株分析工具¶
- StrainGE:参考引导的菌株检测
- MIDAS2:大规模菌株定量
- PanPhlAn:基因组泛基因组水平菌株差异
- mixtureS:菌株混合分解
应用场景¶
- 益生菌定植追踪
- 抗生素治疗后菌群恢复
- 社区/家庭内菌株共享
- 环境-人体菌株流动
引用推荐¶
- StrainPhlAn: Truong et al., Genome Research, 2017
- inStrain: Olm et al., Nature Biotechnology, 2021
- DESMAN: Quince et al., Genome Biology, 2017