La coltura cellulare svolge un ruolo cruciale nella produzione di prodotti biologici. Quando si introducono modifiche di processo come parte di un disegno di esperimento (DOE), modellare accuratamente il comportamento del processo di coltura cellulare è difficile, poiché il processo prevede molteplici fasi di crescita e produzione interdipendenti, solo alcune delle quali possono essere influenzate dalle modifiche di processo. I tradizionali modelli parametrici non lineari faticano a catturare efficacemente questa complessità, mentre i modelli non parametrici da soli possono essere disgiunti e difficili da correlare con i parametri DOE.
Per risolvere questo problema, il DOE funzionale semplifica la complessità in componenti principali e correla le variazioni con i parametri DOE. Questo approccio consente la creazione di un profiler di predizione, in grado di ottimizzare i parametri delle colture cellulari a partire da dati su piccola scala e utilizzarli per prevedere il comportamento durante la produzione su larga scala. L'intero processo può essere eseguito all'interno della piattaforma Functional Data Explorer di JMP Pro e può fornire un approccio più efficiente per l'ottimizzazione dei processi di coltura cellulare.
Oggi analizzerò un caso d'uso per l'utilizzo del DOE funzionale per modellare alcuni complessi processi di coltura cellulare non lineari. Inizialmente, spiegherò il processo di coltura cellulare che stavamo cercando di modellare, ovvero una produzione continua. Esaminerò due degli obiettivi di questa modellazione: il mantenimento di uno stato stazionario e la possibilità di prevedere un comportamento su larga scala sulla base di dati su piccola scala.
Poi parlerò delle spline non parametriche, che sono le funzioni di base per la modellazione che ho realizzato, e farò un'introduzione a Functional Data Explorer, che è la piattaforma che in questo caso utilizza le spline e i componenti principali per la modellazione.
Esaminerò due diverse risposte che ho ricevuto per rispondere a entrambi gli obiettivi, oltre ad alcuni diversi tipi di adattamento spline e come incorporare le condizioni DOE. Infine, spiegherò come generare alcuni profiler di giunto e un riepilogo e una discussione dei risultati e, se necessario, delle eventuali difficoltà che ho incontrato.
L'obiettivo di ciò che stiamo cercando di modellare si chiama produzione continua. Lo standard nei prodotti biologici è la produzione in lotti. Per questo, si coltivano cellule, si massimizza la loro produzione, e poi a un certo punto si esauriscono metabolicamente ed entrano in una fase di morte. Quindi si raccoglie tutto in quel bioreattore, che dovrebbe includere le cellule morte così come il farmaco o la molecola di interesse, e si prende tutto e lo si elabora nella misura necessaria.
Ciò che stiamo cercando di osservare, e che molte persone nel settore stanno osservando, è che invece di crescere, morire e produrre questi lotti unici, possiamo essere più simili ad altri settori, ad esempio l'industria automobilistica o qualcosa del genere, dove produciamo continuamente materiale?
Per fare ciò, ovviamente, vogliamo continuare a far crescere le cellule, ma poi vogliamo mantenerle in quella fase stazionaria, che sarebbe il numero 5 in questa curva di crescita, e impedire questa fase di morte al numero 6. Per fare ciò, potenzialmente avresti un bioreattore più piccolo, ma alimenteresti costantemente nuovi terreni che dovrebbero contenere nutrienti freschi e tutto il resto, e allo stesso tempo rimuoveresti la stessa quantità di liquido. In teoria, quel liquido dovrebbe contenere il farmaco di interesse. L'obiettivo è mantenere uno stato costante di nuovo nutrimento in arrivo e poi, auspicabilmente, permeare qualsiasi molecola stiamo cercando di produrre.
Il secondo obiettivo, oltre a cercare di mantenere una produzione costante, è quello di poter prevedere come andranno le cose su larga scala basandosi sulla piccola scala. Perché su piccola scala possiamo gestire molti reattori diversi, possiamo introdurre condizioni diverse, ma non possiamo farlo su larga scala a causa di vincoli logistici, di tempo e di denaro. Vogliamo essere in grado di vedere se possiamo prevedere sia la piccola che la grande scala, ma anche come l'aggiunta di fattori diversi e di condizioni diverse potrebbe avere un impatto anche su larga scala.
Un altro aspetto interessante riguarda la produzione: poiché si hanno queste diverse fasi, si potrebbero introdurre condizioni in momenti diversi. La fase di crescita potrebbe essere sempre allo stesso controllo, magari lo stesso controllo su larga scala, ma in seguito si aggiungeranno questi diversi fattori DOE, che avranno un elemento temporale. Vedremo come siamo riusciti a farlo con Functional Data Explorer.
Per prima cosa, introdurrò la spline. Questa è la base della modellazione che stavamo sviluppando. Inizialmente, volevamo vedere se potevamo usare una modellazione parametrica, che forse avrebbe funzionato per alcune fasi. Avremmo potuto usare la modellazione esponenziale logistica per la fase di crescita. Ma quando abbiamo aggiunto, introducendo gli effetti di scala e del DOE che vengono introdotti in momenti diversi, non abbiamo necessariamente catturato tutto questo, perché alcune produzioni potrebbero crescere e poi morire, altre potrebbero crescere e rimanere stabili. Non potevamo davvero catturare tutto questo con un modello parametrico che abbiamo trovato.
Volevamo usare qualcosa di più flessibile, in questo caso le spline. In sostanza, una spline serve a adattare una funzione semplificata tra nodi nei dati. Quando si cerca di adattare una spline, ci sono un paio di scelte da fare. Quanti nodi si vogliono creare? In genere, più nodi si hanno, più il modello si adatterà ai dati, il che può essere positivo o negativo, e potrebbe portare a un overfitting. Poi c'è anche il grado di adattamento. Tra ogni nodo, si vuole una linea retta? Si vuole una curvatura? Si vuole solo una funzione a gradini?
Quindi, con alcuni tipi di spline, che Functional Data Explorer genera come spline P, è possibile aggiungere una funzione di smoothing. A ogni nodo, si smussa la superficie tra ogni spline, in modo che, se si utilizza una curva lineare, ad esempio, si ottengano queste linee rapidamente disgiunte.
Le due opzioni spline disponibili in Functional Data Explorer sono B Spline e P Spline. Ci sono anche altre opzioni in Functional Data Explorer, come le funzioni d'onda, ma non erano necessariamente applicabili in questo caso. Come regola generale, ho scoperto che le P Spline, che sono le spline di regressione più semplici, sono generalmente adatte per modellare funzioni uniformi. Le P Spline possono essere migliori per quelle funzioni con rumore ondulato perché attenuano forse parte di quel rumore. Questa è un'affermazione generale. Ci sono sicuramente modi per sovra-adattare con una P Spline, ci sono modi per sotto-adattare con una B Spline, ma queste sono solo regole generali.
In questo caso, la piattaforma che stiamo utilizzando è Functional Data Explorer. Ho alcune immagini di come appare effettivamente la piattaforma. In genere, i dati funzionali sono semplicemente dati registrati su un dominio continuo. In questo caso, si tratterebbe del tempo, ovvero il batch viene prodotto nel tempo. Può trattarsi anche di altri fattori. L'ho visto utilizzato per i dati spettrali, ad esempio. Poi si vuole identificare un insieme di misurazioni. In questo caso, si tratterebbe di batch diversi che identificheremmo, quindi ci saranno adattamenti individuali per ogni batch.
L'altro aspetto interessante, che approfondirò più avanti, è che è possibile aggiungere questi fattori supplementari. Possono essere i fattori DOE, ovvero elementi in arrivo che potenzialmente modificano le forme che si desidera catturare. Approfondirò il funzionamento di questo aspetto più avanti nella presentazione.
Inizialmente, non ero sicuro di quale tipo di spline sarebbe stato il migliore, perché non esisteva necessariamente una regola fissa. Inizialmente ho modellato con entrambi. Quando si modellano questi dati in Functional Data Explorer, ci sono molti modi per trovare un modello ottimale. In questo caso, utilizzo la minimizzazione del BIC. È possibile anche fare cose come la convalida incrociata. In questo caso, poiché stavo introducendo quei fattori supplementari, è stato un po' più difficile definire cosa sarebbe stato un set di dati di test rispetto a uno di training. In questo caso abbiamo semplicemente optato per la minimizzazione del BIC.
Qui abbiamo i risultati dei due diversi tipi di spline. Questa linea rossa è la media di ciascuna di esse. Come potete vedere, sono piuttosto simili, ma raggiungono questo risultato in modi diversi. La B-Spline ha raccomandato un numero inferiore di nodi, in questo caso 13, e ha raccomandato una funzione cubica, aggiungendo quindi un po' della curvatura che vediamo qui.
P Spline ha consigliato di avere un nodo ogni singolo giorno, in sostanza. Ci sono 30 giorni, ma 29 nodi tra ogni giorno. Quindi ha eseguito un smoothing a ogni singolo nodo, ed è stato quindi in grado di utilizzare un adattamento lineare ma ottenendo comunque quella curvatura introducendo quello smoothing. Vediamo che sono piuttosto simili all'inizio. Ci sono forse alcune differenze alla fine, dove potenzialmente mancavano alcuni dati da alcuni batch.
Ora esamineremo i singoli adattamenti per vedere cosa stava succedendo lì dove vediamo quelle differenze alla fine. Qui mostriamo, per lo stesso set di batch, quali erano gli adattamenti spline effettivi per batch. Di nuovo, stiamo osservando questo fenomeno simile a quello visto con la funzione media: l'inizio è piuttosto simile, anche la parte centrale è simile, ma alla fine delle produzioni per gli adattamenti B Spline, a volte vediamo questi rapidi cambiamenti di direzione, che non è quello che ci aspetteremmo di vedere nella vita reale.
In genere, una volta che le cellule muoiono, non risorgono magicamente e non ricominciano a crescere. Questo sembra essere un artefatto del fatto che non avevamo necessariamente i dati del giorno 30 per tutti i batch. Poiché la B Spline utilizzava quella funzione cubica, prevedeva cose che forse non avevano necessariamente senso. Invece, con la P Spline, che utilizzava quella funzione lineare regolare, otteniamo un po' di più di quanto ci aspetteremmo alla fine del batch, anche se mancano dati. Questo suggeriva che la P Spline potesse essere una soluzione migliore, ma volevo comunque continuare con entrambe per confermarlo.
Con Functional Data Explorer, una volta ottenuti tutti i fit di tutti i batch, verrà generata una funzione media. Questa è la media di tutti i fit per tutti i batch. Quindi, il programma verificherà e chiederà: "Dove stiamo ottenendo grandi fonti di variabilità, a parte quella funzione media?"
Se ricordate, un paio di diapositive fa abbiamo visto un grande ventaglio. Tornerò a mostrarlo. Vediamo questo grande ventaglio. Qui le cose sono piuttosto strette, e poi vediamo questo grande ventaglio alla fine, che è ciò che stiamo cercando di esplorare. Naturalmente, osservando questa prima funzione di forma, che descriverà tra il 70% e l'80% della variabilità, vediamo che è piuttosto piatta all'inizio durante questa fase di crescita, ma poi vediamo questa variazione alla fine, che è ciò che ci aspetteremmo. In effetti, questa è probabilmente la fase stabile che stiamo cercando di modellare. Questo sembra rappresentarla perché è stabile e poi sale, il che contrasta questa discesa che stiamo osservando nella funzione media.
Vediamo che entrambi catturano questo aspetto nella funzione di forma, ma per la P Spline, sale ed è costante, mentre per la B Spline sale e presenta di nuovo quel piccolo calo alla fine che non volevamo necessariamente.
Le funzioni di forma aggiuntive catturano elementi che forse sono meno interessanti, ma che potrebbero comunque essere interessanti da modellare. Forse cose come piccoli salti, magari tra la transizione, tra la fase di crescita e quella stazionaria, qualche calo finale. Ma questa funzione di forma iniziale era sicuramente quella che probabilmente ci avrebbe interessato di più.
A volte trovo che le funzioni di forma possano essere un po' difficili da interpretare perché poi bisogna confrontarle con la funzione media. Un aspetto positivo di Functional Date Explorer, come di qualsiasi altra componente principale, è che fornisce grafici di punteggio. Quindi, si adatta a ogni batch e fornisce un punteggio in base a quanto alto o basso è stato raggiunto su ciascuna componente principale, in modo da individuare quale componente ha un punteggio alto nella funzione di forma uno e quale basso nella funzione di forma uno.
Da qui si possono vedere esempi che aiutano a definire il cambiamento di forma che si sta verificando. Possiamo vedere qui la conferma che questo particolare lotto, che era alto in questa funzione di forma iniziale, aveva questo piacevole stato stazionario, mentre quello che era basso, stiamo assistendo a questo aumento e poi a questo calo.
Per curiosità, ho anche guardato cosa fanno questi altri. Sembrano più simili a catturare: a volte si verifica questo sbalzo tra la fase di crescita e quella stazionaria perché stiamo modificando una condizione e questo può rendere la produzione un po' discontinua, il che non è un grosso problema, ma forse è qualcosa che vogliamo ridurre al minimo, o forse questi cali alla fine a volte, che possono essere significativi o meno. Potrebbero essere solo un artefatto del fatto che stanno terminando questo particolare lotto.
Da qui, abbiamo definito le nostre componenti principali funzionali e identificato dove si verificavano quei cambiamenti di forma. Ma poi volevamo vedere cosa modificava effettivamente quelle funzioni di forma. Possiamo effettivamente controllare il modo in cui la forma viene creata manipolando le condizioni? È qui che entra in gioco il DOE funzionale.
Per questo, ciò che accade essenzialmente è che si esegue una regressione per ogni singola componente principale con le condizioni DOE supplementari. Esistono molte opzioni diverse per realizzare questa modellazione. In questo caso particolare, ho semplicemente creato un sottoinsieme ottimale con la minimizzazione AIC perché, in questo caso, stiamo introducendo solo tre fattori. Non c'era un'enorme necessità di ridurre il numero di fattori e la complessità. Inoltre, non era troppo impegnativo dal punto di vista computazionale creare un sottoinsieme ottimale. Questo è il metodo che utilizzo per tutti questi FPC. Possiamo vedere qui, il che è interessante, che producono un'espressione di predizione. Si può avere un'idea di come ogni fattore influisce su ogni forma.
Ma, ripeto, non è sempre il modo migliore per interpretare qualcosa. Da ciò, potremmo vedere che il fattore 3 ha il coefficiente maggiore, quindi forse è il fattore 3 ad avere la maggiore influenza. Ma una delle mie funzioni preferite di JMP sono i profiler. Sono davvero utili per poter visualizzare cosa sta realmente accadendo.
In questo caso, osservando il profiler, ho utilizzato la massimizzazione del Giorno 30 come proxy per una fase stazionaria prolungata. Non è una soluzione perfetta, ma pensiamo che se la produzione sarà stabile, sarà comunque elevata al Giorno 30. In effetti, quando eseguiamo questa ottimizzazione, vediamo che minimizzare il Fattore 3, il che ha senso perché ha un coefficiente negativo, ci darà una produzione in stato più stabile rispetto a quando il Fattore 3 è molto elevato. Questo è stato davvero utile per i nostri clienti. In pratica, ha fornito loro un punto di leva per aiutarli a identificare "Ecco una condizione in cui otterremo una produzione più stabile".
La seconda risposta, una volta identificato lo stato stazionario, era: possiamo prevedere la crescita su larga scala? Il set di dati che avevamo per questa risposta conteneva sia un'esecuzione su larga scala in condizioni di controllo, sia un'esecuzione su piccola scala in condizioni di controllo, oltre all'introduzione di queste diverse condizioni di DOE dopo la crescita.
Il motivo per cui volevamo essere in grado di catturare questo dato è che non si tratta di una traduzione perfetta da piccola a grande scala, soprattutto per la fase di crescita. Poiché le cellule potrebbero avere più spazio per crescere su larga scala, potrebbe esserci una miscelazione migliore o peggiore, ovvero potrebbero avere un maggiore accesso ai nutrienti. Tendiamo a osservare una crescita più rapida su larga scala rispetto a quella su piccola scala. Volevamo verificare se fosse possibile generare un profiler di previsione in cui prevedere tale aumento di crescita, ma anche se fosse possibile applicare anche gli impatti del DOE.
Non entrerò di nuovo nei dettagli, ma un fitting molto simile è stato fatto per la Risposta 2. La Spline P è stata scelta di nuovo perché c'era quella stranezza alla fine che abbiamo visto con la Spline B per la Risposta 1. Osservando le funzioni di forma, vediamo di nuovo questa. Questa è quella in stato stazionario. Ma in questo caso, per quanto riguarda la scala, non è questo che ci interessa.
A causa della scala, vogliamo vedere se influisce su questa parte. Abbiamo queste funzioni di forma aggiuntive che sembrano catturare i cambiamenti all'inizio della produzione, ed è questo che ci interessa. In effetti, la Funzione di Forma 3 sembra essere il cambiamento più significativo in quella fase di crescita.
Di nuovo, osservare i profiler aiuta a confermarlo. Se osserviamo queste pendenze, quando abbiamo un FPC3 alto rispetto a uno basso, vediamo che quando è alto, è un po' più superficiale; quando è basso, vediamo un picco più intenso.
Poi volevamo passare al DOE. Possiamo applicare i fattori e la scala a queste componenti principali? L'aspetto positivo che è emerso per la Componente Principale 3, l'unica cosa che si è rivelata significativa, è stata la scala, il che è positivo perché siamo stati in grado di isolare l'impatto della scala su quel particolare cambiamento di forma. Non completamente, perché la scala ha avuto un impatto anche sulle altre componenti principali, ma avevamo questa forma isolata.
Ancora una volta, osservare il profiler è il modo migliore per interpretare. Vediamo che al giorno 30 la scala non ha un impatto significativo. È piuttosto piatta. Ma se guardiamo al giorno 7, durante la fase di crescita, notiamo questa differenza, questo effetto per cui la scala grande sarà maggiore di quella piccola. Sembra che stiamo catturando questa differenza di scala.
Siamo riusciti a catturare questi due obiettivi nei modelli. Un altro aspetto interessante di Functional Data Explorer è che è possibile esportare le formule di previsione in una colonna della tabella dati e quindi, utilizzando la piattaforma di profiler standard, creare un profiler che può essere manipolato contemporaneamente tra le due risposte, poiché condividono alcuni fattori.
Questa funzionalità è utile per un paio di motivi. Innanzitutto, è utile vedere tutto insieme, ma potresti avere clienti o utenti di modelli che non hanno JMP Pro e potrebbero non avere accesso a Functional Data Explorer. Questo ti permette di condividere il modello con qualcuno che magari ha solo JMP standard, in modo che possa sperimentarlo da lì.
Nel complesso, per concludere, siamo riusciti a raggiungere i nostri due diversi obiettivi di modellazione con Functional DOE. È stato in grado di semplificare gran parte della complessità, pur continuando a catturare le aree di interesse che abbiamo visto cambiare da un lotto all'altro in diverse condizioni. Siamo stati in grado di isolare determinate funzioni in base a fattori specifici. Infine, siamo riusciti a creare questo profiler che è davvero utile per la condivisione con il cliente o l'utente del modello, perché alla fine saranno loro a utilizzarlo.
Alcune limitazioni. Credo che ogni anno venga discusso a ogni conferenza JMP che Functional DOE o Functional Explorer non forniscono alcun errore di previsione. Ho provato a sperimentare un po', chiedendomi: se estraiamo i nostri residui di previsione, possiamo farci un'idea cercando di modellare attorno a quei residui? Ho avuto un successo piuttosto limitato, ma sono sicuramente aperto a idee su come potremmo farlo in futuro.
Un'altra cosa che sarebbe utile, e potrebbe essere effettivamente possibile, ma non sono riuscito a capire come farlo, è ottimizzare rispetto a una funzione di forma specifica. Nel mio caso, stavo ottimizzando per massimizzare il Giorno 30 come proxy. Se il Giorno 30 è alto, abbiamo una produzione in stato abbastanza stabile. Non è un proxy perfetto. Se fossimo in grado di inserire, tipo, questa è una funzione ideale in cui abbiamo questa produzione piatta, come ottimizziamo rispetto a quella? Sarebbe utile. Di nuovo, potrebbe essere qualcosa di già possibile, ma di cui non sono a conoscenza.
L'altro rischio, ovviamente, è che con qualsiasi modellazione flessibile si rischia di sovra-adattare dati molto rumorosi. In questo caso, i dati erano in realtà piuttosto uniformi. Non sarà sempre così. In genere, quando vogliamo cercare di bilanciare questo sovra-adattamento, strumenti come la convalida incrociata sono molto utili. Ma poiché non eseguivo tutto alle stesse condizioni, introducevamo questi fattori aggiuntivi, il che rendeva un po' più complicata la definizione di un set di dati di test rispetto a uno di training. Sicuramente, in futuro, sono aperto a qualsiasi suggerimento in merito.
Ma nel complesso, siamo riusciti a fare ciò che dovevamo fare. Ovviamente, non ho lavorato solo io. Molti dati sono stati forniti dal nostro team preclinico. Abbiamo anche alcuni nomi tra i miei coautori, che ci hanno aiutato molto con le informazioni di base sull'elaborazione continua. Abbiamo anche ricevuto un aiuto da altri statistici nella nostra parte di ricerca. Volevo solo ringraziarli alla fine. Sono disponibili anche alcuni riferimenti bibliografici. Questo conclude la mia presentazione su questo argomento.