Bio.phenotype:分析表型数据
本章概述了 Biopython 中包含的 Bio.phenotype
包的功能。该包的范围是分析表型数据,这意味着解析和分析细胞培养物的生长测量结果。在当前状态下,该包侧重于分析由 表型微阵列技术 生成的 高通量表型实验,但未来的发展可能包括其他平台和格式。
表型微阵列
表型微阵列 是一种技术,它可以测量细菌和真核细胞在约 2000 种化学物质上的代谢,这些化学物质被分成 20 个 96 孔板。该技术测量四唑鎓染料被 NADH 还原的情况,细胞产生的 NADH 被用作细胞代谢的替代指标;由于这种染料的还原导致的颜色变化通常每 15 分钟测量一次。当细胞在维持细胞代谢的培养基中生长时,记录的表型数据类似于 S 形生长曲线,可以从中检索出一系列生长参数。
解析表型微阵列数据
Bio.phenotype
包可以解析两种不同的表型微阵列数据格式:由机器专有软件生成的 CSV(逗号分隔值)文件和由分析软件生成的 JSON 文件,例如 opm 或 DuctApe。解析器将返回一个或多个 PlateRecord 对象的生成器,具体取决于正在使用 read 或 parse 方法。你可以使用 Biopython 源代码提供的 Plates.csv 文件来测试 parse 函数。
>>> from Bio import phenotype
>>> for record in phenotype.parse("Plates.csv", "pm-csv"):
... print("%s %i" % (record.id, len(record)))
...
PM01 96
PM01 96
PM09 96
PM09 96
解析器返回一系列 PlateRecord 对象,每个对象包含一系列 WellRecord 对象(保存每个孔的实验数据),这些对象按 8 行 12 列排列;每行由 A 到 H 的大写字母表示,而列由两位数表示,从 01 到 12。有几种方法可以从 PlateRecord 对象访问 WellRecord 对象
- 孔标识符
如果你知道孔标识符(行 + 列标识符),你可以直接访问所需的孔。
>>> record["A02"] WellRecord('(0.0, 12.0), (0.25, 18.0), (0.5, 27.0), (0.75, 35.0), (1.0, 37.0), ..., (71.75, 143.0)')
- 孔板坐标
可以使用行和列号(从 0 开始的索引)检索相同的孔。
>>> from Bio import phenotype >>> record = list(phenotype.parse("Plates.csv", "pm-csv"))[-1] >>> print(record[0, 1].id) A02
- 行或列坐标
可以通过对 PlateRecord 对象使用 Python 列表切片语法,以批次检索板上彼此相邻的一系列 WellRecord 对象;行和列使用从 0 开始的索引编号。
>>> print(record[0]) Plate ID: PM09 Well: 12 Rows: 1 Columns: 12 PlateRecord('WellRecord['A01'], WellRecord['A02'], WellRecord['A03'], ..., WellRecord['A12']') >>> print(record[:, 0]) Plate ID: PM09 Well: 8 Rows: 8 Columns: 1 PlateRecord('WellRecord['A01'], WellRecord['B01'], WellRecord['C01'], ..., WellRecord['H01']') >>> print(record[:3, :3]) Plate ID: PM09 Well: 9 Rows: 3 Columns: 3 PlateRecord('WellRecord['A01'], WellRecord['A02'], WellRecord['A03'], ..., WellRecord['C03']')
操作表型微阵列数据
访问原始数据
从 PM 文件中提取的原始数据由每个孔的一系列元组组成,这些元组包含时间(以小时为单位)和比色测量值(以任意单位为单位)。通常,仪器每 15 分钟收集一次数据,但这在实验之间可能会有所不同。可以通过迭代 WellRecord 对象来访问原始数据;在下面的示例中,只显示前十个时间点。
>>> from Bio import phenotype
>>> record = list(phenotype.parse("Plates.csv", "pm-csv"))[-1]
>>> well = record["A02"]
>>> for time, signal in well:
... print(time, signal)
...
(0.0, 12.0)
(0.25, 18.0)
(0.5, 27.0)
(0.75, 35.0)
(1.0, 37.0)
(1.25, 41.0)
(1.5, 44.0)
(1.75, 44.0)
(2.0, 44.0)
(2.25, 44.0)
[...]
这种方法虽然提供了一种访问原始数据的方法,但它不允许直接比较不同的 WellRecord 对象,这些对象可能在不同的时间点进行测量。
访问插值数据
为了更轻松地比较不同的实验,以及一般地允许更直观地处理表型数据,该模块允许定义 WellRecord 对象中存在的时间点的自定义切片。对于没有直接测量的時間点的比色数据,通过对可用数据的线性插值来推导出,否则返回 NaN。这种方法仅适用于实际数据可用的时间间隔内。时间间隔可以使用与列表索引相同的语法定义;因此,默认时间间隔为一小时。
>>> well[:10]
[12.0, 37.0, 44.0, 44.0, 44.0, 44.0, 44.0, 44.0, 44.0, 44.0]
>>> well[9.55]
44.0
可以使用不同的时间间隔,例如五分钟
>>> for value in well[63 : 64 : 5 / 60]:
... print(f"{value:0.2f}")
...
110.00
111.00
112.00
113.00
113.33
113.67
114.00
114.33
114.67
115.00
115.00
115.00
>>> for value in well[63.33:73.33]:
... print(f"{value:0.2f}")
...
113.32
117.00
120.32
128.00
129.64
132.96
136.96
140.00
142.00
nan
对照孔减法
许多表型微阵列板包含一个对照孔(通常是 A01),这是一个培养基不应该支持任何生长的孔;该孔产生的低信号可以从其他孔中减去。PlateRecord 对象有一个专门的函数用于此,该函数返回另一个具有校正数据的 PlateRecord 对象。
>>> corrected = record.subtract_control(control="A01")
>>> record["A01"][63]
336.0
>>> corrected["A01"][63]
0.0
参数提取
那些观察到代谢活动的孔对比色数据显示出 S 形行为。为了更轻松地比较不同的实验,可以将 S 形曲线拟合到数据上,以便可以提取一系列汇总参数并用于比较。可以从曲线中提取的参数是
最小(min)和最大(max)信号;
平均高度(average_height);
曲线下面积(area);
曲线平台点(plateau);
指数代谢活动期间的曲线斜率(slope);
曲线滞后时间(lag)。
所有参数(除了 **min**、**max** 和 **average_height**)都需要安装 scipy 库。
fit 函数使用三个 S 形函数
- Gompertz
\(Ae^{-e^{(\frac{\mu_{m}e}{A}(\lambda - t) + 1)}} + y0\)
- Logistic
\(\frac{A}{1+e^{(\frac{4\mu_{m}}{A}(\lambda - t) + 2)}} + y_{0}\)
- Richards
\(A(1 + ve^{1 + v} + e^{\frac{\mu_{m}}{A}(1 + v)(1 + \frac{1}{v})(\lambda - t)})^{-\frac{1}{v}} + y0\)
其中
对应于 **plateau**
对应于 **slope**
对应于 **lag**
这些函数源自 这篇出版物。fit 方法默认情况下首先尝试拟合 Gompertz 函数:如果失败,它将尝试拟合 Logistic 函数,然后是 Richards 函数。用户也可以指定要应用的三种函数之一。
>>> from Bio import phenotype
>>> record = list(phenotype.parse("Plates.csv", "pm-csv"))[-1]
>>> well = record["A02"]
>>> well.fit()
>>> print("Function fitted: %s" % well.model)
Function fitted: gompertz
>>> for param in ["area", "average_height", "lag", "max", "min", "plateau", "slope"]:
... print("%s\t%.2f" % (param, getattr(well, param)))
...
area 4414.38
average_height 61.58
lag 48.60
max 143.00
min 12.00
plateau 120.02
slope 4.99
写入表型微阵列数据
PlateRecord 对象可以以 JSON 文件的形式写入文件,这是一种与其他软件包(如 opm 或 DuctApe)兼容的格式。
>>> phenotype.write(record, "out.json", "pm-json")
1