1. 物种丰度表简介
做微生物组分析,你第一个碰到的文件就是物种丰度表。说白了,它就是一个矩阵——行是物种(OTU/ASV/属种),列是样本,单元格里填的是丰度值。这个表记录了「每个样本里有哪些微生物、各有多少」。我个人习惯把丰度表看作整个分析的起点,后面所有可视化、统计检验、差异筛选都从这张表出发。
1.1 丰度表里有什么
先看一个极简的 TSV 格式例子:
#OTU ID Samp1 Samp2 Samp3
OTU_1 120 85 210
OTU_2 45 160 30
OTU_3 0 12 88
OTU_4 78 0 0
每行一个物种,每列一个样本。数字是原始序列计数,没有经过归一化。你在实际项目中拿到的表可能多达几万行,几百列。我记得第一次处理 16S 数据,看到那个 2 万行的表格时,心里直呼「这怎么搞」——后来学会了格式转换和过滤,才没那么慌。
1.2 常见格式一览
| 格式 | 文件扩展名 | 数据组织 | 典型应用 |
|---|---|---|---|
| BIOM | .biom | JSON/HDF5,含元数据 | QIIME2、MG-RAST、Huttenhower 生态分析 |
| TSV | .tsv / .txt | 制表符分隔,纯文本 | 手动检查、R/Python 快速读取 |
| CSV | .csv | 逗号分隔,纯文本 | Excel 打开、数据导入通用 |
| Excel | .xlsx / .xls | 带格式的多工作表 | 协作汇报、手动编辑 |
| HDF5 | .h5 / .hdf5 | 二进制,支持大矩阵 | 大规模宏基因组,压缩存储 |
每种格式都有自己的「脾气」。我在项目中遇到过好几次「费半天劲分析完,发现导出格式不对,又得重跑」的情况。所以提前搞清楚格式特性非常关键。
1.3 BIOM 格式详解
BIOM(Biological Observation Matrix)是目前微生物组领域的标准格式。它不只是存数字,还嵌入物种分类、样本元数据、处理流程等。你想想看,一个文件就包含了整个实验的所有生物观测信息,省去到处找 metadata 的麻烦。
BIOM 1.0 是 JSON 结构,2.0 及以上用 HDF5。典型的 JSON 格式 BIOM 文件片段:
{
"id": "MyStudy",
"format": "Biological Observation Matrix 1.0.0",
"matrix_type": "dense",
"shape": [4, 3],
"data": [[120,85,210],[45,160,30],[0,12,88],[78,0,0]],
"rows": [
{"id":"OTU_1","metadata":{"taxonomy":"k__Bacteria;p__Firmicutes"}},
{"id":"OTU_2","metadata":{"taxonomy":"k__Bacteria;p__Bacteroidetes"}},
{"id":"OTU_3","metadata":{"taxonomy":"k__Bacteria;p__Proteobacteria"}},
{"id":"OTU_4","metadata":{"taxonomy":"k__Bacteria;p__Actinobacteria"}}
],
"columns": [
{"id":"Samp1","metadata":{"body_site":"gut"}},
{"id":"Samp2","metadata":{"body_site":"skin"}},
{"id":"Samp3","metadata":{"body_site":"oral"}}
]
}
看到没?物种 ID、分类树、样本分组都塞在一个文件里。用 Python 的 biom-format 包读写非常方便。
import biom
table = biom.load_table('example.biom')
print(table.shape) # (4, 3)
print(table.ids('observation')) # ['OTU_1', 'OTU_2', 'OTU_3', 'OTU_4']
1.4 TSV 与 CSV:最朴实的格式
TSV 是我个人最常用的交换格式。理由很简单:物种名、样本名里经常有逗号(比如 Escherichia coli 里没逗号,但某些注释里有),用逗号分隔很容易解析出错。制表符就安全得多。CSV 的优势是 Excel 和各类脚本原生支持,导入导出最方便。
实际操作中,我一般这样处理:
- 快速查看 → 用 Excel 打开 CSV(注意大文件会卡)
- 脚本清洗 → 用 Python 的
pandas.read_csv('file.tsv', sep='\t') - 长期存储 → 转为 BIOM 或 HDF5(节省空间、保留元数据)
我曾经因为一个 TSV 文件里混了拉丁学名中的句点和括号,导致 pandas 把整列读成了字符串。排查了很久,后来发现是 delimiter 不一致——那个文件前 10 行用制表符,后面突然混了两个空格。从那以后我每次读取都会先检查行长度是否一致。
1.5 常见应用场景
- Alpha/Beta 多样性分析:输入丰度表,计算 Shannon 指数、Bray-Curtis 距离等。
- 差异丰度分析:DESeq2 / edgeR / ANCOM 等都要求计数矩阵。
- 物种组成可视化:堆叠柱状图、热图、网络图,数据源全是丰度表。
- 机器学习分类:将丰度表转为特征矩阵,样本标签来自列元数据。
- 跨平台数据整合:不同测序平台产出格式不同,统一转为 BIOM 再合并。
1.6 本章知识体系
下面这张图帮你理清思路:
图中展示了三个核心分支:结构(矩阵维度、计数类型、元数据)、格式(BIOM/TSV/CSV/Excel/HDF5)、应用(多样性、差异、可视化、ML)。底部标出了最容易踩坑的地方——格式转换。