Los datos del proyecto: contenido, defectos y linaje

Qué contiene cada archivo, qué defectos tiene y de dónde sale cada número

Qué contiene cada archivo que entregó la patrocinadora, qué defectos se conocen y cómo llega cada número a la matriz del modelo. Reúne en un solo lugar lo que dicen los dos diccionarios de la patrocinadora y lo que el equipo midió por su cuenta.

Las cifras de identidad y de defectos coinciden con nuestro cálculo independiente desde el CSV con RDKit, lo que sirve como verificación cruzada en ambos sentidos. Los originales: permeabilidad BBB y actividad en SNC. De dónde viene cada fuente y bajo qué licencia, en procedencia y licencias; si un término no se entiende, el glosario.

De la fuente a la matriz del modelo

flowchart TD
    subgraph fuentes["Datos de la patrocinadora"]
        BBB["bbb_permeability_experimental.csv<br/>7,811 filas · deriva de B3DB<br/>cruzado con COCONUT"]
        SNC["snc_activity_…_Entrenamiento.csv<br/>202,647 registros · ChEMBL + NPASS + CMAUP"]
        DIA["etiquetas_dianas.csv<br/>39 dianas con gen y enfermedad"]
    end

    subgraph e1["Etapa 1 · permeabilidad"]
        B1["7,805 con clase asignada<br/>6 filas sin clase se excluyen"]
        B2["4,018 esqueletos de conectividad<br/>el tamaño efectivo, no 7,805"]
        B3["217 descriptores RDKit → 203 utilizables<br/>más ECFP4 de 2,048 bits"]
        B4["Partición por andamio<br/>5,557 / 749 / 1,499 · sin fuga"]
    end

    subgraph e2["Etapa 2 · actividad"]
        S1["114,549 registros con categoría de diana<br/>109,264 etiquetados · 88,098 fenotípicos aparte"]
        S2["99,585 esqueletos de conectividad"]
        S3["Cohorte descriptiva previa a partición<br/>71,145 pares · regla provisional"]
    end

    BBB --> B1 --> B2 --> B3 --> B4
    SNC --> S1 --> S2 --> S3
    DIA --> S1
    B4 --> M["Modelo etapa 1"]
    S3 -. "tras resolver discordancias<br/>y definir la partición" .-> N["Modelo etapa 2"]
    M --> P["Priorización con atribución<br/>a fragmentos"]
    N --> P
    B2 -. "solo 1,033 esqueletos<br/>en ambos conjuntos" .- S2

La línea punteada es el hallazgo del EDA de la etapa 2: los dos conjuntos casi no comparten compuestos. Solo 1,033 esqueletos tienen medición en ambos, el 1.0% del conjunto de actividad y el 25.7% del de permeabilidad. Por eso la etapa 1 no opera como filtro duro: para el 99% de los esqueletos con actividad no hay permeabilidad medida, y filtrar con una predicción sin verificar eliminaría candidatos con actividad documentada. Es también el único subconjunto donde se puede comprobar contra datos reales si combinar las dos predicciones ayuda. El diccionario dice que las dos tablas son independientes y no hace falta cruzarlas: es cierto a nivel de filas, pero no contempla este uso, que motiva la decisión C.3.

Etapa 1 · permeabilidad

Todo viene de B3DB. El único añadido de la patrocinadora es la estructura estandarizada, el esqueleto de conectividad precalculado y el cruce con COCONUT, y reúne la clasificación y la regresión en un solo archivo.

Dato Valor
Filas totales 7,811 (7,805 con clase asignada)
BBB+ / BBB− 4,956 (63.5%) / 2,849 (36.5%)
Con valor numérico de logBB (en las 7,805) 1,052
Esqueletos de conectividad distintos 4,018 en las 7,805 filas con clase; 4,019 en las 7,811
Producto natural exacto en COCONUT 3,366 filas

El tamaño efectivo es el número de esqueletos, no el de filas. Casi la mitad de las filas repiten un esqueleto ya presente (la misma molécula base, medida o escrita de otra forma), así que 7,805 sobreestima cuánta información independiente hay. Al reportar el tamaño del conjunto se dan siempre las dos cifras. La diferencia entre 4,018 y 4,019 es un esqueleto que solo aparece entre las seis filas sin clase.

Identidad

El archivo trae 7,808 InChIKey distintos sobre 7,811 filas: 3 se repiten —ampicilina con sultamicilina, colestipol, probenecid— y en los tres casos ambas filas coinciden en la clase.

Los nombres no son identificadores. Hay una fila llamada «ritonavir» cuya estructura es etambutol sin estereoquímica: cinco filas con ese nombre y cuatro esqueletos distintos. El identificador es inchikey o smiles_std, recalculado, nunca el nombre ni el texto del SMILES.

Las categorías A–D

B3DB dice que caracterizan la incertidumbre de las mediciones, pero no publica el criterio. El diccionario lo examina sobre los datos y concluye:

No es una escala de calidad A > B > C > D. En clasificación el grupo indica de qué tipo de dato salió la etiqueta. En regresión indica cuántas mediciones independientes hay, y ahí el grupo A es el de menos respaldo, con una sola medida.

Filtrar «solo A» no tiene respaldo documentado.

Grupo Filas Qué indica en clasificación % BBB−
A 1,058 Tienen logBB numérico (1,052 de ellas en las 7,805) 12.1%
B 3,621 Las fuentes declararon el umbral −1 y coincidieron 31.3%
C 3,075 Coinciden en la etiqueta, sin declarar umbral; mediana de una referencia 50.0%
D 51 Igual que C, pero con mediana de tres referencias: más respaldo, no etiquetas contradictorias 92.2%

Al revisar los duplicados exactos del archivo, ninguno tiene etiquetas en conflicto. Las dos columnas de grupo, clasificación y regresión, no son comparables entre sí: los 1,058 compuestos presentes en ambos archivos son todos grupo A en clasificación, pero en regresión se reparten entre los cuatro y difieren en el 77% de los casos.

No se filtra por grupo: quedarse con A+B baja la clase BBB− del 36.5% al 27.0%, así que se usa para describir y estratificar. El razonamiento completo está en la decisión 1.1.

Origen natural

El diccionario distingue tres categorías, no dos:

Compuestos
Producto natural exacto, estereoquímica incluida 3,366
Análogo que difiere solo en estereoquímica 1,005
Sin equivalente natural conocido 3,440

Toda cifra por origen debe declarar cuál usa y sobre qué base: las tres categorías cuentan sobre las 7,811 filas, y las comparaciones de abajo sobre las 7,805 con clase, por eso 1,005 + 3,440 = 4,445 y no 4,439. La alerta PAINS da 7.5% contra 3.6% con coincidencia exacta, y 6.9% contra 3.2% por esqueleto.

Los productos naturales cruzan la barrera menos.

Grupo Compuestos % BBB+
Sin equivalente natural exacto (incluye análogos, así que no todos son sintéticos en sentido estricto) 4,439 71.7%
Productos naturales (estructura idéntica en COCONUT) 3,366 52.7%

La diferencia es de 19 puntos contra todo el resto, y de 28.3 contra los compuestos sin equivalente natural (52.7% contra 81.0% BBB+): el resto mezcla esos compuestos con 1,003 análogos estereoquímicos que cruzan todavía menos (39.7%) (notebook 01, sección 5). La regla fisicoquímica clásica (TPSA < 67 Ų y HBD ≤ 1) no alcanza para explicarla: a igual cumplimiento de la regla, los naturales siguen cruzando menos (80.9% contra 90.9% entre los que la cumplen; 37.8% contra 72.6% entre los que no). Además, la brecha casi no existe en el grupo A de B3DB (87.6% contra 88.4% BBB+, con logBB medido) y sí en B y C, de modo que puede reflejar de dónde viene la etiqueta (decisión 1.6). Quedan en juego el eflujo activo, descriptores no medidos o un sesgo en qué compuestos se han llegado a ensayar. Como los naturales son justo lo que el proyecto quiere priorizar, el desempeño se reporta por separado para naturales y para el resto, y dentro de cada grupo de B3DB: un buen número global podría esconder que le va peor justo ahí.

Reglas fisicoquímicas sobre nuestros datos

