Predicción de resultados de ensayos clínicos

Predicción de los resultados en los ensayos clínicos

Parte 2: Predicción de resultados de ensayos clínicos utilizando XGBoost

En la primera parte de esta serie me enfoqué en incrustar datos del mundo real multimodales derivados de ClinicalTrials.gov. En este artículo implementaré un modelo básico de XGBoost, lo entrenaré con las incrustaciones que creamos en Parte 1 y compararé su rendimiento con el del modelo HINT (una red neuronal de gráfico jerárquica) por el cual este proyecto se inspiró.

Esquema del flujo de trabajo (imagen del autor)

Estos son los pasos que seguiré en este artículo:

  • Cargar conjuntos de datos de entrenamiento, validación y prueba
  • Incrustar molécula(s) de medicamento, criterios de inclusión/exclusión, indicación(es) de enfermedad, patrocinador del ensayo y número de participantes
  • Definir métricas de evaluación
  • Entrenar el modelo XGBoost y comparar brevemente con el rendimiento del modelo HINT
Enfoque para la Parte 2 de esta serie: Predicción de resultados de ensayos clínicos basada en incrustaciones de características creadas en la <a href=Parte 1 (imagen del autor)” src=”https://ai.miximages.com/miro.medium.com/v2/resize:fit:640/format:webp/1*dLuTeQ_2qMrDUzamlbp1GQ.png”/>

Puedes seguir todos los pasos en este cuaderno de Jupyter: Tutorial de incrustación de ensayos clínicos.

Cargar conjuntos de datos de entrenamiento, validación y prueba

import osimport pandas as pdimport numpy as npimport pickle# Importar conjunto de datos de ejemplotoy_df = pd.read_pickle('data/toy_df_full.pkl')train_df = toy_df[toy_df['split'] == 'train']val_df = toy_df[toy_df['split'] == 'valid']test_df = toy_df[toy_df['split'] == 'test']y_train = train_df['label']y_val = val_df['label']y_test = test_df['label']print(train_df.shape, val_df.shape, test_df.shape)print(y_train.shape, y_val.shape, y_test.shape)### Salida:# (1028, 14) (146, 14) (295, 14)# (1028,) (146,) (295,)

Incrustar molécula de medicamento, protocolo, indicación y patrocinador del ensayo

En esta sección cargamos los diccionarios que creamos en Parte 1 de esta serie y los usamos para asignar los valores en los conjuntos de entrenamiento, validación y prueba a sus respectivas incrustaciones.

def incrustar_todo(df):    print('forma de entrada: ', df.shape)    ### Incrustar moléculas ###    print('incrustando moléculas de medicamento...')    nctid2molecule_embedding_dict = cargar_dict_incrustacion_nctid2molecule()    h_m = np.stack(df['nctid'].map(nctid2molecule_embedding_dict))     print(f"moléculas de medicamento incrustadas correctamente en {h_m.shape} dimensiones")    ### Incrustar protocolos ###    print('incrustando protocolos...')    nctid2protocol_embedding_dict = cargar_dict_incrustacion_nctid2protocol()    h_p = np.stack(df['nctid'].map(nctid2protocol_embedding_dict))    print(f"protocolos incrustados correctamente en {h_p.shape} dimensiones")    ### Incrustar indicaciones de enfermedad ###    print('incrustando indicaciones de enfermedad...')    nctid2disease_embedding_dict = cargar_dict_incrustacion_nctid2disease()    h_d = np.stack(df['nctid'].map(nctid2disease_embedding_dict))    print(f"indicaciones de enfermedad incrustadas correctamente en {h_d.shape} dimensiones")    ### Incrustar patrocinadores del ensayo ###    print('incrustando patrocinadores...')    sponsor2embedding_dict = cargar_dict_incrustacion_sponsor()    h_s = np.stack(df['lead_sponsor'].map(sponsor2embedding_dict))    print(f"patrocinadores incrustados correctamente en {h_s.shape} dimensiones")    ### Incrustar inscripción ###    print('normalizando números de inscripción...')    inscripcion = pd.to_numeric(df['inscripcion'] , errors='coerce')    if inscripcion.isna().sum() != 0:        print(f"llenando {inscripcion.isna().sum()} NaNs con el valor medio")        inscripcion.fillna(int(inscripcion.median()), inplace=True)        print(f"NaNs llenados correctamente con el valor medio: quedan {inscripcion.isna().sum()} NaNs")    inscripcion = inscripcion.astype(int)    h_e = np.array((inscripcion - inscripcion.mean())/inscripcion.std()).reshape(len(df),-1)    print(f"inscripción incrustada correctamente en {h_e.shape} dimensiones")    ### COMBINAR TODAS LAS INCRUSTACIONES ###    df_incrustado = pd.DataFrame(data=np.column_stack((h_m, h_p, h_d, h_s, h_e)))    print('forma de salida: ', df_incrustado.shape)    return df_incrustado# Incrustar datosX_train = incrustar_todo(train_df)X_val = incrustar_todo(val_df)X_test = incrustar_todo(test_df)

Definir métricas de evaluación

Utilizaremos las mismas métricas de evaluación propuestas en el artículo HINT: ROC AUC, F1, PR-AUC, Precisión, Recall y Exactitud.

Entrenar modelo XGBoost y predecir etiquetas de entrenamiento, validación y prueba

