细胞培养在生物制品的生产中起着至关重要的作用。在实验设计(DOE)中引入工艺变更时,由于细胞培养过程涉及多个相互依存的生长和生产阶段,而工艺变更可能只影响其中一部分阶段,因此准确模拟细胞培养过程的行为极具挑战性。传统的参数化非线性模型难以有效捕捉这种复杂性,而单独的非参数模型则可能存在脱节,且难以与DOE参数关联。
为了解决这个问题,功能性实验设计(DOE)将复杂性简化为主要成分,并将变化与DOE参数关联起来。这种方法能够创建预测分析器,该分析器可以利用小规模数据优化细胞培养参数,并利用这些优化结果预测大规模生产过程中的行为。整个过程可以在JMP Pro的功能性数据探索平台中完成,从而为优化细胞培养过程提供一种更高效的方法。
今天,我将介绍一个利用功能性实验设计(DOE)来模拟复杂非线性细胞培养过程的案例。首先,我会介绍我们试图模拟的细胞培养过程,即连续生产过程。我会阐述该建模的两个目标:一是维持稳态,二是尝试基于小规模数据预测大规模行为。
然后我将介绍非参数样条,这是我所做建模的基础函数,以及函数数据浏览器的简介,该平台在本例中使用样条和主成分进行建模。
我将详细介绍我针对这两个目标提出的两种不同方案,以及几种不同类型的样条拟合方法,并探讨如何将实验设计条件纳入考虑。最后,我将介绍如何生成一些联合剖面图,并对研究结果进行总结和讨论,以及我遇到的任何挑战。
我们正在尝试模拟的目标就是连续生产。生物制剂领域的标准做法是分批生产。分批生产是指培养细胞,使其产量最大化,然后细胞会在某个阶段代谢耗竭并进入死亡期。之后,你需要收集生物反应器中的所有物质,包括死亡的细胞以及目标药物或分子,并根据需要进行后续处理。
我们正在研究的,也是业内很多人正在研究的,是与其发展、衰落、生产一次性产品,我们能否更像其他行业,比如汽车行业之类的,持续不断地生产产品?
为了实现这个目标,我们当然希望细胞能够生长,但同时也要让它们保持在生长曲线的第5阶段(稳定期),并防止它们进入第6阶段(死亡期)。为此,我们可能需要一个较小的生物反应器,但需要不断地添加含有新鲜营养物质的培养基,同时移除等量的液体。理论上,这些液体中应该含有我们想要生产的药物。我们的目标是保持稳定的培养基供应,并希望能够从中渗透出我们想要生产的分子。
除了努力维持稳定的产量之外,我们的第二个目标是希望能够根据小规模试验的结果来预测大规模生产的情况。因为在小规模生产中,我们可以运行许多不同的反应堆,引入不同的条件,但由于物流、时间和资金的限制,我们在大规模生产中无法做到这一点。我们希望能够预测从小规模到大规模生产的结果,并且还能了解添加不同的因素和条件会对大规模生产产生怎样的影响。
另一个有趣的地方在于生产环节,由于生产过程分为不同的阶段,因此需要在不同的时间点引入不同的条件。例如,增长阶段可能始终采用相同的控制条件,甚至可能与大规模生产的控制条件相同;但之后,就需要加入不同的实验设计(DOE)因素,这些因素都与时间有关。接下来,我们将详细介绍如何使用功能数据浏览器(Functional Data Explorer)来实现这一点。
首先我要介绍一下样条函数。这是我们建模的基础。最初,我们想尝试一些参数化建模,这或许适用于某些阶段。比如,我们或许可以用逻辑指数函数来模拟增长阶段。但是,当我们加入规模效应和不同阶段引入的实验设计(DOE)时,我们发现无法完全捕捉到这些影响,因为有些产品可能会增长后衰落,有些产品可能会增长后保持稳定。我们找到的参数化模型无法真正捕捉到这些变化。
我们想使用更灵活的方法,这里我们选择了样条函数。样条函数的本质是在数据点之间拟合一个简化的函数。拟合样条函数时,需要做出一些选择。首先,你想设置多少个节点?一般来说,节点越多,模型就越能拟合数据,但这可能有利也可能有害,甚至可能导致过拟合。其次,你还需要考虑拟合的程度。在每个节点之间,你希望得到一条直线?还是希望它有一定的曲率?或者仅仅是一个阶跃函数?
然后,对于某些类型的样条曲线(例如函数数据浏览器生成的 P 样条曲线),您可以添加平滑函数。在每个节点处,您将对每条样条曲线之间进行平滑处理,这样,如果您使用的是线性样条曲线,就会得到一些快速且不连续的线条。
在函数数据浏览器中,您有两种样条函数选项:B 样条和 P 样条。函数数据浏览器中还有其他选项,例如波函数,但这些选项在本例中未必适用。一般来说,我发现 P 样条(一种更简单的回归样条)通常适用于模拟平滑函数。P 样条更适合处理那些噪声较大的波动函数,因为它能平滑掉一些噪声。这只是一个概括性的说法。当然,P 样条也存在过拟合的情况,B 样条也存在欠拟合的情况,但这些只是一般的经验法则。
在这种情况下,我们使用的平台是 Functional Data Explorer。我有一些平台实际界面的图片。通常,函数数据是指在连续域内记录的数据。在本例中,这个连续域指的是时间,因为批次是随时间推移产生的。它也可以用于其他用途。例如,我见过它用于光谱数据。接下来,你需要识别一组测量值。在本例中,这些测量值指的是不同的批次,因此每个批次都会有单独的拟合结果。
另一个我稍后会详细介绍的亮点是,你可以添加这些补充因素。这些可以是你的实验设计因素,也就是那些可能改变你想要捕捉的形状的因素。稍后我会详细讲解它的工作原理。
起初,我不确定哪种样条曲线最好,因为我没有找到明确的标准。我最初尝试了两种方法进行建模。在函数式数据浏览器 (Functional Data Explorer) 中建模时,有很多方法可以找到最优模型。在这个例子中,我使用了 BIC 最小化。你也可以使用交叉验证之类的方法。由于我引入了这些补充因素,因此很难定义测试数据集和训练数据集。所以,我们最终选择了 BIC 最小化。
这里展示了两种不同样条曲线的拟合结果。这条红线是它们各自的平均拟合曲线。可以看出,它们非常相似,但实现方式不同。B样条曲线建议使用较少的节点数(本例中为13个),并且建议使用三次函数,因此会添加一些我们在这里看到的曲率。
P样条函数建议每天设置一个节点。总共有30天,但每天之间有29个节点。然后它在每个节点处进行平滑处理,因此既能使用线性拟合,又能通过引入平滑处理来获得所需的曲率。我们可以看到,它们在开始时非常相似。在最后阶段可能存在一些差异,因为我们可能遗漏了一些批次的数据。
接下来,我们将逐个分析拟合结果,看看最终结果出现差异的原因是什么。这里展示的是同一组批次中每个批次的实际样条拟合结果。同样,我们发现了与均值函数类似的情况:初始阶段和中间阶段的拟合结果非常相似,但在B样条拟合的后期,有时会出现方向的快速变化,这与实际情况不符。
通常情况下,细胞一旦死亡,并不会神奇地复活并重新生长。这似乎是由于我们并非所有批次都拥有第30天的数据所致。由于B样条曲线使用的是三次函数,因此它预测的结果可能并不合理。而P样条曲线使用的是平滑的线性函数,即使存在数据缺失,也能更准确地预测批次结束时的预期结果。这表明P样条曲线可能更合适,但我仍然想同时使用这两种方法进行验证。
使用 Functional Data Explorer,一旦你获得了所有批次的所有拟合结果,它就会生成一个均值函数。这是所有批次所有拟合结果的平均值。然后它会分析并指出:“我们从哪里获得了偏离该均值函数的较大变异来源?”
如果你还记得前几张幻灯片,我们看到了一个大的扇形展开。我再回去演示一下。我们看到这个大的扇形展开。这里的情况比较紧凑,然后我们看到结尾处出现了这个大的扇形展开,这正是我们想要探究的。当然,观察第一个形状函数(它将描述70%到80%的变异性),我们看到在增长阶段的初期它相当平坦,但在末期出现了这种波动,这符合我们的预期。实际上,这可能就是我们试图模拟的稳定阶段。这个形状函数似乎代表了这一点,因为它先是稳定,然后上升,这与我们观察到的均值函数的下降趋势相反。
我们看到它们都在形状函数中捕捉到了这一点,但是对于 P 样条曲线来说,它是上升的并且保持稳定,而对于 B 样条曲线来说,它是上升的,并且在末端又出现了我们不一定想要的那个小下降。
额外的形状函数捕捉了一些可能不太引人注目但仍然值得建模的现象。例如,生长阶段和稳定阶段之间的微小跳跃,以及最后的一些下降。但我们最感兴趣的无疑是最初的那个形状函数。
我发现形状函数有时可能有点难以解释,因为你需要将它们与均值函数进行比较。函数式数据浏览器(Functional Date Explorer)的一个优点是,它像其他主成分分析工具一样,提供了得分图。它会拟合每个不同的数据批次,并根据它们在每个主成分上的得分高低给出一个分数,从而显示哪些数据在形状函数一上得分高,哪些得分低。
从这里你可以看到一些例子,这些例子有助于你理解这里发生的形状变化。我们可以看到,这证实了初始形状函数值较高的那批数据达到了一个良好的稳定状态,而初始形状函数值较低的那批数据则呈现出先上升后下降的趋势。
出于好奇,我也看了看其他那些机器在做什么?它们似乎更像是捕捉生长阶段和稳定期之间偶尔出现的波动,因为我们改变了某种条件,这可能会导致生产过程略微不连贯,虽然问题不大,但或许我们应该尽量减少这种情况。或者,它们也可能捕捉到末期偶尔出现的产量下降,这些下降可能具有重要意义,也可能无关紧要。它们或许只是特定批次生产结束时的自然现象。
由此,我们定义了功能性主成分,并确定了形状变化发生的位置。但接下来我们想探究,究竟是什么因素改变了这些形状函数?我们能否通过操控实验条件来控制形状的形成?这就是功能性实验设计(DOE)的用武之地。
本质上,这是在补充的实验设计(DOE)条件下,对每个主成分进行回归分析。建模方法有很多种。在这个例子中,我只用AIC最小化方法筛选出了最佳子集,因为我们只引入了三个因子。没有必要大幅减少因子数量和降低模型复杂度。而且,筛选最佳子集的计算量也不算太大。这就是我处理所有FPC(功能主成分)时使用的方法。我们可以看到,它输出了一个预测表达式,这很不错。你可以从中了解每个因子是如何影响每个形状的。
但话说回来,这并非总是最佳的解读方式。例如,我们可能会发现因子 3 的系数最大,所以因子 3 的影响可能最大。不过,JMP 中我最喜欢的功能之一就是性能分析器。它能帮助我们直观地了解实际运行情况,真的很有帮助。
在这种情况下,通过分析性能分析器,我以最大化第 30 天的产量作为延长稳定期的指标。这并非完美方案,但我们认为,如果产量能够保持稳定,那么在第 30 天时产量仍会很高。事实上,当我们进行优化时,我们发现最小化因子 3(这是合理的,因为它具有负系数)能够比因子 3 非常高时获得更稳定的产量。这对我们的客户来说非常有帮助。它实际上为他们提供了一个切入点,帮助他们确定“在什么条件下我们能够获得更稳定的产量”。
第二个问题,既然我们已经确定了稳态,那么我们想看看能否预测大规模实验的结果。我们用于回答这个问题的数据集包含了在对照条件下进行的大规模实验,以及在对照条件下进行的小规模实验,此外还包括在生长后引入不同的实验设计条件。
我们之所以想捕捉到这些变化,是因为从小规模到大规模的转化并非完美,尤其是在生长阶段。因为在大规模培养中,细胞可能有更大的生长空间,混合效果可能更好或更差,营养物质的获取也可能更充足。我们通常观察到,大规模培养中的细胞生长速度比小规模培养中更快。我们希望能够构建一个预测模型,预测这种生长速度的提升,并考察能否应用美国能源部(DOE)的相关研究结果。
我不会再赘述细节,但对响应 2 也进行了非常类似的拟合。之所以再次选择 P 样条,是因为我们在响应 1 中使用 B 样条时,在末端出现了那种奇怪的现象。观察形状函数,我们再次看到了这个形状。这是稳态形状。但就尺度而言,这并不是我们真正感兴趣的。
因为规模效应,我们想看看它是否对这部分产生影响?我们还有一些额外的形状函数,从中可以看出,它们似乎捕捉到了生产初期阶段的变化,而这正是我们所关注的。事实上,形状函数 3 似乎是该增长阶段变化最显著的因素。
同样,查看剖面图有助于证实这一点。如果我们观察这些斜率,当 FPC3 值较高时,我们会发现当 FPC3 值较低时,曲线较为平缓;而当 FPC3 值较低时,我们则会看到一个更为强烈的峰值。
接下来我们想继续研究DOE。我们能否将这些因素和尺度应用于这些主成分?对于第三个主成分,一个令人欣喜的发现是,唯一显著影响它的因素是尺度,这很好,因为我们能够将尺度对特定形状变化的影响隔离出来。虽然尺度也影响了其他主成分,但我们确实得到了这种孤立的形状。
再次强调,查看分析器对解读结果最有帮助。我们看到,在第 30 天,规模的影响并不明显,曲线相当平稳。但如果我们观察生长阶段的第 7 天,就能发现这种差异,即大规模的影响会高于小规模。看来我们确实捕捉到了规模差异。
我们成功地在模型中实现了这两个目标。Functional Data Explorer 的另一个优点是,您可以将预测公式导出到数据表的列中,然后只需使用常规的分析器平台,即可创建一个分析器,以便同时处理两个响应变量,因为它们之间存在一些共同的因素。
这样做有两个好处。首先,所有内容都集中在一起查看非常方便;其次,您的客户或模型用户可能没有 JMP Pro,也就无法访问功能数据浏览器。这样,您就可以与可能只拥有普通 JMP 的用户共享模型,然后他们可以在此基础上进行操作。
总而言之,我们利用功能性实验设计 (Functional DOE) 实现了两个不同的建模目标。它简化了许多复杂性,同时仍然捕捉到了我们感兴趣的区域,即在不同条件下批次间的变化。我们能够针对特定因素隔离某些功能。最后,我们创建了这个性能分析器,它非常适合与客户或模型用户共享,因为最终使用者是他们。
存在一些局限性。我想每年在 JMP 会议上都会讨论到,Functional DOE 或 Functional Explorer 不提供预测误差。我曾尝试过,如果我们输出预测残差,能否通过围绕这些残差建立模型来大致了解情况?我在这方面取得的成果有限,但我非常乐意听取关于未来如何实现这一目标的建议。
还有一点很不错,也许理论上可行,但我一直没找到方法,那就是针对特定的形状函数进行优化。就我而言,我优化的目标是最大化第 30 天的产量,以此作为参考指标。如果第 30 天的产量很高,说明产量比较稳定。但这并非一个完美的参考指标。如果我们能设定一个理想状态,比如产量稳定在这个范围内,然后针对这个理想状态进行优化,那就很有用了。当然,这可能已经实现了,只是我还没意识到。
当然,另一个风险是,任何灵活的建模方法都可能出现过拟合噪声很大的数据的情况。这次的数据实际上相当平滑,但这并非总是如此。通常,当我们想要平衡过拟合时,交叉验证之类的方法非常有用。但由于我没有在相同的条件下运行所有数据,引入了这些额外的因素,使得定义测试数据集和训练数据集变得更加复杂。未来,我非常乐意接受任何相关的建议。
但总的来说,我们完成了我们需要做的一切。当然,这绝非我一人之力。我们的临床前团队提供了大量数据。这里也列出了一些我的合作作者的名字,他们为我们提供了很多关于连续处理的背景知识。此外,我们研究团队的其他统计学家也提供了帮助。最后,我想对他们表示感谢。这里也列出了一些参考文献。我的报告到此结束。