El umbral clásico de TPSA es ≤ 90 Ų. La literatura reporta un óptimo más estricto, 66.8 Ų, y una regla de dos condiciones, TPSA < 67 Ų y HBD ≤ 1, con 96.6% de precisión para BBB+. Verificada sobre los datos de este proyecto (Avance 1):

Conjunto Regla TPSA < 67 Ų y HBD ≤ 1 Lectura
Grupo A (subconjunto con logBB, el de la literatura) precisión 0.966 · sensibilidad 0.589 · AUC 0.720 reproduce la cifra publicada, pero solo marca como BBB+ al 54% de los compuestos
Conjunto completo (7,805) precisión 0.853 · sensibilidad 0.515 · AUC 0.680 el AUC queda por debajo de TPSA < 90 Ų (0.729) y de TPSA < 67 Ų sola (0.701)

La regla es muy precisa cuando acierta, pero no supera a las alternativas simples en todo el conjunto: sirve como referencia obligatoria y como verificación de las explicaciones del modelo, no como modelo ganador. Y el umbral óptimo no es una constante: cambia con el subconjunto que lo calcula, 66.6 Ų en el grupo A, 83.6 en A+B, 101.9 en el conjunto completo y 107.0 solo con entrenamiento (Avance 2), y aún no tiene intervalos de confianza. Hay que decir siempre sobre qué datos se calculó.

Por qué la partición agrupa por andamio

En nuestros datos la misma molécula base aparece repetida: la morfina está ocho veces, como estereoisómeros distintos o con nombres distintos. Y hay grupos enteros que comparten andamio y casi siempre la misma etiqueta: uno de 410 compuestos es 99.5% BBB+. Con una partición aleatoria, el modelo solo necesitaría reconocer el andamio, sin aprender la relación real entre estructura y permeabilidad, y nadie lo notaría.

Defectos conocidos

  • 2 compuestos de B3DB no sobreviven: mepenzolato y tiotidina, con un carbono de carga imposible que RDKit rechaza. La patrocinadora ya los excluyó, de modo que los 7,811 SMILES de su archivo son válidos. Solo aparecen en los archivos crudos de B3DB.
  • 6 filas traen logBB sin clase —zidovudina, miltefosina y otras cuatro—: tienen clase en B3DB, pero su fila de clasificación registra otra forma estereoquímica y no empató al unir. Se excluyen del entrenamiento de clasificación (decisión 1.4).
  • 131 esqueletos tienen clases contradictorias, que afectan 429 filas. El ejemplo del diccionario: el meso-etambutol es BBB+ y los demás isómeros, BBB−. Hay que decidir si es un caso genuino de «la forma exacta importa» o un error de etiquetado.
  • El nombre no identifica al compuesto, y una de cada siete filas no trae ninguno. 1,109 filas (el 14.2%) tienen el nombre vacío y otras siete dicen solo «-». Entre las que sí lo traen, 347 nombres (el 6.8% de los 5,091 distintos) apuntan a más de una estructura y abarcan 945 filas; al revés, 1,075 esqueletos cargan más de un nombre. Las cifras dependen de cómo se normaliza el nombre, así que la normalización queda declarada en scripts/cifras_nombres_fase1.py, que las imprime y trae la tabla de las cuatro variantes. «ritonavir» aparece con cuatro estructuras, y una de ellas es etambutol —C10H24N2O2, 204 de peso molecular, sin un solo anillo— cuando el ritonavir real es C37H48N6O5S2 con dos tiazoles. El modelo nunca ve el nombre, así que esto no lo confunde al entrenar; importa para cualquier cruce por nombre, que es justo lo que bloquea el conjunto externo de Spielvogel, y para leer el defecto anterior.
  • 112 esqueletos tienen más de una medición de logBB, y de ellos 40 con valores distintos, con diferencias de hasta 1.4 unidades logarítmicas. El diccionario dice «más de un valor», pero 72 de los 112 repiten el mismo número: el desacuerdo real es 2.8 veces menor de lo que sugiere la cifra.

