2. 数据格式介绍:OTU表、ASV表、BIOM格式详解
做物种丰度合并,第一步就是搞清楚数据长什么样。常见的有三种——OTU表、ASV表,还有BIOM格式。我在项目里见过有人把OTU表当ASV表,结果分析全乱套。所以这一节,咱们把每种格式的底细摸清楚。
2.1 OTU表:最经典的物种丰度矩阵
OTU表,说白了就是一个矩阵。行是OTU(操作分类单元),列是样本,格子里的数字就是该OTU在该样本中的序列条数或丰度。早期用UPARSE、QIIME 1跑出来,基本都是这个形状。
举个例子,我接过一个土壤微生物项目,拿到手的OTU表长这样:
#OTU ID sample1 sample2 sample3 taxonomy
OTU_1 234 156 78 k__Bacteria;p__Proteobacteria
OTU_2 89 203 412 k__Bacteria;p__Firmicutes
OTU_3 0 12 55 k__Archaea;p__Euryarchaeota
看到没?第一列是OTU编号,后面每一列对应一个样本,最后一列是物种注释。这种格式优点是人眼能看懂,用Excel就能简单处理。但缺点也明显——元数据(比如样本分组、处理条件)得另存一个文件,合并多个OTU表时经常对不上列名。
2.2 ASV表:更高分辨率的替代方案
ASV(扩增子序列变体)表,是DADA2、Deblur这类工具推出来的。它不聚类成OTU,而是把每个去噪后的唯一序列作为一个“变体”。分辨率高到单碱基差异都能区分,所以行数通常比OTU表多一个数量级。
表格结构跟OTU表几乎一样,只是行标签变成了ASV编号或序列哈希值:
#ASV ID sample1 sample2 sample3 taxonomy
ASV_00001 120 34 67 k__Bacteria;p__Actinobacteria
ASV_00002 56 189 233 k__Bacteria;p__Bacteroidetes
ASV_00003 0 0 12 k__Archaea;p__Thaumarchaeota
注意一个坑:ASV表的稀疏性很高。因为ASV数量多,很多样本里大部分ASV丰度为0。如果你直接对稀疏矩阵做标准化,内存会爆炸。我记得有次处理16S肺癌研究数据,ASV表有8万行,加载到R里慢得让人崩溃。后来改成用biom格式存储,问题才解决。
2.3 BIOM格式:标准化生态系统
BIOM(Biological Observation Matrix)是微生物组社区的标准JSON格式。它把观测数据、样本元数据、特征元数据全塞进一个文件。比如以下是一个简化版BIOM JSON结构:
{
"id": "MyStudy",
"format": "Biological Observation Matrix 1.0.0",
"matrix_type": "dense",
"shape": [3, 3],
"data": [[234, 156, 78], [89, 203, 412], [0, 12, 55]],
"rows": [
{"id": "OTU_1", "metadata": {"taxonomy": "k__Bacteria;p__Proteobacteria"}},
{"id": "OTU_2", "metadata": {"taxonomy": "k__Bacteria;p__Firmicutes"}},
{"id": "OTU_3", "metadata": {"taxonomy": "k__Archaea;p__Euryarchaeota"}}
],
"columns": [
{"id": "sample1", "metadata": {"group": "control"}},
{"id": "sample2", "metadata": {"group": "treatment"}},
{"id": "sample3", "metadata": {"group": "treatment"}}
]
}
你想想看,这种结构把所有信息打包了,合并多个BIOM文件时不再需要手动拼接元数据。我在临床合作项目里,就是从不同测序批次生成BIOM,然后直接用qiime2的biom add-metadata和biom merge搞定合并。
biom convert命令,注意加--to-json或--to-hdf5参数。HDF5版本加载更快,但需要Python的h5py库。我曾经在服务器上忘记安装h5py,结果报错半天才反应过来。2.4 三种格式的对比
下面这张表,帮你快速选对格式:
| 特性 | OTU表 | ASV表 | BIOM格式 |
|---|---|---|---|
| 行粒度 | OTU(97%聚类) | ASV(单碱基) | OTU或ASV均可 |
| 列定义 | 样本 | 样本 | 样本+样本元数据 |
| 元数据存储 | 额外文件 | 额外文件 | 内嵌在JSON/HDF5 |
| 人眼可读性 | 高(纯文本) | 高(纯文本) | 低(JSON结构复杂) |
| 合并难易度 | 中等(需对齐列名) | 中等(稀疏度高) | 简单(专用工具) |
| 工具兼容 | 所有旧工具 | DADA2、Deblur等新工具 | QIIME2、biom-format |
实践中,我建议这么选:单次实验、样本少(<50),直接用OTU或ASV的csv文件处理就够;多批次、需要共享或长期存档,一定要转成BIOM。
2.5 格式间的转换方法
转换不是必须的,但掌握几个命令能省很多时间。我用最多的工具是biom convert和awk。
从OTU表(tsv)转BIOM
biom convert -i otu_table.tsv -o otu_table.biom --table-type="OTU table" --to-json
从BIOM转回tsv
biom convert -i otu_table.biom -o otu_table.txt --to-tsv
合并两个BIOM文件
biom merge -i table1.biom table2.biom -o merged.biom
另外,如果你不喜欢BIOM工具链,也可以用Python的pandas直接撸:
import pandas as pd
df1 = pd.read_csv("otu1.tsv", sep="\t", index_col=0)
df2 = pd.read_csv("otu2.tsv", sep="\t", index_col=0)
merged = df1.join(df2, how="outer", fill_value=0)
merged.to_csv("merged_otu.tsv", sep="\t")
最后,送一张知识结构图,你可以直观理解三种格式在合并流程中的位置: