ベン・リチャードソンです。本日は、UPSIDE Foodsで培養肉のバイオプロセスデータ分析をJSLで自動化する取り組みについてご紹介できることを嬉しく思います。まずは、ミーガンとジュリア、そして私が代表として参加しているUPSIDE Foodsの多大な貢献に感謝申し上げます。右側に表示されているのは、UPSIDE Foodsの製品の一部です。
まず、これから取り上げる内容について簡単に目次を見ながら説明します。まず、培養肉や細胞培養培地についてご存じない方のために、背景を少し説明します。これは私が所属する部門特有のもので、JMPが私たちにとってこれほど強力なツールとなっている理由を理解する上で非常に重要です。
また、UPSIDE Foodsにおけるバイオプロセス開発をJSLスクリプトがどのように加速させたかについてもお話しします。その後、スクリプトのデモを行います。主要な機器データへのリアルタイムアクセス、データ可視化ツール、トレンド分析、そしてTabulate機能など、オペレーター向けの便利なツールなど、私たちが開発したツールの機能の一部をご紹介します。
最後のセクションでは、JMPでこれらの高度な計算の一部を自動化するための初心者向けガイドを紹介します。そのために、ケーススタディに焦点を当てます。バイオプロセスにおいて、自己特異的グルコース消費量は非常に重要なパラメータです。しかし、これは計算が非常に難しいことでも知られています。
この高度な計算を分かりやすくするために、私たちが行った4つの取り組みについてお話しします。まず1つ目は、サンプル名の標準化です。これは私たちのアプローチにおいて非常に重要かつ基本的な部分です。また、オープンデータベース接続を使用して実際にデータにアクセスする方法、データを自動的にクリーニング、並べ替え、整理する方法、そして最後に、いくつかの主要な関数を使用して実際に数式列を作成する方法についても説明します。
早速、背景を見ていきましょう。培養肉とは何でしょうか?UPSIDE Foodsとは何でしょうか?UPSIDE Foodsは、2015年に培養肉分野で初めて設立された企業です。以来、この分野の真のリーダーとして、2022年にUSDA(米国農務省)とFDA(米国食品医薬品局)の規制承認を取得しました。
私たちがやっているのは、動物の細胞を採取することです。これは植物由来の肉ではありません。動物の肉から細胞を分離します。これは屠殺を伴いません。動物を殺す必要はありません。そして、分離した細胞から細胞培養培地で細胞株を開発します。繰り返しますが、これが私がずっと取り組んでいる分野です。
細胞と細胞培養培地はバイオリアクター内で混合されます。ビール醸造と非常によく似ており、酵母を使って細胞を培養します。私たちはこれらの動物細胞をバイオリアクターで培養し、それを人間が消費できる製品に仕上げる予定です。このバイオプロセス技術の真の魅力は、バイオプロセスによって食肉生産の効率化が図られ、消費者のコスト削減と環境への悪影響の抑制につながることです。これは本当に期待していることです。土地や水の使用量、さらには温室効果ガスの排出量を削減できるだけでなく、動物虐待も軽減できるのです。
なぜ細胞培養培地がそれほど重要なのでしょうか?ここで私がお話ししたいのは、細胞の栄養源、つまり私たちが本当に話したいと思っている領域です。隅に溶液がいくつか見えますね。これらは面白い色ですが、実際には主にビタミンによるものです。細胞培養培地は、体外での増殖に必要な細胞、栄養素、そして周囲の環境を提供するため、非常に重要です。
細胞培養培地は、実際には特別なものではありません。鶏や牛に与える、あるいは私たち自身も口にする、アミノ酸、糖、ビタミン、ミネラルといった一般的な食品成分を細かく砕いたものです。UPSIDE Foodsは、特にコモディティ規模の価格設定において、低コストの培地開発を加速するために、細胞培養培地の生産を垂直統合しました。つまり、食品グレードの成分を用いて、独自の培地配合をゼロから開発しているのです。
細胞培養培地やバイオプロセスに詳しい方なら、培地の配合を一から設計するのは決して簡単な作業ではありません。そこで統計ソフトウェアJMPの出番です。この難しさを示す例として、50種類の培地成分を含む実験計画で要因乗法を採用するとします。これは実際には低い推定値です。多くの培地は100種類以上あります。これらの培地それぞれに低濃度、中濃度、高濃度の3種類だけを採用するとします。設計空間は3の50乗、つまり7.17×10の23乗です。これは1モル以上、6.02×10の23乗であり、実質的に無限大です。これらの条件をすべてテストすることはできません。
ここで実験計画法(DOE)の出番です。DOEは応用統計手法であり、特に一度に1つの因子やOFATアプローチと比較して、計画空間をより効率的に調査することができます。JMPによる図解をご覧ください。3つの異なる変数を3次元空間で視覚化すると、変数1、2、3が示されています。
従来の1要素ずつのアプローチでは、まず変数1を最適化し、最適な条件を見つけ、次に変数2、そして最適な条件を見つけ、そして変数3へと進みます。最終的には局所的な最大値を見つけます。もし、実際の最適な条件がどこかこちら側にあるのに、それを見逃してしまったらどうなるでしょうか?まず、最適な条件を見つけられない可能性に、より多くの時間と労力を費やしてしまうことになります。
JMPがここで非常に強力であり、私たちのアプローチにとって非常に重要である理由は、JMPが業界をリードするDOEソフトウェアを備えているからです。JMPは、細胞培養培地開発とバイオプロセス開発におけるまさにゴールドスタンダードです。UPSIDE Foodsでは、JMPは様々なバイオプロセス開発パイプライングループで広く採用されています。JMPは、このスクリプトの一部を参照し、使用するのに自然なツールです。
このスクリプトがUPSIDE Foodsにおけるバイオプロセス開発をどのように加速させたのか、お話ししましょう。ここにバイオプロセス開発パイプラインの各部分を分離した小さな図があります。細胞株開発などの上流工程から製造科学技術、そして実際の生産に至るまで、すべて網羅しています。培地開発について多くお話ししてきましたが、プロセス開発にも多くの共通点があります。
私が指摘したいのは、この開発パイプライン全体にわたる動的なフィードバックループが、科学的イノベーションとブレークスルーを推進する上で非常に重要な要素であるということです。つまり、より優れた細胞株が開発され、それが培地開発へと進むのです。これにより、制限となる栄養素や、その間の反復サイクルに関するブレークスルーが実現します。まさに、刺激的な科学的ブレークスルーが生まれる場所です。
DOEによって設計空間をより効率的に探査できるようになったことについてお話ししました。実験規模が縮小していると思われるかもしれませんが、実際には、媒体を根本から設計しようとしているため、実験は依然として大規模です。空間のテストはより効率的に行われているとはいえ、依然として調査すべき設計空間は途方もない規模にまで膨れ上がっています。
これらの培地をゼロから構築するために、膨大な数のサンプル、時には100以上の条件で実験を行っています。同僚のダーシャがラベルを印刷している写真をご覧ください。これは、私たちがここで扱っているサンプルの数と、それがチーム間のボトルネックになっている様子を示したものです。
これをさらに説明するために、UPSIDE Foodsのメディアチームで毎年実施している細胞カウント数をいくつか示します。これは驚異的な数字です。年間4万件以上の細胞カウントをUPSIDE Foodsで行っています。パイプラインの進行に伴い、必然的にこの数は変化していきます。スケールが大きくなるにつれて、容器の数や自由度はどんどん少なくなります。私たちの下の工程であるPDでは、実際には年間7,000~8,000件程度のサンプルを処理していることがわかります。
私たちが処理しようとしているのは膨大な量のデータであり、猛スピードでデータを取得しようとしています。そこで、JSLスクリプトを開発し、日常的なバイオプロセスデータ処理の平均時間を短縮し、情報をより迅速に発信し、他のチームに情報を提供し、フィードバックループを加速させました。その結果、日常的なデータ処理時間を約1週間から約2日に短縮できました。これは約3倍の増加であり、非常に喜ばしいことです。
では、スクリプトのデモを少しご紹介しましょう。このツールの機能をいくつかご紹介します。これがスクリプトです。かなり大きく、時間の経過とともに大きくなっています。コードもかなりたくさんあります。この短い講演では、すべてを詳しく説明する時間はありません。そこで、いくつかの機能を取り上げてデモを行います。このスクリプトを実行すると、まず小さな警告ウィンドウが表示されます。これは、開いている他のウィンドウが閉じられる可能性があることを示しています。これは問題ありません。
ここで例として、例えば5109という実験データを使ってみましょう。これは実際のデータです。このスクリプトは開いているデータベース接続を実行し、JMPにデータを読み込んでいます。これにより処理が高速化され、定期的に実行できます。必要に応じて実行できます。実験中は、データが定期的にデータベースにアップロードされ、リアルタイムでグラフを取得して確認できます。様々な機器のデータが入力されているのがわかります。データテーブルもいくつか作成されています。そして、条件キーを追加するかどうかを尋ねられます。
条件キーについては、後ほど詳しく説明します。ここでは「はい」と答えて、その機能の一部を紹介します。また、機器に関連付けられていない追加データを追加するかどうかも尋ねられます。これは追加したいメタデータです。ここでは例としてpack_cell_volumeを使用します。これは、機器によって実行されず、データベースに自動的にアップロードされるもの以外のすべてのデータです。ここでも「はい」と答えて、機能の一部を紹介します。次に、スクリプトはデータテーブルを作成します。これで、見栄えの良いデータテーブルが構築されました。
話を始める前に、正規化スクリプトを開きます。これはデータを正規化するために書いた小さなスクリプトです。知的財産権を侵害することなく話せるように、すべての数値を0から1にスケーリングします。このスクリプトをデータテーブルと一緒に実行し、何が起こるか確認します。
処理時間がスケールしました。最大値は1で、他の値はすべてそれに相対的になっています。ここに隠れているかもしれない重要なデータをすべて紹介する必要はありません。機能の一部を紹介するだけで十分です。
条件コードに戻りましょう。これを開いて、どのように動作するかを少し説明します。基本的に、数値条件202、203、204があります。そして、実際に変更するすべての変数は、この条件キーを介してこれらの条件にリンクされています。標準化されたサンプル命名システムが必要なので、ここにすべての情報を入力します。これについては後ほど詳しく説明します。これは、実際にどのように情報とこの条件を結び付けているかを示しています。
素晴らしいビッグデータテーブルがあります。1,206件のサンプル測定値がここにあります。すべてのパラメータ、すべての計算値、最大乳酸値、比乳酸生成、倍加時間、その他興味深いデータも含まれています。すべてのデータが1つの便利な場所にまとめられています。次にここで注目したいのは、左上に保存したスクリプトの一部です。
例えば、グラフビルダーがあります。このグラフビルダーの素晴らしい点は、列切り替え機能が自動的に備わっていて、すべてのパラメータと条件をグラフ化してくれることです。例えば、202が時間の経過とともに減少していることがすぐにわかります。これはあまり良くありません。209です。条件キーを追加したので、「201と202は見たくない。見たいのは条件だ」と判断できます。
これらがそれぞれ異なる条件だとしましょう。JMPとグラフビルダーのもう一つの優れた点は、変数1がどうなっているかすぐに確認できることです。変数1をここにドラッグして、「ああ、すべてのコントロールがうまくいっていないな。ここにはうまく機能しているかもしれないいくつかの異なる戦略がある」と確認できます。同様に、変数2をここにドラッグして、非常にユーザーフレンドリーな方法でデータを操作できます。何が起こっているのかを把握できます。
乳酸値を見てみましょう。例えば、倍加時間のようなものもここで確認できます。データに素早くアクセスして感触をつかみ、社内の他の人に提示できるように準備することで、作業のスピードアップを図ることができます。例えば、変数2についても把握したいとします。これをオーバーレイに表示して、その概要を把握するだけです。倍加時間は増加しています。これは理にかなっています。戦略1は、倍加時間を低く抑えることです。これが私たちが目指すものです。これがグラフビルダーの部分で、非常に興味深いです。
他にもたくさんの機能があります。次のセクションに入る前に、いくつか簡単に紹介したいと思います。その一つがサイクル分析です。これをクリックすると、様々なバッチがすべて読み上げられます。このパッセージ番号を入力すると、チェックボックスが表示されます。
n - 1、n - 2はスケールアップなので、これらをすべて選択します。これらの値は今回の分析には含めたくないので、必要な値だけ選択して「OK」をクリックします。すると、二変量近似値が表示され、傾向が分かります。ここで何が起こっているのかを定量化し、データを取得し、傾向分析を確認して、テーブルに直接追加します。これらはすべてスクリプトによって自動的に行われます。手動で行う必要はありません。これにより、データ出力が高速化されます。
トレンド分析が表示されていますね。グラフが表示され、傾きはどうなっているか、そして時間の経過とともにどのようになっているかが分かります。繰り返しますが、変数を選択して確認してみましょう。実際に色分けしてみます。データ操作と分析が非常に簡単に行えることがお分かりいただけると思います。
最後にご紹介する機能は、オペレーター向けのツールです。例えば、フィードや広告のバックを取得して実行したい場合、オペレーターが「今日はリアクターのメンテナンスのために何をすればいいんだろう?」とすぐに知りたいと思うかもしれません。そんな時、「じゃあ、1日休んでみよう」と提案できます。
例えば、これを例えば2019年8月24日に実行したいとします。これは日付です。これからこのスクリプトを実行します。24/08、何だったっけ?たぶん2019年ですね。小型リアクターで作業しているとします。作業量は225ミリリットル程度で、2%の供給量としましょう。「OK」をクリックすると、各リアクターにどれだけの供給量があり、特定の添加物が必要かどうかを示すテーブルが作成されます。
この場合、基本的にすべてにグルタミンとグルコースの両方が必要になりますが、もしこの日にすべてがアドバックの閾値を下回っていなければ、ここでいくつか「いいえ」という結果が出る可能性があります。これらの反応器に介入するために何が必要か、非常に簡単に理解できます。これがスクリプトの要点です。いくつか説明を終えて、プレゼンテーションに戻りましょう。
では、JMPを使い始めたばかりの初心者の方、特にJMPの使い方について少し説明しましょう。どのように行うのでしょうか?まずはケーススタディから始めましょう。この計算はなかなか難しいことで有名な「自己特定消費量」です。これから説明する4つのステップは、標準化されたサンプル命名システムの開発、データへの接続の確立、データの自動整理、クリーニング、ソート、そして最後に、このパラメータを計算するための計算式列の作成です。
早速始めましょう。まず、議論の枠組み、あるいはここでの課題を明確にするために、少し勉強する必要があります。少し講義をして、細胞特異的消費とは何か、そしてなぜ計算が難しいのかについてお話ししたいと思います。細胞特異的消費は、細胞の馬力のようなものだと考えることができます。すべての細胞は一定量の栄養素を消費する必要があり、これは毎日、つまり単位時間あたりのエネルギーと考えることができます。
したがって、消費量QはDelta CをDelta iVCDで割ったものになります。これは生細胞密度です。これは基本的に細胞数であり、バイオプロセスにおいて非常に重要なことです。同様に、溶液中の栄養素の量を測定することもできます。これらは典型的な曲線であり、フェッドバッチバイオプロセスの良い例となるかもしれません。このパラメータを定義するために、関心のある時点とその前の時点の2つの時点を調べます。
両者の間には時間があります。ここのデルタTでそれが分かります。曲線の下の面積がなぜ重要なのでしょうか?VCDではなくiVCDと言いました。生細胞密度のグラフについて話していましたが、私たちが本当に興味を持っているのは、その積分です。これが重要な理由は、この培養サイクルの開始時(おそらく4日間)に生きている細胞は、ここで分裂して収穫前にたった1日しか存在しなかった娘細胞と比べて、約4倍の栄養分を食べるからです。
近似値を求めることは可能です。経験則と台形則を少し使って計算できます。これが分母の部分です。濃度の変化も必要ですが、これも一見したほど複雑ではありません。
細胞の消費による濃度変化を求めたいので、供給された量を差し引く必要があります。通常、何を加えるかは分かっているため、この量を計測することはありません。通常、供給量がどのように増加し、その後減少するかを示す測定データポイントはありませんが、消費率を正確に計算するには、この量を考慮する必要があります。
彼らに与えられた量は決まっていますが、翌日実際に再測定してみると、彼らはここにあるデルタ値だけでなく、ここにあるデルタ値の量も摂取していました。つまり、この追加ポイントを差し引く必要があるということです。その結果、多くのパラメータが条件付きで相互に関連する、この複雑な式が生まれます。これが問題の核心であり、これらの計算の一部を自動化するのが非常に難しい理由です。
とにかく、私たちがどのようにそれを行っているかについてお話しします。まず1つ目は、標準化されたサンプル命名規則を開発することです。これは、ここで採用している自動化戦略のまさに基礎となるものです。サンプル文字列の例を使って、いくつかの要素を分解して説明します。これらの要素はそれぞれ、自動化を支援し、データのクリーニング、ソート、計算などの処理を自動化する上で重要なハンドルです。
例えば、グループIDがあります。日付コード、実験番号、そして視覚的に分かりやすくするために、区切りとしてアンダースコアが使われています。バッチまたはサイクル、反復ハンドル、そして条件またはリアクターコードもあります。この長い文字列は少し難しそうに見えますが、これらは通常、連続した数字で構成されています。
特に、一部のオペレーターにとってこれは面倒な作業になるのではないかと心配されている方もいるかもしれません。通常、オペレーターは1日に1回入力するだけで済みますし、多くの分析機器には自動入力機能が搭載されているので、リストをクリックするだけで入力できます。この機能の真価は、実際にこれらのパラメータの一部を自動化し、自動計算してみると、大きな成果が得られることです。
このアプローチを採用する上でのアドバイスは、チームがデータの操作と表示に何を使用しているかを特定し、必要最小限の要素を統合して体系化することです。これは可能な限りシンプルにしておくことが重要です。特定の実験や、このデータ操作に本当に必要な他の要素とは独立して、必要な要素がいくつかあるからです。
後からいつでも機能を追加できます。例えば、ここにはオプション機能として、機器の誤差補正機能があり、これは最後に追加できます。例えば、先ほどお話ししたフィードのように、意図的な再サンプリングも可能です。実際に測定を行い、想定通りの結果が得られているかを確認したい場合などです。他にも様々な機能を組み込むことができますが、デフォルトの分析には、誰もが使い始められるよう、厳格な命名規則を設定する必要があります。
次のステップは何でしょうか?このデータにアクセスする必要があります。私たちはデータベース接続をオープンにすることでこれを実現しました。ここにJMPがあるので、これにデータを取り込みます。データチームとITチームと協力して、機器が稼働後すぐにCSVファイルをエクスポートできるように設定しました。そして、これらのファイルはデータベースにアップロードされます。例えば、細胞カウンターと化学分析の両方がこのデータベースにアップロードされているのがわかります。
ODBCは接続です。データベースをJMPプログラムに接続する部分です。これはアプリケーション・プログラミング・インターフェース(API)であり、SQL(構造化問い合わせ言語)を使用します。デモでもご覧いただいたように、メタデータをアプリケーションやJMPに直接追加することも、データベース経由で入力することもできます。どちらも機能します。
では、実際にどうやってやるのでしょうか?実はJMPにはSQLクエリ機能があります。手動で操作することも可能ですし、使いやすいユーザーインターフェースがあるので、そこからクエリを選択できます。データベース接続を確立したら、クエリを作成できます。そして、私がおすすめしたい「ワークフロービルダー」という非常に便利な機能と組み合わせることもできます。ワークフロービルダーは、実行中のすべてのステップを追跡し、それに応じたJSLコードを生成します。
より高度なスクリプトを作成する場合は、おそらくこのスキャフォールドを修正する必要があるでしょう。スキャフォールドは、構文の例を示し、特に初心者、特にコンピュータサイエンスの専門的な訓練を受けていない人にとって、コーディングのスピードアップに役立ちます。これは非常に強力なツールなので、ぜひ皆さんに知っていただきたいです。
これは、実際のコードがどのようになるかを示したスニペットです。接続が確立されています。今回の場合は、このユーザーインターフェースを使ってELNを追加します。これは、後から追加する必要がある機能の一部です。作業とテストの出発点となるので、これから繰り返し作業を進めていきます。
では、ステップ3です。データのクリーニングとソートが必要です。これは非常に重要なステップです。なぜなら、例えば特定のグルコース消費量の計算では、多くの場合、データをExcelに取り込んでいるからです。彼らは手動でデータの移動、整理、削除、異なるセルへの参照を行っています。正確な結果を得るためには、データのクリーニングと結合を自動化することが非常に重要です。
最初にお話しする2つの領域は、結合と並べ替えの操作です。ユーザーインターフェースでは、これらは「テーブル」タブにあり、ワークフロービルダーと同様に組み合わせることができます。これは結合関数の例で、化学分析対象物と細胞数を取得し、それらのテーブルを結合しています。次に、パラメータに基づいて並べ替えることで、データが整理され、関数が期待する順序になるようにします。
最後に、あらゆる種類のクリーニングを行うことができます。これは少し手間がかかりますが、論理式を使えばかなり簡単に実行できます。ここで使用している例は、基本的に機器エラーから重複行を削除することです。これは先ほど述べたアンダースコアのRパラメータです。
ここで行っているのは、重複しているものとそうでないものを調べてラベル付けすることです。そして基本的に、最新のサンプルではないものをすべて取り出して非表示にし、除外します。繰り返しますが、これらのスクリプトはクリーニングに多くの機能を組み込んでおり、データをほぼ準備完了状態にし、プライムタイムに対応できる状態にします。
さて、最後のセクションに入りましょう。このパラメータを計算するための主要関数を含む列を実際にどのように構築するのでしょうか? 奇妙な式ができました。かなり厄介です。最初のステップは、ifやis missingなどの関数を使用して、利用可能なパラメータに応じて計算を実行できるようにすることです。
このサンプルウィンドウでは、一部の項目にはグルコース値が追加されていることがわかります。これは先ほどお話ししたフィードパラメータです。また、一部の項目には追加されていません。この値が存在する場合はそれを含めて計算し、存在しない場合は計算しないという式を設定する方法が必要です。これはif関数とis missing関数を使って行います。
もう一つ問題があります。この計算に必要な値が、異なる行に表示されています。データ管理に利点のある列ベースの形式では、同じ行外にあるものを参照するのが難しくなります。数式は、同じ行にあるものを参照するように構築されています。そこで、ここで紹介したい非常に強力な関数、lag関数を活用することができます。
データが適切にソートされ、整理されていれば、同じ行にないデータも正確に参照できます。ここにはC of Tと、Lag関数を使って参照できるC of T - 1があります。コードは以下のようになります。新しい列が生成されます。数式を作成します。if文で、基本的にこれらが同じものであることを確認します。2つの異なるバッチを比較しているのではなく、この一意のIDハンドルを使用して、同じバッチ内だけを参照しています。アドバックが発生しているかどうかを確認し、計算を実行します。iVCD、つまり別のチャンクは別の列で発生していますが、動作はほぼ同じです。
では、JMPに戻って、実際に動作を確認してみましょう。さて、これで正規化されたデータセットができました。サンプル、固有ID、血糖値、そして広告バックがいくつかあるのが分かります。これらのいくつかは実際に発生しています。場合によっては、値が異なり、均等に配置されていません。これをどのように計算し、毎回正しく実行できる、十分に賢いツールが必要です。
ここで、一番下に示したスクリプトを実行します。このスクリプトを実行して新しい列を作成し、特定のグルコース消費量を計算します。そして、選択した列を移動して、スクロールせずに見えるようにします。ここで、スクリプトの抜粋を実行してみましょう。
ハイライト表示されている部分だけでなく、全体を実行する必要があります。実行すると、ここに新しい列が表示され、計算結果が取得されていることがわかります。計算は希望どおりに中断され、希望どおりにスケーリングされた正確な値が得られます。
数式を見てみると、数式が構築されています。条件付きロジックを実行し、期待どおりの計算結果が得られます。ここでデータをプレビューできます。様々な要素がどのように加算されるかを確認し、トラブルシューティングを行うことができます。このようにして、高度で正確な計算を自動化しています。
はい、これで講演は終わりです。最後に少しだけ謝辞を述べて終わりにしたいと思います。UPSIDE Foodsの社員全員がこの取り組みに関わってくれました。特にメーガンとジュリアです。こちらはトップシェフのコンテストに参加していた時のチームメイト、会社全体、生産施設、そして製品の一部です。
オープンデータベース接続に関わる重労働を担い、システムのトラブルシューティングを手伝ってくれたITチームとデータチームに心から感謝します。そして、JMPを初めて紹介し、その強力なツールを体現してくれたマネージャーのキャメロンにも感謝します。ありがとうございました。これで私の講演を終わります。