De los 131 esqueletos contradictorios, 26 llevan un solo nombre y 105 llevan varios, lo que por sí solo es esperable: el etambutol y el meso-etambutol son nombres distintos de la misma conectividad. Lo que de verdad separa los casos es si el nombre se reutiliza: 42 de los 131 usan un nombre que el archivo asigna además a otra estructura, repartidos en 34 de los 105 y 8 de los 26. Ahí lo que está en duda es la identidad de la fila antes que su etiqueta, y los 26 de un solo nombre no son todos el caso limpio.

Los dos últimos ponen un límite teórico a cualquier modelo que agrupe por esqueleto: si dos estereoisómeros comparten estructura y llevan etiquetas opuestas, ninguno acierta ambas. Para las 131 clases contradictorias el mínimo de errores inevitables es de 151 compuestos sobre 7,805, un techo de exactitud del 98.1% que no restringe a ningún modelo realista. Para el logBB el efecto no está cuantificado.

Etapa 2 · actividad en el sistema nervioso

El archivo (snc_activity_crudo_v3_final_2026-09-25_Entrenamiento.csv) combina tres fuentes: ChEMBL (bioactividad de moléculas tipo fármaco), NPASS y CMAUP (productos naturales). Pesa 74 MB y se versiona con Git LFS.

Archivo completo y archivo recibido. El diccionario describe 225,513 registros; recibimos 202,647, el 89.9%. El sufijo _Entrenamiento y esa diferencia indican que existe una partición reservada, pendiente de confirmar. Las cifras del diccionario son del archivo completo y las del resto del sitio son del nuestro: 114,549 registros con diana en vez de 121,522, y 88,098 sin diana en vez de 98,298. Cada cifra declara cuál usa.

Dato (archivo recibido) Valor
Registros de actividad (cada fila es una medición, no un compuesto distinto) 202,647
Compuestos únicos (por InChIKey) 105,583
De ChEMBL 103,877
De NPASS y CMAUP (productos naturales) 4,472
En ambos grupos a la vez 2,766
Registros con pChEMBL 129,243
Registros de inactividad declarada 29,730

Las dianas

37 dianas identificadas por gen con 121,522 filas en el archivo completo, más dos receptores completos —NMDA y GABA-A— que ChEMBL registra sin especificar subunidad, con 3,112. Las 39 filas del archivo de etiquetas se curaron a mano desde la farmacología conocida, no vienen de las bases: la categoría es la enfermedad con más respaldo (fármaco aprobado primero, luego evidencia genética o investigación clínica) y describe la intención terapéutica, no necesariamente lo que ocurrió en cada ensayo. Se agrupan en SNC clásico (20), neuroinflamación (10), Parkinson / ELA / Huntington (7) y receptores completos (2).

La cobertura es muy desigual: Alzheimer reúne 52,676 registros y ELA solo 53. Cuatro dianas no sostienen un modelo propio:

Gen Diana Filas
GABRG2 Receptor GABA-A, subunidad γ2 0
AIF1 Iba1, marcador sin dirección de efecto 0
GABRB2 Receptor GABA-A, subunidad β2 1
TARDBP TDP-43 8 en el archivo completo

El 43.5% de las filas (88,098) no corresponde a ninguna diana de la lista (44% en el archivo completo, 98,298): entraron por la ruta neuronal_assay, ensayos fenotípicos sobre sistemas celulares neuronales donde se midió un efecto sin identificar la proteína. Qué hacer con ellas es la decisión 2.4.

Cómo se mide la actividad

  • NPASS y CMAUP no traen pChEMBL (15,293 registros), porque solo ChEMBL lo calcula. Etiquetar solo por pChEMBL dejaría fuera justo los productos naturales, de ahí el etiquetado por tres vías de la decisión 2.3, pendiente de ratificar.
  • Las unidades no están convertidas a una sola escala: la mayoría está en nM, pero hay 29,880 registros en µM y 662 en unidades de masa (µg/mL y similares) que no se pueden pasar a concentración molar sin el peso molecular de cada compuesto.
  • Las mediciones censuradas dicen «mayor a 10 µM» en vez de dar un número: es un límite inferior, y solo sirve como negativo si el límite es igual o mayor que el umbral de «activo» que se use. En el archivo recibido son 54,498 filas con >, >= o >>, y ninguna de ellas trae pChEMBL.

