第2章:物种丰度数据简介:OTU/ASV表结构,常见格式与元数据关联

好,咱们正式开始跟数据打交道。很多初学者拿到一份物种丰度数据后,第一反应就是「这表格该怎么看?」。别急,这章我就带你把这层窗户纸捅破。

所谓的物种丰度数据,说白了就是把测序仪吐出来的那些乱七八糟的序列,按物种归类,再数一数每个物种在样本里出现了多少次。最后你会得到一张大表——行是物种,列是样本,交叉点是数字。就这么简单。

核心概念:OTU(操作分类单元)和ASV(扩增子序列变体)是这张表的基础。OTU是按97%相似度聚类得到的,ASV是单碱基精度的去噪结果。我建议新手一开始别纠结两者谁更好,先搞清楚表结构才是正经事。

2.1 OTU/ASV表的行列结构

我们来拆解一下这张表的骨架。我把它分成三部分讲。

结构要素 说明 常见问题
行(Row) 每个OTU/ASV的ID,例如OTU_1、ASV_120 行名必须唯一,千万别有重复
列(Column) 样本名称,例如Sample1、Control_01 列名与元数据表要完全对应
值(Value) 整数或浮点数,代表序列数或相对丰度 整型数据用整数,千万别乱转成小数

为什么要关注这个?嗯,因为我见过无数次因为行列名对不上,分析卡在半路的情况。举个例子,有一次一个师弟跑过来跟我说:「师兄,我的alpha多样性算不出来。」我一看,元数据里的样本名写成了「Sample_01」,丰度表里是「Sample1」,差一个下划线,全盘皆输。

2.2 常见格式:CSV、TSV与BIOM

你拿到的丰度表,通常有这三种格式。差别其实不大,就是个分隔符和封装方式的问题。

  • CSV(逗号分隔值):最常见的格式,用英文逗号,分隔。Excel直接打开很方便,但注意——如果物种分类名里含逗号,容易串列。
  • TSV(制表符分隔值):用Tab键\t分隔。我个人更偏爱TSV,因为逗号在名称里出现得更少,不容易翻车。
  • BIOM(生物观测矩阵格式):JSON或HDF5格式的封装,自带分类信息。Qiime2的标配,结构复杂但功能强大。
个人习惯:如果是手动检查数据,我用CSV;如果是写R脚本处理,我用TSV。为什么?因为read.table()系列函数的默认分隔符支持Tab,写代码时少打一个参数。

这里给一段简单的读取代码,你感受一下区别。

# CSV格式读取
otu_csv <- read.csv("otu_table.csv", row.names = 1)

# TSV格式读取
otu_tsv <- read.table("otu_table.tsv", sep = "\t", header = TRUE, row.names = 1)

# BIOM格式读取(需要安装biomformat包)
library(biomformat)
otu_biom <- read_biom("otu_table.biom")
biom_to_dense(otu_biom)

2.3 元数据关联:把生物学背景装进来

光有丰度表是不够的。你想想看,没有分组信息,你怎么知道哪个样本是处理组、哪个是对照组?所以元数据表(metadata)必须跟上。

元数据表长这样:

SampleID Group Time Treatment
Sample_01 Control Day0 PBS
Sample_02 Treatment Day7 DrugA

关联丰度表与元数据,核心就一句话:用样本名做桥梁。只要丰度表的列名和元数据表的SampleID列完全一致,merge就能搞定。

我曾经因为忽略大小写,栽过一次跟头。脚本跑了两周,结果发现丰度表里是「sample_01」,元数据里是「Sample_01」,一个字母大小写不同,all函数返回FALSE。从那以后,我写了个规范流程:

  1. 读取数据后立刻用toupper()或tolower()统一大小写
  2. 用setdiff()检查是否有缺失的样本
  3. 用match()或merge()确保顺序一致
避坑指南:有些微生物组数据提供了「对照样品」(blank/negative control),这些样本在分析前必须剔除。我有一回忘了这一步,负对照组里检出了大量序列,差点把整个分析结果带偏。

最后,我画了一张框架图,帮你把这章的知识点串起来。你看着这张图,应该能一目了然。

物种丰度数据知识体系 物种丰度数据 表结构 行:OTU/ASV 列:样本 值:丰度 常见格式 CSV(逗号) TSV(Tab) BIOM(JSON) 元数据关联 样本名对齐 分组信息

嗯,到这你应该清楚了。搞懂了表结构、认清了格式差异、把元数据挂上去,后头的分析才站得住脚。别小看这些基础操作,它们能帮你省下大把调试时间。