Hola a todos, de parte de Elliot y mía. En esta presentación, mostraremos cómo utilizamos la automatización del procesamiento de datos en JMP en Illumina para acelerar nuestro proceso de desarrollo de productos. En esta presentación, lo primero que haremos será presentar el proceso de desarrollo de productos en Illumina, quiénes somos y cómo fabricamos nuestros productos. Después, mostraremos cómo el procesamiento de datos automatizado se integra en este proceso, daremos un ejemplo de nuestro flujo de trabajo típico y concluiremos con las conclusiones clave.
Illumina es conocida generalmente como una empresa que genera y fabrica instrumentos para la genómica. Actualmente, podemos definirnos como un proveedor de soluciones y plataformas para diversos tipos de ómica, genómica, transcriptómica y proteómica. Nuestro instrumento estrella, un instrumento de alto rendimiento, es la serie NovaSeq X, que lanzamos en 2023. La tecnología clave de NovaSeq X es la tecnología XLEAP.
Una de las características clave de la tecnología XLEAP es que con respecto al tipo de volumen de reactivo que era necesario para hacer funcionar un instrumento de alto rendimiento en nuestra iteración anterior de instrumentos de alto rendimiento, hemos logrado, gracias a esa tecnología, alrededor del 90% de reducción tanto en el paquete como en los esfuerzos de gestión y almacenamiento en el lado del cliente.
Esto fue posible porque aquí no se envía ningún reactivo con hielo seco ni en un paquete de hielo, por lo que el reactivo se transporta en una sola caja, sin necesidad de desechar ni gestionar el embalaje, el embalaje de hielo seco ni otros similares por parte del cliente. Dentro de esa caja, el cliente recibe este tipo de celda de flujo que puede ejecutar aproximadamente 300 ciclos por ejecución con 25 mil millones de mediciones por ciclo.
Para desarrollar estos instrumentos, estimamos que fue necesario procesar aproximadamente 5000 de estas celdas de flujo. Cada vez que las procesamos, debemos preparar el instrumento con un cartucho que contiene todos los reactivos, unos 20 reactivos únicos, cada uno de los cuales se desarrolló mediante ensayos analíticos y posterior secuenciación. Aquí es donde entra en juego el procesamiento automatizado de datos.
Hemos ejemplificado aquí el uso de ensayos analíticos para desarrollar reactivos. Como saben, en un ensayo basado en placas, el científico realiza el experimento, extrae los datos, realiza la reducción de datos, el análisis del procesamiento de datos, clic a clic, copia y pega hasta tener listo el informe. En ese momento, se pueden extraer conclusiones y pasar al siguiente experimento. Repita el mismo procedimiento una y otra vez o aproveche la función de JavaScript.
Generar un script que automatice la extracción, reducción y procesamiento de datos, y que permita realizar iterativamente cada vez más análisis de este tipo en experimentos repetitivos, lo que obviamente conlleva múltiples beneficios. En primer lugar, ahorrar tiempo al experimentador. En segundo lugar, permitir que estos análisis se realicen iterativamente en múltiples experimentos, lo que acelera el proceso de desarrollo de productos. Además, al eliminar la necesidad de clics repetitivos y copiar y pegar, se reducen los errores. Esto significa que podemos estandarizar nuestros procedimientos.
La estandarización es fundamental para obtener procesos reproducibles y robustos. Esto es posible incluso para científicos sin mucha experiencia en scripting, ya que pueden aprovechar la función Workflow Builder de JMP y la información disponible en la comunidad de JMP. Se requiere una experiencia mínima en programación.
Veamos un ejemplo de cómo podemos crear un procesamiento de datos automatizado reutilizable utilizando el Generador de Flujos de Trabajo, sin necesidad de conocimientos básicos de GSR. En LUNAR, es habitual desarrollar nuevos reactivos de secuenciación y, a menudo, necesitamos desarrollar una prueba para medir su actividad. Supongamos que tenemos una prueba en la que tomamos un sustrato oscuro y probamos nuestros reactivos para convertirlo en un producto fluorescente. Luego, lo colocamos en un lector de placas y medimos la evolución temporal de la respuesta de este producto fluorescente en función del tiempo.
Es típico que una reacción de este tipo tenga una cinética de primer orden, por lo que la formación de un producto P se puede describir mediante esta ecuación, que tiene una función del tiempo y dos parámetros importantes: Pₘₐₓ, que describe la intensidad máxima obtenida al final del intervalo de tiempo, y la velocidad k.
Esta tasa es lo que realmente nos interesa: determinar cuál de nuestros reactivos tiene la tasa más alta posible. Normalmente, obtenemos de nuestro lector de placas un archivo de datos sin procesar (suele ser un archivo de Excel) y luego queremos usar JMP para automatizar el procesamiento de datos. Lo que queremos hacer es importar estos datos de Excel. Necesitamos restar los datos de intensidad de fondo de nuestras respuestas.
Queremos realizar un ajuste exponencial para determinar esta velocidad de reacción k, y luego extraer los datos de esta velocidad a una tabla JMP que nos brinde un resumen de los resultados. Ahora, vamos a usar JMP y les mostraré cómo hacerlo. Pero primero, veamos nuestro archivo de Excel. Este es un tipo de archivo típico que podríamos obtener de un software de lectura de placas en su formato original. Como pueden ver, el software ha introducido algunos detalles experimentales.
Tenemos un gráfico de la disposición de la placa, y no es hasta la línea 21 donde obtenemos nuestros datos experimentales. Queremos poder abrirlo, obtener un JMP para procesar los datos y luego generar un buen resumen. Si queremos crear un flujo de trabajo automatizado para esto y no sabemos escribir código con JSL, y para obtener un script, podemos usar lo que se conoce como un Generador de Flujos de Trabajo. Para todos nuestros ejemplos, usamos la versión básica de JMP 18. Los ejecutamos dentro de un proyecto JMP para mantener todo organizado y visible, pero también puedes realizar estas tareas en la versión estándar de JMP.
Lo primero que debemos hacer es ir a "Nuevo" y abrir "Nuevo flujo de trabajo". Esta es la plataforma de flujo de trabajo, y lo importante es saber que, antes de empezar a grabar, debes hacer clic en este botón rojo. Cada paso se guardará como un paso y se creará un script. Al final, puedes combinar estos pasos en un script que puedas usar.
Queremos importar nuestro archivo de Excel aquí, así que lo abriremos. Como les mostré antes, los datos no empiezan en la primera línea, y aquí podemos especificar dónde empiezan y dónde terminan para poder importarlos. Al hacer clic en "Importar ahora", se registrará ese paso en los pasos del flujo de trabajo de la pestaña "Generador de flujo de trabajo", y así es como se ven los datos. Tenemos nuestro tiempo, diferentes muestras y nuestro historial.
Para realizar nuestros bits, necesitamos agregar una nueva columna, llamada "Pred" para la predicción. Predecimos cómo se vería en función del tiempo usando la fórmula que mostré en la diapositiva. Tenemos nuestras dos variables aquí. Hemos especificado algunos valores iniciales para los ajustes que se realizarán.
Ahora, si quieres pausar lo que estás haciendo en cualquier momento, jugar al golf y explorar, puedes hacer clic de nuevo en el botón rojo y luego puedes experimentar. Lo que hagas no se añadirá como paso. Por ejemplo, veamos cómo se ven los datos ahora. Si vamos al Constructor de Gráficos y reimportamos nuestros datos allí, veremos cómo se ven en su forma original.
Pueden ver que tenemos nuestro fondo aquí, que está en alrededor de mil unidades RFU, y nuestra respuesta de predicción comienza en cero. Pueden ver que lo que necesitamos hacer es normalizar nuestras muestras y eliminar el fondo. Primero necesitamos un poco más de procesamiento. Estos botones son muy útiles. Si quieren volver al inicio, pueden hacer clic en el botón "Reiniciar". Los llevará de vuelta allí, y luego, si hacemos clic en "Reproducir", podemos regresar al punto donde estábamos cuando detuvimos la última vez la grabación.
Antes de grabar más pasos, debemos asegurarnos de volver a hacer clic en el botón "Grabar". Para ello, debemos restar los fondos. La mejor manera de hacerlo es apilar estas columnas de muestra. Crearemos una nueva tabla donde las apilaremos y llamaremos a la columna de datos RFU (unidad de fluorescencia) y la etiquetaremos como muestra.
Ahora debemos encontrar la diferencia entre la señal de fondo y la señal de las muestras. La forma más sencilla de comprobarlo es seleccionar estas dos columnas. Al hacer clic derecho, se crea una nueva columna de fórmula. En "Combinar", encontramos la diferencia entre ambas columnas. Hay dos opciones. La diferencia está en orden inverso. Creo que es cuestión de prueba y error saber cuál elegir. Si elegimos la incorrecta, obtendremos valores negativos. Como pueden ver, hemos restado correctamente el fondo de las muestras.
Ahora podemos ejecutar nuestro ajuste para calcular la constante de velocidad. Vamos a "Analizar", "Modelado especializado". Ajustaremos un modelo no lineal y añadiremos nuestra fórmula de predicción de la columna "Fórmula del predictor X". Como pueden ver, se ha proporcionado la fórmula que añadimos como atributo de columna para el modelo de ajuste. Nuestros datos de muestra de referencia, una vez restada la muestra, serán la respuesta. Dado que tenemos varias muestras, necesitamos ajustar por muestra.
Si hacemos clic en Aceptar, abriremos nuestra plataforma de Ajuste No Lineal y veremos que tenemos un ajuste diferente disponible para cada muestra. La línea gruesa y negra representa nuestros datos experimentales. La línea fina representa nuestra fórmula de predicción, que proporciona un punto de partida, y modificaremos iterativamente las dos variables hasta obtener un ajuste. Como en todas las plataformas de JMP, si desea realizar acciones simultáneamente, si mantiene presionada la tecla Ctrl y hace clic en Ir, se ajustará iterativamente nuestra respuesta utilizando una fórmula de predicción para cada una de nuestras muestras.
Ahora pueden ver que la línea delgada se superpone a la línea gruesa, y hemos obtenido una convergencia en nuestro ajuste. Aquí están nuestras estimaciones de las variables Pₘₐₓ y k. Ahora queremos incorporarlas a una tabla de resumen. Si hago clic derecho y voy a "Crear tabla de datos combinados", se extraerán todos los datos de las variables de estos ajustes. Solo nos interesan las constantes de velocidad, así que queremos depurarlas un poco como parte del procesamiento de datos.
Queremos seleccionar todas las celdas que coincidan con Pₘₐₓ. No nos interesa Pₘₐₓ, así que podemos eliminar esas líneas. De nuevo, no necesitamos necesariamente esta columna de la tabla, y sabemos que el parámetro es k, así que también podemos cerrarla y limpiarla.
Tenemos nuestras estimaciones, nuestras constantes de tasa, los importes máximo y mínimo, y los intervalos de confianza máximo y mínimo. Para una mejor visualización, podríamos reordenar las estimaciones para que se ubiquen entre el mínimo y el máximo, y así obtener una buena tabla resumen. Supongamos que no necesitamos las demás tablas intermedias y queremos eliminarlas y cerrarlas sin guardar. Podemos registrar todos estos pasos en nuestro Generador de Flujos de Trabajo, y este es el resultado final.
Ahora podemos detener la grabación. Lo único que debemos hacer es revisar y asegurarnos de que todo funcione correctamente. Podemos recorrer cada paso paso a paso y asegurarnos de que haga lo que queremos y de que no haya errores. Pueden ver que cada vez que se ejecuta correctamente, obtenemos una marca verde, pero ahora tenemos un problema. Esto es bastante común al crear una tabla de datos combinados. Crea una nueva tabla llamada Sin título con un número. Cada vez que esto se repite, prolifera un número. El script busca un número muy específico de cuando creamos el Generador de flujos de trabajo.
Como puede ver, no encuentra Sin título 7, por lo que le pregunta cuál desea usar. Esto nos indica un pequeño problema que hemos solucionado. Necesitamos realizar un trabajo manual para que nuestro script funcione varias veces. Con un código muy simple, podemos resolverlo. Podemos abrir el script para cada paso. Si volvemos al último paso que se ejecutó correctamente, lo que queremos hacer es definir esta Tabla de Datos como una variable, para no depender de un número sin título; la llamaremos dt.
Decimos que "dt" es igual a "Tabla de Datos Actual". Lo que debemos hacer es continuar con cada paso siguiente. Donde sea que se solicite la tabla sin título, queremos reemplazarla con nuestra nueva variable. Esto puede ocurrir varias veces, así que solo necesitamos cambiar cada tabla sin título a "dt". Ya hemos escrito todas esas variables y luego las probaremos de nuevo para ver si funcionan. Puede que no sea la forma más elegante de hacerlo, pero nos permite crear nuestro propio script automatizado sobre cómo escribir código.
Si volvemos a repetir esto, ¿lo logramos esta vez? Me olvidé de una persona sin título 7. Hemos ejecutado correctamente ese script y ahora tenemos nuestra tabla de resumen. Podemos guardar este flujo de trabajo o hacer clic en la flecha roja y seleccionar Exportar y Guardar en la ventana de scripts. Como mencioné, queremos tener un script general reutilizable que pueda ser utilizado varias veces por diferentes científicos.
Por el momento, sigue siendo bastante específico, ya que abre archivos muy específicos. Con solo una línea de código más, podemos simplificarlo mucho. Voy a definir una variable F y simplemente escribiré "F igual a seleccionar archivo". Este comando nos permitirá seleccionar el archivo a usar si reemplazamos esta ruta específica con la variable F. Veamos si el script funciona.
Vamos a hacer clic en la flecha verde para ejecutar el script. Nos pide que seleccionemos nuestro archivo y veamos si funciona. Listo. Fue tan rápido que ni siquiera viste lo que pasó. Pero completó rápidamente todos los pasos que escribimos para trabajar con el generador y nos generó una tabla resumen. Esta es una forma de crear scripts reutilizables que automatizan el procesamiento de datos. Acabamos de realizar un proceso que me llevó 10 minutos mostrar antes, en segundos, y esto puede generar un ahorro de tiempo sustancial en I+D.
Ahora que hemos mostrado cómo generar el flujo de trabajo, veamos un ejemplo donde este procesa datos. Aquí tenemos un ensayo de actividad enzimática. Como ya se mencionó, este ensayo tendrá una lectura de fluorescencia. El trabajo del científico consiste en preparar una placa de ensayo. Esta placa contiene en amarillo las distintas muestras que se procesarán. Cada muestra se repite cinco veces en los pocillos.
Luego, tenemos una columna con controles positivos, cuya información se utiliza para extraer el parámetro Pₘₐₓ para el ajuste. Controles negativos, como debe ser en todo buen experimento, y una columna llamada dt, que proporciona la lectura de fluorescencia antes del inicio de la reacción, lo que permite evaluar el ruido de referencia, que puede restarse para alinear los datos con el punto cero del eje Y. En este punto, el usuario ha generado la placa. Esta se entrega a un lector de placas que permitirá que la reacción continúe, la procese, genere datos de fluorescencia y los registre en un archivo de Excel. Mientras tanto, el usuario habrá completado una tabla de identificación de muestra con la información relativa a cada muestra.
Aquí es donde entra en juego el proceso automatizado. Importará los datos de Excel y los combinará en la tabla de ID de muestra, de modo que cada pocillo se asocie con la muestra correcta. Se normalizarán el tiempo y la respuesta, de modo que los intervalos de tiempo comiencen en el tiempo cero y en el punto cero del eje Y. Se realizará el ajuste exponencial siguiendo la cinética que acabamos de describir. Se extraerá la velocidad de reacción, promediando cinco ejecuciones. Se excluirá la ejecución divergente, lo que arroja un N final de 4.
Luego, se utilizará una prueba estadística, como en este caso un ANOVA, para comparar los resultados de las distintas muestras. Una característica adicional es que tendremos una carpeta llamada "volcado de proceso" que se generará al inicio del proceso. En esta carpeta, se registrarán todos los pasos intermedios del proceso. Esto ayudará al científico a solucionar problemas en caso de que el proceso automatizado falle.
En esencia, el resultado consiste en tomar los datos sin procesar y convertirlos iterativamente en resultados inteligibles, representados en este ejemplo mediante un ANOVA. La primera vez que el experimentador utiliza este enfoque, puede tardar unos 45 minutos en generar el flujo de reducción de datos. Sin embargo, una vez que el script está listo, el flujo de reducción de datos puede ejecutarse en aproximadamente un minuto.
Si pensamos que nos tomó más de cien placas desarrollar uno de esos reactivos en el cartucho de reactivos que mostré al principio del seminario, entonces pueden imaginarse fácilmente que hemos ahorrado al menos 75 horas de nuestro proceso de desarrollo, acelerando el desarrollo de la tecnología XLEAP. Ahora vuelvo a JMP y muestro cómo funciona el proceso de datos de actividad enzimática. Estoy ejecutando el script. Este me pedirá que seleccione la carpeta y el archivo como se mostró anteriormente.
Aquí está, el archivo se ha abierto y exportado. Ahora tenemos algunos datos adicionales extraídos del archivo. En particular, se utilizarán los de la columna 2. Estos son los índices de fluorescencia en el tiempo cero, que se usarán para generar un fondo y alinear cada intervalo de tiempo con el punto cero en el eje y. En breve, se exportará esto, se normalizarán los datos y tendremos una tabla con los intervalos de tiempo normalizados. En cada uno de ellos, hemos impuesto la señal en el tiempo cero, que es aproximadamente del 1%, y ahora se apilarán estos datos.
Se añadirá un modelo, el modelo de predicción. Listo. El modelo, obviamente, considera cada punto temporal y cada pocillo de la placa, el tipo de fluorescencia que esperamos leer y lo compara con las lecturas reales. En un momento, se abrirá la interfaz de Ajuste No Lineal, que habilitará el ajuste automático de cada uno de estos intervalos de tiempo. Como mostró Elliot, los distintos intervalos de tiempo aparecen en la pantalla. Se ajustarán automáticamente en un segundo.
El parámetro de velocidad de reacción, k, se extraerá y tabulará automáticamente. El ajuste se realizó en todos los cursos de tiempo proporcionados, se extrajeron los datos y ahora el script indica que ya disponemos de datos presentados en formato ANOVA. Si se fijan en que la ejecución del script en cámara lenta tardó aproximadamente un minuto, lo que me permitió mostrarles paso a paso lo que sucedía. Una vez eliminada la cámara lenta, el script, como se mostró hace un minuto, se ejecuta enseguida y los datos están listos.
Nuestra presentación nos deja dos mensajes principales. El primero es que debemos trabajar de forma más inteligente, no más arduamente. Esperamos haberles convencido de que el uso de scripts JMP y el procesamiento automatizado de datos pueden aumentar significativamente su productividad en I+D. Podemos automatizar las tareas más tediosas, lo que permite a sus científicos e ingenieros tener más tiempo para analizar el significado de esos resultados e innovar en nuevos productos y procesos. Esperamos también haberles convencido de que se requiere una experiencia mínima.
En el ejemplo que mostré antes, solo necesitábamos dos líneas de JSL para crear un script reutilizable. El JMP Workflow Builder es una auténtica innovación que te permite escribir tus propios scripts personalizados sin necesidad de ser un experto en código JSL. También queremos agradecer las contribuciones de todos nuestros colegas, en particular a Steve Mason del equipo de química. Gracias a todos por su atención.
Gracias.