MLST(multilocus sequence typing):多位点序列分型
CG( clonal group):克隆群
CC(clonal complex):克隆复合体
CT(clonal type):克隆型
cgMLST (core genome multilocus sequence typing):核心基因组多位点序列分型
wgMLST (whole genome multilocus sequence typing):全基因多位点序列分型
CC、CG和MLST的关系
CC/CG是微生物基因组学中用于描述一组密切相关菌株的概念,广泛应用于 MLST和 cgMLST分析。在MLST研究中,基于eBURST算法,等位基因差异位数≤1/2/3的ST型被认为属于同一CC/CG。而在cgMLST研究中,CC/CG的划分因物种而异,通常阈值在10个等位基因左右。
CC/CG有两种常见表示方法,一种是以1、2、3...的顺序分别标识当前样本的密切相关群体;另一种是以每个密切相关群体中的祖先ST型编号来表示所在的群体,如用CG258标识ST258所在的CG,以便于跨研究交流。CT有时候也被用来替代cgMLST研究中的CC/CG,反映cgST之间的联系。
eBURST算法简介
eBURST(Evolutionary Biology Research Tool)是一种用于分析微生物菌株进化关系的算法,主要应用于多位点序列分型(MLST)或全基因组多位点序列分型(cgMLST)数据。
eBURST的核心思想是通过计算菌株间等位基因差异的位数,划分亲缘关系群组:
1.核心群(Core Group, CC)
- 若两菌株的等位基因差异位数 ≤1,则属于同一CC,代表近期共同祖先的直接后代。
2.同源群(Clonal Group, CG)
- 差异位数 ≤2 时归为同一CG,表示较远的共同进化分支。
3.同类型(Clonal Type, CT)
- 差异位数 ≤3 可能属于同一CT,但亲缘关系更弱。
这种分类依赖于“克隆复合体”模型,假设菌株通过突变而非重组进化,适用于追踪短期的传播路径。

文献( doi:10.1016/S1473-3099(19)30755-8.)中关于CG的定义方法是:只在 1~2 个基因等位位点上有差异的 ST,并以核心 ST 命名(即数量最多或最中心的 ST)。
下面是简化版eBURST的处理方法
library(data.table)
library(igraph)
# 读取数据
mlst_data <- fread("MLST.txt", sep = "\t", header = TRUE)
# 提取 profile 矩阵
profiles <- as.data.frame(mlst_data)
rownames(profiles) <- profiles$ST
alleles <- as.matrix(profiles[, -1]) # 只保留等位基因数值(不含 ST)
# 计算两两之间的 allele 差异数(矩阵形式,行/列为 ST)
n <- nrow(alleles)
edge_list <- list()
for (i in 1:(n-1)) {
diffs <- rowSums(alleles[(i+1):n, , drop=FALSE] != alleles[rep(i, n - i), ])
connected <- which(diffs <= 2)
if (length(connected) > 0) {
edge_list[[length(edge_list)+1]] <- data.frame(
from = rownames(alleles)[i],
to = rownames(alleles)[(i+1):n][connected]
)
}
}
# 合并边
edges_df <- do.call(rbind, edge_list)
# 构建图
g <- graph_from_data_frame(edges_df, directed = FALSE)
# 计算连通子图(即 CG)
comp <- components(g)
# 构建 CG 表格
cg_map <- data.frame(ST = names(comp$membership),
cluster = comp$membership) %>%
group_by(cluster) %>%
mutate(CG = paste0("CG", min(as.integer(ST)))) %>%
ungroup() %>%
select(ST, CG)
# 加入未连接的 ST(没有任何连边的 ST)
all_sts <- as.character(mlst_data$ST)
unlinked_sts <- setdiff(all_sts, cg_map$ST)
if (length(unlinked_sts) > 0) {
cg_map <- bind_rows(cg_map,
data.frame(ST = unlinked_sts,
CG = paste0("CG", unlinked_sts)))
}
# 确保 ST 是字符型
cg_map$ST <- as.character(cg_map$ST)
mlst_data$ST <- as.character(mlst_data$ST)
# 合并并输出
final_df <- merge(mlst_data, cg_map, by = "ST")
fwrite(final_df, file = "MLST_with_CG.tsv", sep = "\t")
其中MLST.txt的格式是形如:

最终可以得到每个ST对应的CG 分型的结果:

简化版处理方式和 eBURST 区别
| 特点 | 简化版 | 真正的 eBURST 或 goeBURST |
|---|---|---|
| ST 聚类标准 | 差异 ≤2 | 差异 1(传统),或 ≤2(goeBURST 扩展) |
| 算法 | 连通子图(图论) | 构建单链接网络,使用复杂排序规则找“创始 ST” |
| 创始 ST 的选取 | 取最小 ST 编号 | 依据连接度(founder 候选)和优先级评分 |
| 软件工具 | R + igraph | BURST (Java), goeBURST (PHYLOViZ), eBURST v3 |