Con un umbral de 1 µM el 98% de esas filas son negativos seguros; con 10 µM, el 89%; con 100 µM, solo el 12% (la tabla completa está en la decisión 2.3). Cuanto más estricto el umbral, más censurados se recuperan: con 1 µM (pChEMBL ≥ 6) se obtienen 4,879 negativos más que con 10 µM. En regresión no deben usarse como valores exactos: el diccionario pide excluirlas o usar un método para valores censurados. De las 36,653 filas con límite de 10 µM, 29,730 vienen de un solo documento de ChEMBL (CHEMBL1909046, el panel DrugMatrix): una sola campaña concentra la mayor parte de la evidencia censurada, y es la razón por la que la decisión 2.3 las deja fuera.

Dos de estas cifras venían de la sección 7 del diccionario, que describe el archivo completo de 225,513 registros: decía 61,001 censuradas y 41,291 con límite de 10 µM. Las de aquí son del archivo recibido, que es el que verá el modelo.

  • No hay límite de censura único: hay 333. Los más frecuentes, quitando los inactivos por texto, son 10 µM (6,923 filas), 100 µM (5,105), 1 µM (2,954), 30 µM (1,678) y 50 µM (1,628). Y el límite cambia por diana, cien veces: 1 µM en LRRK2, 10 en DRD2 y GSK3B, 30–40 en MAOA, MAOB y PTGS2, 50 en ACHE y BCHE, 100 en NOS2. Es el mismo orden que las medianas de potencia de abajo, o sea que los experimentadores ya usaban un umbral por diana. Como frontera de decisión no sirve —está condicionado al fracaso, porque es el techo de los ensayos que no encontraron nada—, pero sí informa qué tan difícil es cada diana.

Qué denominador usa cada porcentaje

Los porcentajes de actividad dependen de la unidad: 61.7% con pChEMBL ≥ 5 corresponde a 119,835 activos entre 194,086 registros etiquetados e incluye ensayos fenotípicos. Para los 71,145 pares únicos de esqueleto de conectividad × gen, el recuento exploratorio da 70.5% (50,177 pares activos) al clasificar como activo un par con al menos una observación activa. No son el mismo denominador, y la primera cifra no describe el conjunto por diana. Esa agrupación no es un andamio Bemis–Murcko, cuenta como activos pares con observaciones discordantes y todavía debe revisarse; la cohorte también está pendiente de partición. Los conteos de ambos umbrales y las exclusiones están en la decisión 2.3 y se calculan en el EDA de actividad SNC.