import xgboost as xgb# Crear un clasificador XGBoost con hiperparámetros especificadosxgb_classifier = xgb.XGBClassifier(    learning_rate=0.1,    max_depth=3,    n_estimators=200,    objective='binary:logistic',  # para clasificación binaria    random_state=42)# Entrenar el modelo XGBoostxgb_classifier.fit(X_train, y_train)# Realizar prediccionesy_train_pred = xgb_classifier.predict(X_train)y_val_pred = xgb_classifier.predict(X_val)y_test_pred = xgb_classifier.predict(X_test)print('-----------Resultados en datos de entrenamiento:-----------')print_results(y_train_pred, y_train)print('-----------Resultados en datos de validación:-----------')print_results(y_val_pred, y_val)print('-----------Resultados en datos de prueba:-----------')print_results(y_test_pred, y_test)### Resultado:#-----------Resultados en datos de entrenamiento:-----------# ROC AUC: 1.0# F1: 1.0# PR-AUC: 1.0# Precisión: 1.0# Recall: 1.0# Exactitud: 1.0# Ratio de predicciones 1: 0.661# Ratio de etiquetas 1: 0.661# -----------Resultados en datos de validación:-----------# ROC AUC: 0.765# F1: 0.817# PR-AUC: 0.799# Precisión: 0.840# Recall: 0.795# Exactitud: 0.773# Ratio de predicciones 1: 0.602# Ratio de etiquetas 1: 0.636# -----------Resultados en datos de prueba:-----------# ROC AUC: 0.742# F1: 0.805# PR-AUC: 0.757# Precisión: 0.790# Recall: 0.821# Exactitud: 0.759# Ratio de predicciones 1: 0.630# Ratio de etiquetas 1: 0.606

Comparar rendimiento con el modelo HINT

Este modelo simple de XGBoost fue entrenado con incrustaciones de características para moléculas de fármacos, criterios de inclusión/exclusión, indicaciones de enfermedad, patrocinador del ensayo y número de participantes, mientras que los autores de HINT no utilizaron las dos últimas características: patrocinador del ensayo y número de participantes. Utilizamos varias herramientas grandes de incrustaciones de modelos de lenguaje como BioBERT y SBERT, y utilizamos codificación Morgan para las representaciones de fármacos, mientras que los autores de HINT utilizaron una variedad de redes neuronales para todas sus incrustaciones.

Podemos ver en la figura a continuación que nuestras incrustaciones de características, entrenadas por un modelo simple de XGBoost, funcionan bastante bien en comparación con el modelo HINT más sofisticado. Nuestro proyecto tiene una mejor precisión y exactitud en este conjunto de datos, pero un menor recall.

Comparación del rendimiento de este proyecto con el proyecto HINT (imagen del autor)

Conclusión

Los siguientes pasos podrían incluir realizar un análisis para determinar en qué medida la adición de las características del patrocinador del ensayo y el número de participantes contribuyen al mejor rendimiento (en algunas métricas) en comparación con otros factores, como la elección del modelo y las técnicas de incrustación. Intuitivamente, parece que estas características podrían mejorar el rendimiento predictivo, ya que algunos patrocinadores históricamente han tenido un mejor desempeño que otros, y también se podría esperar una relación entre el tamaño del ensayo y el resultado.

Ahora te preguntarás: “¿Cuál es la utilidad de un modelo predictivo como este? ¿No podemos confiar en dicho modelo y renunciar a realizar el ensayo?” Y tienes razón (aunque algunas empresas están creando gemelos digitales de pacientes con el objetivo de realizar ensayos de manera virtual). Un modelo como el presentado en esta serie podría utilizarse, por ejemplo, para mejorar el análisis de potencia de ensayos clínicos, una práctica estadística relacionada. Un análisis de potencia se utiliza para determinar el número óptimo de participantes a inscribir en un ensayo específico, y se debe realizar una suposición sólida sobre el efecto del tratamiento para llevar a cabo dicho análisis. Un modelo predictivo que utiliza información del ensayo, como la estructura de la molécula del fármaco, la indicación de enfermedad y los criterios de elegibilidad del ensayo, como el modelo que implementamos aquí, puede ayudar potencialmente a crear un análisis de potencia más preciso.

Referencias

  • Fu, Tianfan, et al. “Hint: Red de interacción jerárquica para predicciones de resultados de ensayos clínicos”. Patterns 3.4 (2022).

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Microsoft presenta Python en Excel uniendo habilidades analíticas con familiaridad para mejorar la comprensión de los datos.

El ámbito del análisis de datos ha luchado durante mucho tiempo por integrar de manera fluida las capacidades de Pyth...

Ciencias de la Computación

Singapur planea una red nacional para protegerse contra futuras amenazas cuánticas.

Las empresas de telecomunicaciones en Singapur planean renovar las redes de fibra existentes para protegerse a sí mis...

Inteligencia Artificial

Nueva York planea invertir 1.000 millones de dólares para expandir la investigación de chips

La medida tiene como objetivo atraer $9 mil millones de inversión corporativa, ya que Nueva York lucha por ser sede d...

Inteligencia Artificial

Automatiza la creación de subtítulos y la búsqueda de imágenes a escala empresarial utilizando la inteligencia artificial generativa y Amazon Kendra

Amazon Kendra es un servicio de búsqueda inteligente impulsado por aprendizaje automático (ML). Amazon Kendra redefin...

Inteligencia Artificial

Científicos desarrollan una forma más eficiente de transmitir datos entre dispositivos

Los investigadores demostraron un método de menor potencia para transmitir datos a corta distancia mientras se mantie...