通常需要将随时间变化的曲线分类到不同的类别中。例如,细胞生长曲线可能具有不同的形状类型(例如,双相生长),这些形状类型表征了细胞的生长行为。这些不同的曲线类型使得难以自动、准确地从曲线中提取表征参数(例如,生长起始延迟、生长速率、最终生长水平等)。
大家好,我叫杰瑞·菲什 (Jerry Fish)。欢迎参加本次讲座,我和我的同事凯尔·普罗布斯特 (Kyle Probst) 将探讨如何使用函数数据浏览器 (Functional Data Explorer) 对曲线形状进行分类。我目前在 JMP 工作,是一名 JMP 员工,至今已有 7 年,主要负责为中西部地区的客户提供支持。如果您恰好身处中西部地区,欢迎随时联系我,我非常乐意为您提供任何 JMP 方面的帮助。
这就是我们正在讨论的典型曲线特征。今天,Kyle 会对此进行更详细的解释。我们讨论的是细胞生长曲线。生长曲线指的是,当你给细胞提供某些营养物质时,例如,你感兴趣的是这些特定细胞的生长速度。你可能会得到一条类似这样的曲线:开始时细胞没有生长。突然,细胞开始生长,并在末端达到平台期。这可能是一条典型的曲线。Kyle 将简要介绍一些我们感兴趣的关键参数。
问题在于我们需要对不同类型的曲线进行分类。左上角这条曲线就是我刚才展示的。我们称之为单相曲线。它只有一个生长模式,之后就能维持下去,所以细胞会继续存活。右上角这条曲线也是单相曲线。它只有一个转变,但最后细胞会逐渐死亡。也许这一点很重要,或者在你的业务中,这可能是你感兴趣的一个关键特征。
我们称这种生长模式为双相生长,因为它有两个生长阶段。第一个阶段生长趋于平稳,然后是第二个生长阶段。最后,还有一些情况下植物完全停止生长,我们当然也会对这种情况感兴趣。
现在,这些测试可能包含数百个测试结果,我们不想逐个筛选。如果我们知道每条曲线的具体情况,例如,这条曲线就可以用 JMP 中的“拟合曲线”功能进行建模。这条曲线和这条曲线(双相生长曲线)可能更适合在非线性平台上建模,因为在那里我们可以更灵活地控制曲线的形状。我们不想每次都查看每条曲线来决定应用哪种模型。如果可以的话,我们希望实现这个系统的自动化。
接下来,我把话筒交给凯尔,让他自我介绍一下,并简单谈谈这条曲线,以及它为何如此重要,还有我们正在做的事情。凯尔?
谢谢杰瑞。你的介绍很棒。正如杰瑞提到的,我们在凯瑞制药的细胞营养业务部门做了很多工作,主要评估微生物的生长情况。我先简单介绍一下自己。我叫凯尔·普罗布斯特,是凯瑞制药的高级科学家,在位于威斯康星州贝洛伊特的北美总部工作。我负责支持我们公司的细胞营养业务,我们为微生物、哺乳动物细胞和其他细胞提供蛋白质水解物和酵母提取物等营养物质,其中很多都用于生物制药行业生产救命药物。
杰瑞在这里使用的数据来自我们实验室常用的一种特定检测方法。这种方法属于高通量筛选,我们使用微孔板读数仪来测量微生物的生长曲线,就像他在这里展示的那样。我们通常使用600纳米波长下的光密度值(OD600)来测量微生物的生长情况,它与微生物的生长密切相关。测量浊度非常简单,就是测量浊度,它是业内用于量化微生物生长的标准指标。
我们利用这些生长曲线,根据某些关键绩效指标(KPI)来比较和选择最佳原料。我们感兴趣的关键KPI包括生长速率、滞后期、最终细胞密度等等。Jerry正在努力实现从这些生长曲线中自动提取这些量化值,从而避免我们逐一分析,并最终获得良好的拟合效果。
这是我们在使用一些标准方法进行这项工作时遇到的最大挑战之一。你不一定总能得到非常理想的拟合结果,这取决于曲线的形状。遗憾的是,并非所有曲线都像我们演示中的曲线那样是完美的单相曲线。这就是为什么杰瑞一直有兴趣帮助我们完成这方面的工作。
总之,你现在看到的这条曲线,我会解释一下这些参数的含义。我们通常关注的关键绩效指标(KPI)包括滞后期。滞后期是指细胞在开始生长之前处于休眠状态的时间。理解这一点很重要。拐点时间是指细胞达到最大生长速率所需的时间。拐点处的斜率代表最大生长速率。这是我们通常测量的另一个重要参数。最终渐近线代表最终细胞密度或达到的细胞密度,这与所有微生物的生长方式有关。
在进行这些工作之前,我们实际上需要将原始数据处理成一种格式,以便创建这些曲线,从而方便我们进行比较,无论是通过视觉比较,还是像杰瑞在这里向我们展示的那样,对这些曲线进行量化。我们之前写过一篇论文,我在那篇论文中介绍了我们如何处理原始数据,以及如何使用JMP的一些实用工具来完成这项工作。
即使像我这样脚本编写新手,也能通过一些方法节省大量时间和精力。这些方法就叫做“JMP 插件构建器:自动化微生物生长表征”。一定要去看看。
杰瑞,我把话筒交还给你。我觉得我已经说得够多了。可能我已经说得比你多了。
那很完美。
谢谢你,杰瑞。
太好了,凯尔。谢谢你提供的背景信息。我建议你查阅一下凯尔作为第一作者发表的那篇论文,了解我们对这种格式的数据做了哪些预处理,比如把所有时间点都向上调整,让它们都从0开始,以及把数据截断在30小时,这个截断点是我们随意选择的。谢谢你,凯尔。
Kyle 和 Kerry 很贴心地提供了大约 330 条曲线供我们分析。我仔细查看并尝试用肉眼对这些曲线进行分类,看看它们是如何分组的。我把上面提到的所有曲线都称为“单相持续型”,它们持续上升并达到某个渐近值。而那些曲线上升到某个峰值后便开始衰减,有些衰减得很厉害,有些则不太厉害,有些数据还会出现一些波动,我把它们都归类为“单相衰减型”。虽然这些曲线的行为有些奇怪,但我还是把它们都归类为“单相衰减型”。
我把这些归类为双相生长曲线。所有曲线都包含一个生长阶段、一条渐近线,然后是另一个生长阶段。也许这种变化很细微,也许很明显,但这就是它们的特征。当然,这里还有一些没有生长的曲线。
我们来看看数据,看看能否从中了解一些信息,以及如何利用 FDE(功能数据浏览器)来帮助我们。FDE 是 JMP Pro 的一项功能。接下来我们要讨论的工具主要都是 JMP Pro 的工具。数据本身,这里有一列是测试编号,例如测试编号 1_1。这是测试时间。如果我们向下滚动到 30 小时,就会看到 OD600 列中的数据。我个人认为,第一个数据集没有增长。
情况就是这样。有测试 1_1,然后是 1_2,依此类推。这个数据集大约有 40,000 行,包含了大约 330 个不同的测试。
现在,这里还有一个名为“验证”的列。在 JMP Pro 中,您可以选择验证模型。在 FDE 中,“验证”的含义与 JMP 在其他平台上的含义略有不同。我们稍后会详细介绍。但我想快速向您展示如何设置此“验证”列。它位于“分析”、“预测建模”和“创建验证列”下。
首先,我们需要告诉 JMP,我们需要设置分组列。对于所有 1_1 数据,我们希望将其分组为训练集或验证集。我们不希望在同一个测试中同时包含训练集和验证集。我们可以将测试编号设置为分组列来实现这一点。然后,我还希望确保在训练集和验证集中,无生长曲线、单相死亡曲线、单相持续生长曲线和双相生长曲线的数量或百分比相等。这叫做分层。如果我把数据类型输入到分层设置中,就完成了所有需要做的。
然后我在这里进行指定。我选择将 60% 的运行结果用于训练集,剩余的 40% 用于验证集。然后我们只需运行“开始”,就能得到这一列,其中大约 60% 的试验结果用于训练,40% 用于验证。
现在,我要删除我刚刚创建的那一列。它会随机地将训练集和验证集分配给不同的运行,而我想确保我使用的运行与我在随附论文中展示的分析所使用的运行完全一致。我会删除我刚刚创建的那一列,但我就是这样得到这一列的。
现在我们准备进入功能数据探索模式。依次点击“分析”、“专业化”、“FDE”。接下来,我们需要向 JMP 说明不同列的含义。“测试编号”是 ID。“时间”是 X 变量。“OD”(细胞生长测量值)是 Y 输出。我将把“类型”作为补充变量保留下来。它不会在本次分析中使用,我会在后续步骤中再添加。现在我只是把它保留下来。然后,我在这里添加验证,最后点击“确定”。
这是“函数数据浏览器”窗口。顶部的图表只是所有曲线的叠加。如果我展开它,下方会显示所有单独的曲线。现在,在“函数数据浏览器”中,我们首先需要做的就是将函数拟合到每条数据曲线上。这在红色热点模型下方完成。然后,我们可以从以下不同的选项中进行选择:B样条、P样条、傅里叶变换和小波变换。
我打算用B样条函数。它们比较容易理解。不过,用P样条函数也完全可以。如果我这里的每个信号都有重复的特征,那么傅里叶基函数就适用。小波函数非常流行,而且越来越受欢迎,可以用来拟合这类数据,甚至是具有尖峰的频谱数据。小波函数在这方面表现出色。但我今天还是决定用B样条函数。
JMP 将执行两项操作。它会对所有数据进行排序,并为我选择两个参数。其中一个参数是阶数。阶数可以是阶跃函数,也可以是一系列分段函数:线性分段、二次分段或三次分段,这些分段函数用于将信号分解成样条曲线。
现在,样条曲线拟合在这些被称为节点的点之间。JMP 还会确定节点的数量和位置,以便更好地拟合下面的所有函数。在本例中,JMP 选择了一个 17 个节点的三次样条曲线拟合。您可以控制这些设置。如果您愿意,可以更改它。我打算尝试获得更好的拟合效果。我将使用 JMP 自动选择的这个设置。
JMP 会如何处理这些数据呢?首先,它会确定一条总体平均曲线。这条曲线是我们刚才看到的所有曲线的总体平均值。这些曲线是形状函数,也称为特征函数。想象一下,如果我们有一个系数,它乘以较高的形状函数 1,比如这个系数是 +2,然后我们再添加一个系数,它的值为 -1,乘以形状函数 2,再乘以形状函数 3,乘以 2/2,再乘以形状函数 4,乘以 5;我们将所有这些乘积(系数乘以每个函数)相加,然后加到平均函数上,我们就会得到一条曲线。
问题是,要重构每条曲线,每个函数前面的系数应该是什么?由于每条曲线都不同,因此会得到不同的系数,这些系数被称为函数主成分(FPC),分别记为1、2、3和4。在这种情况下,JMP提示:“需要四个函数主成分来描述每条曲线。”
这有点复杂,但关键在于这四个系数表征了这条曲线。我将结合这四个系数以及我们已掌握的三次样条拟合和样条分解中17个节点的信息。如果我知道所有这些信息,我就可以重构出曲线1是一条无增长曲线,而这是曲线2,这是曲线2_1。
如果您仔细观察——我们把画面放大一点——这里显示的是原始数据和拟合数据。原始数据用黑色表示,您可以看到一部分。希望您能看清楚。红色数据是拟合结果,也就是样条拟合。您可以看到,我们拟合这些曲线的效果非常好。
我们需要这些功能性主成分才能继续建模,所以我点击红色热点并选择“保存这些摘要”。这将创建一个新的数据表,其中每行对应一个测试。这是 1_1,测试编号 1_1。我将其识别为无增长,所以类型,记住,我们将它作为补充变量保留下来。这就是最终结果。在我看来,这是一条无增长曲线。它位于训练集中,而不是验证集中。以下是该测试的前四个主成分。
然后我们这里还有很多其他数据,比如每条曲线的均值、标准差和中位数。这些数据可能对我们有用,但今天我不想讨论它们。我打算把它们都删掉,只留下这四个数据。
我为每个测试都准备了一份这样的表格,并且我已经凭肉眼对每份表格进行了评估。然后这里还有一列写着“训练”。如果我往下翻,大概在某个地方,你看,那里还有一堆验证行。
现在的问题是,“我能否利用我们刚刚确定的这些FPC值建立一个模型来预测类型?” 如果可以,那就太好了。我们只需要知道对于一条新的曲线,“它的FPC值是多少?” 我们可以把它们代入这个神奇的公式,最终就能预测出曲线的类型。
因为我们使用的是 JMP Pro,并且使用了 FDE,所以我们可以访问 JMP Pro,进行模型筛选。这里,我们的 Y 响应变量是类型。我想知道我是否可以预测类型。我想在这里使用验证。我们来看看。我想使用 FPC 作为 X 输入。借助模型筛选工具,JMP Pro 将运行所有这些不同的模型,并将它们进行比较,以确定哪个模型的预测效果最佳。
现在,我要添加一些参数……有些模型允许双向交互作用和二次项,所以我把它们也加进去。我还要在这里设置一个随机种子,2、3、4、5,这样结果才能和论文里的结果一致。通常情况下,我不会设置这个。我会让 JMP 自动生成一个任意的种子。好了。
现在,JMP 会依次运行这些模型并进行比较。这里快速展示一下所有运行模型的比较结果,并按均方根误差 (RMSE) 排序。RMSE 最低的是一个神经增强模型,巧合的是,它也是一个 JMP Pro 模型。决策树和名义逻辑模型等都是 JMP 的标准模型,但神经增强树模型表现良好。它还显示该模型的误分类率为 5%,这是所有模型中最好的。我们稍后会详细讨论这一点。
我现在要运行一下这个神经增强模型,看看结果如何。结果如下。我们之前讨论过混淆矩阵。左边是训练数据,右边是验证数据。我们先来看验证数据。
当我明确指出某个试验是双相生长时,神经增强模型预测了八次双相生长,还预测了一次单相持续生长。总共九次试验中,我猜错了一次。这就是我们在混淆矩阵中看到的情况。你可以看到,理想情况下,所有数字都应该位于主对角线上。目前有一些数字的位置还不理想。模型并不完美,但已经相当不错了。我们的成功率达到了95%。
如果您更想看分数而不是计数,那么这张表就是分数形式的。然后,您可能熟悉接收者操作特征曲线(ROC曲线)。很有意思,但我们确实会犯一些错误。现在,这些错误……请允许我稍等片刻。我需要获取这些数字,这样我才能知道该和您讨论哪些错误。
如果我回顾一下,这里有……嗯,我预测的是单相死亡,但我的算法,我的神经增强算法,三次预测为双相死亡。它一共预测对了39次,只有3次预测为双相死亡。我们来看看这三次试验的结果。
如果我回到我的主数据集,这里有一个脚本可以打开图形生成器。这里显示了我所有的曲线,它们都叠加在一起了。我想要的是这三条曲线:124_2、144_2 和 176_2。最初我目测这三条曲线时,我认为它们是单相的。它们只有一个峰值,然后就逐渐下降。下降的幅度不大,但我还是把它们描述为单相下降。
程序提示:“不,这三条曲线是双相生长曲线。” 我们仔细看看。这条绿色的曲线出现了,果然,它这里有个小小的波动。我肉眼没注意到,但JMP程序说:“嘿,我觉得这是一条双相生长曲线。” 这重要吗?我不知道。这得由Kyle公司的人来告诉我们。但它确实识别出了这条曲线,并说:“不,我觉得这是一条双相生长曲线。”
如果你一直往后看这两条曲线,似乎一开始就有一些增长,然后趋于平稳,之后又出现了一条更大的增长曲线。也许它们是双相生长曲线。也许JMP的分析结果比我肉眼判断的要好。
这是另一条曲线。这是编号为 60_2 的曲线。它在哪儿?就在这儿。我说过,这条曲线是单相衰减的。果然,它先上升,然后又回到这里。它开始增长,然后就停止了。我相信你们已经注意到,这条曲线非常陡峭,几乎达到了仪器的分辨率。总之,我们现在的测量范围非常小。这条曲线实际上根本没有开始增长。所以 JMP 的分析结果是:“不,这是一条无增长曲线。” 这很不错。它漏掉了这条曲线,但漏掉的原因是它太小了,不切实际。我认为这些结果很有意思。
我们现在有了一个模型。你看,我可以关闭图表构建器了。我们有了一个模型,这个神经增强模型,它能让我们查看误分类率。但是当我们有新数据时该怎么办呢?我之前没跟你们说的是,在原始数据集的第 190 行——好了,找到了——191 行,我本来想把它隐藏并排除,不过没关系,它本来就是排除的数据。
假设 191_2 运行中的这些数据是新数据。这些数据没有包含在之前的运行或分析中。我将选择“匹配单元格”,然后清除它。好了。现在我想重复这个过程。就算法而言,这现在是新数据。无论如何,它都是单相的,肉眼可见。看看 JMP 会如何处理它。我该如何操作呢?我将重复相同的步骤。
我需要注意的一点是,必须确保所有训练数据行都保留在这里,就像最初那样,因为我要进行专门的建模 FDE。我点击这里“调用”。设置里的所有东西都一样。我点击“确定”,然后进行同样的 B 样条拟合。这样做之后,我在这里得到了完全相同的结果,所以拟合仅基于训练运行。
现在,我需要从中提取这些功能性摘要,也就是功能主成分(FPC)。我需要的就是这个……它在哪儿?哦,它在下面。191_2。我需要这些功能性主成分。如果我知道它们,就可以把它们代入神经网络公式,得到预测结果。与其尝试复制粘贴什么的,我还是直接保存摘要吧。
然后我向下滚动到最底部的 191_2 行,就是这一行,我要提取这四个数字。这些是新试验的功能主成分。我复制它们,Ctrl+C。哦,让我看看,我好像忘了做一件事。我漏掉了一个步骤。建立这个模型之后,我们还需要保存它。我把公式保存回数据表。现在,在数据表里,不管它保存到哪里了,现在多了很多列。
这就是我们最初的样子,四个FPC,现在右边多了这些列。它们包含神经网络公式。每一列都是一个小计算器,然后在这里汇总,分组计算出每种曲线类型的概率。最后,最有可能的类型就是你最终得到的结果。
我只需要把 191_2 的这些数字复制下来,然后回到这个数据集。滚动到最底部。这就是 191_2。这是一个新的数据集,所以我通常不知道它是什么。我只需要把这些数字粘贴到这里,JMP 就会计算所有这些不同的列,进行评估,最终得出结论:这是一个单相死亡数据集,而事实也的确如此。这是我凭肉眼判断的。你可以根据需要获取任意数量的新数据集,得到函数主成分,然后把它们放在这里,就完成了。
让我们回到期刊,总结一下。我们的结论是:函数数据浏览器 (Functional Data Explorer) 结合 JMP Pro 中的其他建模工具,可以用来表征曲线。我目前达到了 95% 的准确率,但我们还可以采取一些措施来进一步提高准确率。由此产生的建模过程可以用于预测这些新的曲线类型,从而节省时间并避免错误,所有步骤都在随附的论文中进行了详细说明。
可能的模型……不,抱歉,我有几张幻灯片顺序弄错了。关于未来工作的建议是,预先筛选数据,排除无增长的情况。如果 OD600 值不超过某个阈值 0.05,那么显然就没有增长。我们会直接剔除这些数据,完全不需要考虑。
尝试使用不同类型的样条曲线、不同的复杂度、不同的节点数量,然后编写脚本来自动执行所有这些步骤。我们完全可以做到这一点,而且可以大大提高速度。
现在,有了这些曲线之后,如果你得到的是单相持续增长曲线,就像我们展示的第一条曲线一样,你可以在 JMP 中使用拟合曲线平台进行处理。你会得到这样的方程,然后从中提取出 A、B 和 C 参数的滞后时间、最大增长率和渐近线。
如果你的生长曲线是双相生长曲线,你可以这样做。实际上,它是两条单相生长曲线叠加而成的。你可以使用 JMP 的非线性平台来解决这个问题。就像我之前说的,如果生长曲线没有变化,你只需要设定一个限制条件。如果在整个生长过程中,OD600 值始终小于 0.05,那么就判定为没有生长。
对于单相衰减,我想有几种不同的方法可以实现。我采用的一种方法是,将原始的单相衰减曲线(趋近于渐近线)乘以一个随时间递减的线性函数。这样就能得到一个斜率。然后,让非线性求解器求解 M 以及 A、B 和 C。
我们的节目到此结束。正如我所说,我们会提供一个包含所有步骤的PDF文件。希望它对您有所帮助。非常感谢我的搭档Kyle。我们下次再见。保持JMPy精神!