Defectos conocidos del archivo de actividad

  • inchikey_source viene vacío en los 187,354 registros de ChEMBL y solo trae valor en los de NPASS y CMAUP. Así que no sirve para cruzar fuentes: cualquier solapamiento entre naturales y ChEMBL hay que calcularlo desde smiles_raw, que sí está en los 202,647 registros y resuelve a 108,068 estructuras únicas. Contado por inchikey_source hay 4,174 esqueletos naturales; contado por estructura, 4,172, porque dos SMILES no parsean.

  • El archivo no trae ninguna columna de origen natural. Lo más cercano es source, y no separa limpiamente: el 65.4% de los esqueletos naturales (2,727 de 4,172) aparece también en ChEMBL y solo 1,445 son exclusivos de NPASS y CMAUP. Es la decisión 2.8.

  • Las 29,730 filas con texto Not active son un solo documento de ChEMBL, CHEMBL1909046, repartido en 20 ensayos sobre 6 dianas. Todas están censuradas con > y todas con límite de 10 µM, así que están dentro de las 54,498 censuradas y no se suman aparte. Y el documento es un panel de toxicogenómica, DrugMatrix: 30,805 filas sobre 729 compuestos. O sea que el bloque más grande de «inactivos» del archivo contesta «¿este compuesto perturbó esta diana en un tamiz de toxicidad?», no «¿es candidato neuroprotector?». A 10 µM esa sola referencia aporta el 61% de los negativos seguros por registro; por par compuesto-diana aporta el 10.8%, porque son 772 compuestos, y la propuesta de variable objetivo la deja fuera de la definición principal, con lo que baja al 0.1% (decisión 2.3).

  • El contexto del ensayo está ausente justo en las filas que se modelan, y no es dato faltante. Las columnas assay_type, assay_format, assay_tissue_raw y assay_cell_type_raw dependen por completo de la ruta por la que entró la fila:

    selection_route Filas Con formato de ensayo
    neuronal_assay 93,204 89,470 · 96.0%
    both 803 784 · 97.6%
    cns_target 108,640 0 · 0.0%

    Son dos rutas anotadas de forma distinta al construir el archivo, y cns_target es la ruta de casi todas las dianas de la lista. NPASS y CMAUP no traen assay_type en ninguna fila. Por qué importa: la patrocinadora pidió revisar cómo se distribuyen los registros por tejido y tipo de experimento antes de decidir el etiquetado, y sobre la población que se modela esa revisión no se puede hacer. Tampoco se puede concluir lo contrario: el vacío no demuestra que el tejido no influya, porque el experimento ocurrió en algún tejido y lo que falta es la columna. Está pedido a Jorge Uribe (acta de la reunión, documento interno). Lo que sí está en el 100% de las filas es assay_chembl_id y reference_id.

  • La potencia no es comparable entre fuentes, y ahí está el riesgo del etiquetado. Mediana de las mediciones exactas: ChEMBL 0.335 µM, CMAUP 4.47, NPASS 6.56 — veinte veces. Fracción en 10 µM o menos: 85.9%, 64.4% y 57.8%. Así que un corte en 10 µM cae casi en la mediana de NPASS y a treinta veces de la de ChEMBL: para los naturales la etiqueta la decide el ruido de medición, para ChEMBL es estable. Es la preocupación de la patrocinadora sobre comparabilidad, en la forma que sí se puede medir.

  • Tampoco es comparable entre dianas, y la diferencia es de 241 veces. Mediana de pActividad por diana, de LRRK2 7.40 a NFE2L2 5.02. Con el mismo corte de 10 µM, LRRK2 queda con 98.1% de pares activos y NFE2L2 con 50.7%: la etiqueta significa cosas distintas según la diana, y en LRRK2 es casi constante. Las dos dianas de estrés oxidativo, NFE2L2 y KEAP1, están en el extremo de potencia baja, que es parte de por qué los naturales salen menos activos.

  • La variabilidad entre ensayos está dentro de ChEMBL, no entre bases. En las cinco categorías, ChEMBL solo aporta 99,415 filas repartidas en 8,984 ensayos y 4,779 referencias, con 2,704 ensayos que aportan una sola fila. El desacuerdo entre mediciones del mismo par es ligeramente peor en ChEMBL solo (28.7% de los pares con más de una medición discrepan más de 10×) que juntando las tres fuentes (26.0%). Por qué importa: quedarse solo con ChEMBL no compra comparabilidad, solo homogeneidad de la etiqueta de procedencia.

  • No hay columna de desenlace. Ninguna de las 40 columnas registra si un compuesto funcionó: todo lo que hay son mediciones de potencia. Por qué importa: un umbral de «activo» no es estimable sin algo contra lo que discriminar, así que se elige y se declara, no se descubre. Es lo que la patrocinadora pidió —«a partir de qué valor ya se vuelve algo significativo»— y la razón de la petición P4 del acta.

  • El eje de toxicidad casi no existe. Hay 925 filas con desenlace citotóxico (GI50, TGI, CC50, ID50, MIC, MNTD) y 483 con assay_type de toxicidad, de 202,647. Solo 203 compuestos tienen a la vez una medición de eficacia y una citotóxica, contra 85,685 con eficacia. Por qué importa: no se puede calcular una ventana terapéutica, que es lo que distingue un compuesto útil de uno que simplemente mata la célula. No está contaminando la etiqueta actual —solo 7 pares se sustentan únicamente en citotoxicidad— pero sí limita qué puede significar el ranking final.

Lo que los diccionarios no documentan

  • Si los Not active declarados por texto son negativos confiables.
  • Qué criterio de «activo» usa la patrocinadora.
  • Por qué el recorte dejó fuera los ensayos de citotoxicidad de los mismos compuestos.
  • Qué error pesa más en el laboratorio.

Son parte de la ruta del proyecto.

Volver arriba