我叫本·理查森。今天,我很高兴能介绍 UPSIDE Foods 公司在 JSL 中开展的一些工作,这些工作旨在实现人造肉生物过程数据分析的自动化。首先,我想特别感谢 Megan 和 Julia 做出的杰出贡献,尤其是我所代表的 UPSIDE Foods 公司。右侧展示的是我们的部分产品。
首先,我将简要介绍一下我们将要讨论的内容。首先,我会做一些背景介绍,以防有些人不熟悉什么是“培养肉”以及什么是“细胞培养基”。这正是我所在的部门,这对我们来说非常重要,因为它能帮助我们了解为什么 JMP 是一个如此强大的工具。
我还将介绍我们的 JSL 脚本如何加速 UPSIDE Foods 的生物工艺开发。然后我将进行脚本演示,展示我们开发的该工具的一些功能,例如实时访问关键仪器数据、一些数据可视化工具以及趋势分析,甚至还有一些很酷的附加功能,例如使用 Tabulate 等函数的面向操作员的工具。
最后一部分,我将介绍如何在 JMP 中自动执行一些高级计算的入门指南。为此,我将重点关注一个案例研究。在生物加工过程中,自身葡萄糖消耗是一个非常重要的参数。众所周知,它也是一个很难计算的参数。
我将讨论我们为了分解这种高级计算所做的四项工作。第一项是标准化样本命名。这是我们方法中非常关键和基础的部分。此外,我们如何使用开放数据库连接实际访问数据,如何自动清理、排序和组织数据,以及最后,我们如何使用一些关键函数实际创建公式列。
让我们深入了解一下背景。什么是培养肉?什么是 UPSIDE Foods?UPSIDE Foods 是第一家在培养肉领域成立的公司,成立于 2015 年。自那以后,它一直是该领域的领导者,并于 2022 年获得了美国农业部 (USDA) 和美国食品药品监督管理局 (FDA) 的监管批准。
我们的做法是提取动物细胞。这不是植物肉,而是动物肉,然后我们分离细胞。这是无屠宰的。你不需要杀死动物就能做到这一点。然后,我们在细胞培养基中从这些分离物中培育细胞系。再说一次,这就是我一直生活的地方。
细胞和细胞培养基在生物反应器中混合。这和酿造啤酒非常相似,用酵母来培养细胞。我们将在生物反应器中培养这些动物细胞,然后将其制成供人类食用的产品。真正令人兴奋的是,生物加工可以提高肉类生产效率,降低消费者成本,并减少对环境的负面影响。这是我真正感到兴奋的事情。它不仅能减少土地和水资源的使用,甚至温室气体的排放,还能减少对动物的虐待。
为什么细胞培养基如此重要?我接下来要讨论的领域是细胞食物,也是我们想要讨论的东西。你可以在角落里看到一些溶液。那些是一些有趣的颜色,实际上主要来自维生素,它们创造了这些颜色。细胞培养基非常重要,因为它为细胞提供体外生长所需的营养物质和周围环境。
细胞培养基其实没什么特别的。它只是一些我们喂鸡或牛,甚至自己吃的常见食物成分的小块,比如氨基酸、糖、维生素和矿物质。为了加速低成本培养基的开发,尤其是为了实现商品规模定价,UPSIDE Foods 已将我们的细胞培养基生产垂直整合。这意味着我们从零开始,使用食品级成分开发了专有的内部培养基配方。
如果您熟悉细胞培养基或生物工艺,那么从头开始设计培养基配方绝非易事。这正是 JMP 统计软件的用武之地。举个例子来说明这有多难,如果我们对一个包含 50 种培养基成分的实验设计进行析因分析,这实际上是一个保守估计。很多培养基的成分可能超过 100 种。如果我们分别取低、中、高浓度,设计空间是 3 的 50 次方,即 7.17 乘以 10 的 23 次方。这比一摩尔还大,即 6.02 乘以 10 的 23 次方,几乎是无限的。我们无法测试所有这些条件。
这正是实验设计的意义所在。DOE 是一种应用统计学方法,它能让你更有效地探索设计空间,尤其是针对一次一个因素或 OFAT 方法。以下是 JMP 提供的一些示例。如果我们观察三个不同的变量,并将它们可视化到三维空间中,我们得到了变量一、变量二和变量三。
传统的方法是一次只优化一个因素,我们会先优化变量一,找到最佳条件,然后优化变量二,找到最佳条件,最后优化变量三。最终我们会找到一个局部最大值。如果实际的最佳条件就在某个地方,而我们错过了怎么办?首先,我们会花费更多的时间和精力,但可能还是找不到最佳条件。
JMP 之所以如此强大,并且对我们的方法如此重要,是因为 JMP 拥有业界领先的 DOE 软件。它堪称细胞培养基开发和生物工艺开发的黄金标准。JMP 已被 UPSIDE Foods 的各个生物工艺开发流程团队广泛采用。对于某些脚本的编写和查看来说,JMP 是一个自然而然的工具。
让我们来谈谈这个脚本是如何加速 UPSIDE Foods 的生物工艺开发的。我这里有一个示意图,将生物工艺开发流程的各个部分分开,从细胞系开发等上游活动一直到制造科学和技术以及实际生产。我一直在谈论培养基开发。我们生活在这里,但工艺开发也有很多重叠之处。
我想指出的是,贯穿整个开发流程的动态反馈循环,对于推动科学创新和突破至关重要。基本上,你可能会获得一个更好的细胞系,然后进入培养基开发阶段。这使我们能够在一些限制性营养物质和这之间的迭代循环上取得突破,而这正是激动人心的科学突破真正发生的地方。
我刚才谈到了实验设计(DOE)如何让我们更有效地探索设计空间。你可能觉得我们的实验规模越来越小了。实际上,因为我们尝试从头开始设计介质,所以我们的实验规模仍然很大。即使我们更有效地测试了设计空间,我们仍然需要研究这个荒谬的设计空间。
为了真正从零开始构建这些介质,我们拥有大量的样本,有时还需要进行实验,超过100种条件。您可以看到我的同事Dasha在那里打印标签的照片。这只是一个例证,说明了我们在这里处理的样本数量,以及这实际上如何在团队之间造成了瓶颈。
为了进一步说明这一点,我列举了公司每年进行的一些细胞计数数据,这些数据相当惊人。UPSIDE Foods 的培养基团队每年进行超过 4 万次细胞计数。当然,随着流程的推进,这种情况肯定会发生变化。随着规模越来越大,容器和自由度也会越来越小。您可以看到,我们下面的 PD 部门实际上每年仍然运行大约 7,000 或 8,000 个样本。
我们正在努力处理海量数据,并且正以闪电般的速度努力获取这些数据。我们开发了这个 JSL 脚本,以减少常规生物过程数据处理的平均时间,更快地传播信息,将信息传递到其他团队手中,并加速反馈循环。我们真正做到的是将常规数据处理时间从大约一周缩短到大约两天,这大约是之前的三倍,这非常令人兴奋。
现在我将进行一些脚本演示,展示一下这个工具的一些功能。这是脚本。它相当大,随着时间的推移,它肯定也变大了。这里面有很多代码。在这次简短的演讲中,我没有时间讲解所有这些。我要做的是演示一些功能。如果我运行这个脚本,首先会出现一个小警告窗口,提示你将关闭一些可能已经打开的其他窗口。我同意这一点。
我这里举个例子,可能是5109,这是我们的一个实验。这是真实数据。脚本的作用是运行我们开放的数据库连接,并将数据导入JMP。这加快了流程,而且我们可以定期进行。我们可以根据需要进行操作。实验进行时,数据会定期上传到数据库,我们可以实时提取并查看图表。您可以看到不同的仪器正在填充数据。它正在为我们生成一些数据表。然后它会询问我是否要添加条件键。
条件键是我一会儿要讲解并打开的东西。我们要做的是选择“是”,这样我就可以展示一些功能。它还会询问我是否要添加与仪器无关的其他数据。这是您可能想要添加的额外元数据,这里的例子是pack_cell_volume。这实际上是指任何未由仪器运行并自动上传到数据库的数据。我们再次选择“是”,这样我就可以展示一些功能。然后,脚本将为我们构建一个数据表。我们已经构建好了一张漂亮的数据表。
在开始之前,我先打开一个规范化脚本。这是我写的一个小脚本,用来规范化数据。它会把所有数字从零缩放到一,这样我就可以自由地讨论它,无需担心知识产权问题。我接下来要做的就是把这个脚本拿出来,和我的数据表一起运行,看看会发生什么。
那里的处理时间刚刚缩放。现在,我们的最大值是 1,其他一切都与此相关。我不需要展示这里可能隐藏的所有重要数据。我只需向您展示一些功能即可。
回到条件代码。我先来解释一下它的工作原理。基本上,我们有数值条件,202、203、204。然后,我们实际更改的所有变量都通过这个条件键与这些条件关联。我们将把所有这些信息放在这里,因为我们需要一个标准化的样本命名系统。稍后我会详细介绍。这只是说明我们如何将信息与此关联起来。
我们有一个很棒的大数据表。您可以看到,这里有 1,206 个样本测量数据。我们包含了所有参数、所有计算数据、最大乳酸值、特定乳酸生成值、倍增时间以及其他一些有趣的数据。我们把所有数据都集中到了一个好地方。接下来我想重点介绍的是一些我们保存在左上角的脚本。
例如,我们有这个图表生成器。这个图表生成器很棒,因为它自动包含一个列切换器,可以把我们所有的参数和条件都绘制成图表。我们可以快速地看到,哦,202 随着时间的推移而下降。这不太好。209。因为我们添加了那个条件键,所以我们基本上可以说,好吧,我不想看 201 和 202。我想看的是条件。
假设这些是一些不同的情况。JMP 和图形生成器的另一个优点是,我可以快速地说,好吧,我想看看变量 1 的表现。我们可以把变量 1 放在这里,然后看看,哦,好吧,所有的控制都不太好。我们这里有一些不同的策略可能有效。同样,我们可以把变量 2 拖到这里,以一种非常用户友好的方式与数据交互。了解发生了什么。
我们可以观察乳酸。我们可以观察一下倍增时间之类的数据。为了加快速度,我们可以做的就是快速地与数据交互,感受数据,并准备好向公司内部其他人展示。假设我还想了解变量2。我可以做的就是把它放在叠加层上,就能得到一个大概的数据。倍增时间在增加。这很合理。策略1,就是保持较低的倍增时间。这正是我们想要的。这就是图形生成器的部分,非常令人兴奋。
我们还有很多其他功能。在进入下一部分之前,我会快速展示其中几个。其中之一是循环分析。基本上,我点击它,它会读出我们拥有的所有不同批次、段落编号,并创建一个复选框。
我们要做的是选择所有这些,因为 n - 1 和 n - 2 是按比例放大的。我其实不想把它们包含在这次分析中。我只需要选择我想要的,然后点击“确定”。它会弹出一些二元拟合曲线,然后我们就能得到这些趋势。你可以看到,它实际上会量化这里发生的事情,并为我们获取数据,查看这些趋势分析,并将它们直接添加到我们的表格中,所有这些都是通过脚本自动完成的。我们不需要手动操作。这加快了我们获取数据的速度。
您可以看到这是趋势分析。现在我们有了一张图表,显示斜率是多少?这些曲线随时间的变化情况如何?同样,我们可以直接取出变量并查看。我们实际上会在这里给它添加颜色。您可以再次看到,与数据交互和分析数据的方法非常简单。
我要展示的最后一个功能是一些面向操作员的工具。例如,如果我们想要接收并执行一些操作,比如说,一个反馈或广告,而操作员突然想知道,今天我应该做些什么来维护这些反应堆?我们可以做的就是说,好吧,我们花一天时间。
例如,我们可能想在 2019 年 8 月 24 日执行此操作。这是一个日期。我要做的是实际运行此脚本。我们会说 24/08,那是什么?也许是 2019 年。我们会说,也许我们正在操作一个小型反应器。我们的工作体积可能为 225 毫升,也许假设我们供给 2%。我们只需点击“确定”,它就会为我们构建一个表格,告诉我们每个反应器需要供给多少,以及它们是否需要特定的回流。
在这种情况下,基本上所有物质都需要谷氨酰胺和葡萄糖,但你可以想象一下,如果当天所有物质的浓度都低于广告回复的阈值,你可能会得到一些“拒绝”。你可以快速了解一下需要采取哪些措施来干预这些反应堆。这就是脚本的概要。我将结束其中一些内容,然后回到演示。
让我们稍微了解一下如何做到这一点,特别是如果您是初学者,如果您刚刚开始使用 JMP。我们该怎么做呢?让我们从案例研究开始,这个众所周知的计算难题,即自我特定的消耗。我将介绍四个步骤:开发标准化的样本命名系统,建立与数据的连接,自动组织、清理和排序数据,最后,我们将创建一个公式列来计算这个参数。
让我们开始吧。首先,为了阐述我们讨论的论点或任务,我们需要做一些基础的学习。我先来做个小讲座,讲一下什么是细胞特异性消耗,以及为什么它这么难计算。你可以把细胞特异性消耗想象成细胞的马力。每个细胞都需要消耗一定量的营养物质,我们可以把它想象成每天,也就是单位时间内的能量。
因此,我们的消耗量 Q 等于 Delta C 除以 Delta iVCD。您可以看到,这是活细胞密度。这基本上就是细胞计数。这是我们在生物加工过程中非常重要的工作。同样,我们可以测量溶液中营养物质的含量。这些是典型的曲线,可能是补料分批生物工艺的一个很好的例子。我们要做的是观察两个时间点,一个是我们感兴趣的时间点,另一个是前一个时间点,以便定义这个参数。
它们之间有一段时间间隔。你可以用这里的温差 (Delta T) 来体现。为什么曲线下面积很重要?我说的是 iVCD 而不是 VCD。我指的是活细胞密度图,但我们真正感兴趣的是它的积分。积分之所以重要,是因为在这个培养周期(可能持续四天)开始时存活的细胞,其消耗的食物量大约是此时分裂的子细胞的四倍,而子细胞在被收获之前只存在了一天。
我们能做的就是近似计算。我们可以用一些经验数学和梯形法则来计算。这是分母中的部分。我们还需要改变浓度,但这比表面上看起来要复杂一些。
由于我们想要计算细胞消耗引起的浓度变化,因此需要减去摄入的量。我们通常不测量这个值,因为我们知道添加了什么。我们通常没有一个测量数据点来显示它是如何上升和下降的,但为了确保消耗率的准确性,我们需要将其考虑在内。
它们吃的量是固定的,但第二天我们重新测量时,它们消耗的不仅仅是这里的增量,还有这里的增量量。这意味着我们必须减去这个额外的点。最终得到的是一个复杂的公式,其中有很多参数彼此之间有条件地相关。这就是问题的关键所在,也是导致某些计算难以自动化的原因。
无论如何,我还是要讲讲我们是怎么做的。首先是开发一个标准化的样本命名。这实际上是我们这里采用的自动化策略的基础。我将使用一个示例字符串,并分解其中的一些部分。每个部分都是一个重要的处理工具,可以帮助我们实现自动化,并帮助我们处理数据,例如自动清理、排序和计算。
例如,我们有一个组ID。我们有日期代码、实验编号,以及一些下划线来分隔各个部分,使其更具视觉吸引力。我们这里有一个批次或周期、一个重复句柄以及一个条件或反应器代码。这一长串可能看起来有点吓人,但它们通常是连续的数字。
尤其如果你觉得这会让一些操作员感到沮丧,通常他们每天只需输入一次,然后你就可以在很多分析仪器上使用自动计数功能,只需点击列表并填充即可。一旦你真正尝试自动化和自动计算这些参数,它就能带来真正的回报。
我建议采用这种方法,先确定你的团队使用什么工具来操作和显示数据,然后整合并整理所需的最少部分。你真的希望这个过程尽可能简单。有些东西是你刚好需要的,并且与这个或那个实验无关,或者与你真正需要操作这些数据的东西无关。
您以后可以随时添加其他功能。例如,我们这里有一些可选功能,例如仪器误差替换,您可以将其附加在末尾。例如,您可以进行有意的重新采样,就像我之前提到的那个反馈一样。如果我们确实想测量它并检查它是否符合我们的预期,也可以这样做。您还可以内置其他一些花哨的功能,但您需要为默认分析制定一个非常严格的命名方案,以便获得认可并让每个人都开始使用。
第二步是什么?你需要访问这些数据。我们的做法是使用开放的数据库连接。我们这里就有一个 JMP 软件,我们会尝试将数据导入其中。我们与数据和 IT 团队合作设置了仪器,以便它们在运行后立即导出 CSV 文件。然后,这些数据会被上传到我们的数据库。你可以看到,细胞计数和化学分析数据都会上传到这个数据库。
ODBC 是连接。它负责将数据库连接到 JMP 程序。它是一个应用程序编程接口 (API),使用 SQL 或结构化查询语言。您在演示中看到,您也可以直接将元数据添加到应用程序或 JMP 中,或者也可以通过数据库提供元数据。这两种方式都可以。
你实际上是怎么做到的?JMP 中实际上有一个 SQL 查询功能。你可以手动浏览,这里有一个漂亮的用户界面,你可以在其中选择这些查询。一旦你设置好了开放的数据库连接,你就可以构建查询,并且可以将它与一个非常酷的功能结合起来,这个功能叫做“工作流生成器”,我想介绍一下,它会跟踪你正在执行的所有步骤,并为此构建 JSL 代码。
现在,当你编写一些更高级的脚本时,你可能需要修改这个脚手架。它的作用是展示语法示例,并加快编码速度,尤其是对于初学者,对于那些没有接受过传统计算机科学训练的人来说。这是一个非常强大的工具,我希望确保大家能够意识到这一点。
这段代码展示了实际代码的样子。我们建立了一个连接。在本例中,我们将使用该用户界面添加一个 ELN。这些是我们之后需要添加的一些额外功能。它为您提供了一个开始工作、测试和迭代的起点。
好的,第三步。我们需要清理和整理数据。这是一个重要的步骤,因为很多时候,人们在计算具体的血糖摄入量时,会把数据导入到Excel表格中。他们手动移动、整理、删除数据,并引用不同的单元格。自动清理和合并数据对于确保我们获得准确的结果至关重要。
我要讨论的前两个方面是“连接和排序”操作。在用户界面中,这些操作位于“表格”选项卡下,同样可以与“工作流构建器”结合使用。这是一个连接函数的示例,我们将化学分析物和细胞计数数据合并在一起。接下来,我们需要根据参数对它们进行排序,以便所有数据都井然有序,并符合函数的预期顺序。
最后,我们可以进行各种清理。这需要更多精力,但使用逻辑表达式可以相当轻松地完成。我这里使用的示例基本上是从仪器错误中删除重复行。这就是我之前提到的 Underscore R 参数。
我们在这里所做的是仔细检查并标记哪些是重复的,哪些不是。然后,我们基本上会提取、隐藏和排除所有非最新样本。同样,这些脚本内置了大量的清理功能,让您的数据真正接近准备就绪,为黄金时段做好准备。
好了,让我们进入最后一部分。我们实际上如何构建一个包含关键函数的列来计算这个参数?我们已经得到了一个疯狂的公式。它相当残酷。第一步是使用类似 if 和 is missing 之类的函数,让计算依赖于可用的参数。
在这个示例窗口中,我们可以说,对于其中一些,我们确实添加了葡萄糖。这就是我们之前讨论的进料参数。对于其中一些,我们没有。我们需要一种方法来建立一个方程,如果这个值存在,就计算它,包括它。如果不存在,就不计算。这就是我们使用 if 和 is missing 函数来实现的。
我们还有一个问题。现在,我们需要的计算值出现在不同的行中。列式格式虽然在数据管理方面有其优势,但引用同一行之外的内容却更加困难。公式的构建方式更多是参考同一行的内容。我们可以利用一个非常强大的函数,也就是我在这里要提到的滞后函数。
当您的数据经过适当的排序和组织后,即使不在同一行,也能实现非常准确的数据引用。这里有我们的 T 值 C,以及 T 值减 1 的 C,我们可以使用滞后函数进行引用。代码如下所示。我们将生成一个新列。我们将创建一个公式。我们将使用 if 语句来检查它们是否基本相同。我们不会比较两个不同的批次。我们只在同一个批次中使用这个唯一的 ID 句柄。我们将检查广告是否正在发生,然后执行计算。iVCD,即另一个数据块,位于另一列,但其工作原理非常相似。
我现在要做的是切换回 JMP 并演示实际操作。好了。现在我有了另一个标准化数据集。您可以看到,这里有一些样本,有各自的唯一 ID,有一些葡萄糖值,还有一些广告反馈。其中一些正在发生。在某些情况下,它们是不同的值,而且它们的间隔并不均匀。我们需要一个足够智能的软件来计算这些值,并且每次都能正确执行。
我们要做的是运行我在底部展示的脚本。我们将运行这个脚本来创建一个新列,用于计算具体的葡萄糖消耗量,然后我们只需移动选定的列,这样我们就可以直接看到它,而不必滚动屏幕。我将在这里截取并运行这段脚本的片段。
我必须运行整个程序,而不仅仅是突出显示的部分。运行后,我们可以看到这里弹出了一个新列,并且正在获取计算结果。它按照我们想要的方式对计算进行拆分,并且我们得到了按我们想要的方式缩放的精确值。
如果我们看一下公式,就会发现我们已经构建了一个公式。它通过条件逻辑,最终得到我们想要的计算结果。我们可以在这里预览数据,查看各个部分,了解它们如何叠加,并进行故障排除。这就是我们实现先进、精确的自动化计算的方式。
好的。演讲到此结束。我只想在这里快速结束一下,感谢大家的支持。UPSIDE Foods 全体员工都参与了这项活动,尤其是 Megan 和 Julia。以下是我在举办“顶级厨师”比赛时的一些队友、整个公司、我们的生产设施以及我们的一些产品。
特别感谢我们的IT和数据团队,他们为我完成了一些关于开放数据库连接的繁重工作,并帮助我排除系统故障。还要感谢我的经理Cameron,他最初向我介绍了JMP,并向我展示了这款工具的强大功能。谢谢大家,我的演讲就此结束。