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表时经常对不上列名。

我个人的习惯:拿到OTU表后,先检查表头有没有多余的空格或特殊符号。之前有个项目,就因为样本名里混了个tab键,合并脚本直接崩了,排查了两小时才找到问题。

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 1.0和2.0虽然都是JSON,但2.0支持稀疏矩阵和更复杂的元数据结构。如果你用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")
核心点:无论用哪种格式,合并前必须保证特征ID(OTU/ASV编号)在批次间一致。如果不同批次用的参考数据库版本不同,特征ID可能冲突——我曾经踩过这个坑,合并后才发现重复ID,花了一整天清洗数据。

最后,送一张知识结构图,你可以直观理解三种格式在合并流程中的位置:

物种丰度表格式层次关系图 原始序列(FASTQ) OTU表(聚类) 97%相似度 ASV表(去噪) 单碱基分辨率 BIOM格式 内嵌丰度+样本+物种元数据 多批次合并 & 标准化 biom merge / TMM / CSS / RLE 直接合并OTU/ASV表 BIOM → 标准化 元数据整合