跳转至

微生物菌株水平分析

一句话概述

利用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