Priorización de blancos terapéuticos sobre una red multicapa

Propagar la poca evidencia experimental que hay entre organismos para ordenar un genoma completo por cuán prometedoras son sus proteínas como blanco de un fármaco, y usar la misma red para proponer el blanco de compuestos que no tienen ninguno.

corrida: 2026-09-24 16:32 python 3.12.11 · pandas 3.0.5 repositorio informe (PDF) presentación (PDF)

In English. Given a genome, rank its proteins as drug-target candidates by propagating scarce experimental evidence across a three-layer network (compounds, proteins, functional annotations). Evaluated leaving out all evidence of the organism being ranked, it beats chance in 16 of 16 organisms (median AUC01 0.645). Run on an integer-coded database; every number on this page is read from the result tables, and every figure is redrawn from them in about 40 s.

En una pantalla

16 de 16
organismos priorizados mejor que el azar, sin usar nada de su propia evidencia
0.645
AUC01 mediana (rango 0.581–0.849)
99.6 %
de los blancos recuperados cuando la semilla comparte una anotación con el blanco
68 %
de los compuestos sin ningún vecino químico con blanco: el cuello de botella

El problema es de mi propia investigación: dado un genoma, ordenar sus proteínas por cuán prometedoras son como blanco de un fármaco. La evidencia es escasa y está repartida de forma muy desigual entre organismos, así que la estrategia es propagar lo que se sabe sobre una red de tres capas —compuestos, proteínas y anotaciones funcionales— desde las proteínas con evidencia hacia las que no la tienen.

Datos y método

La base tiene 399 353 proteínas de 16 organismos con evidencia suficiente, 248 545 enlaces de bioactividad positiva y 769 661 afiliaciones a 14 083 dominios InterPro y 76 157 grupos de ortología. La evidencia por organismo va de 19 a 1 985 proteínas con actividad conocida: esa desigualdad es la premisa del método. La base publicada está codificada (toda columna es un entero; los diccionarios son privados) y recortada a las componentes químicas con alguna bioactividad positiva.

Evidencia disponible por organismo, en escala logarítmica en los dos ejes. Cada
Evidencia disponible por organismo, en escala logarítmica en los dos ejes. Cada punto es una especie, identificada por código y tipo de organismo.

Las anotaciones se puntúan por cuánto se enriquecen en blancos conocidos (Fisher unilateral, corregido por Benjamini–Hochberg) y esa puntuación pondera la propagación, que tiene cuatro parámetros: α (peso de la puntuación), β (penalización de las categorías grandes), λ y γ (cómo se combinan las categorías de una proteína). La métrica es la AUC01: el área bajo la ROC hasta FPR ≤ 0.10, corregida por McClish para que el azar valga 0.5. Sólo importa el extremo del ranking.

La validación es leave-one-species-out: para evaluar un organismo se le quita toda su evidencia a la semilla y se lo prioriza como si no se supiera nada de él. Una prueba dedicada (comun/tests/test_fuga.py) verifica que ninguna proteína del organismo evaluado sobrevive en la semilla.

1 · Priorización de genoma completo

Para cada organismo se barrieron las 120 combinaciones válidas de parámetros. En su óptimo la AUC01 mediana es 0.645 y los 16 organismos superan el azar. El orden no es arbitrario: los 4 primeros puestos son los 4 protozoos parásitos.

AUC01 en el óptimo de cada organismo, bajo leave-one-species-out. La línea punte
AUC01 en el óptimo de cada organismo, bajo leave-one-species-out. La línea punteada es el azar.
especiegrupoparasitoAUC01AUCalphabetalambda_gamma
T. cruziProtozoossí0.84940.88280110.8
T. bruceiProtozoossí0.78880.84440.31.5híbrido0.8
L. majorProtozoossí0.74290.858801.50.50.8
P. falciparumProtozoossí0.73650.84071.2110.8
A. thalianaPlantasno0.68340.8282010.50.8
C. elegansInvertebradosno0.66370.78080.31.510.8
D. discoideumAmebozoosno0.65210.87070110.8
C. albicansHongossí0.64530.86791.210.50.8
O. sativaPlantasno0.64430.84331.210.50.8
D. melanogasterInvertebradosno0.6140.8120110.8
M. musculusMamiferosno0.61090.81760.31híbrido0.8
H. sapiensMamiferosno0.59420.769400.510.8
S. aureusBacteriassí0.59120.87830.30.50.50.8
E. coliBacteriassí0.5880.82051.2110.8
S. cerevisiaeHongosno0.58130.74340.9000.8
M. tuberculosisBacteriassí0.58080.86591.21híbrido0.8

Óptimo por organismo. genome_prioritization/02_optimo_y_consistencia.ipynb.

El organismo foco, Plasmodium falciparum, en su óptimo: AUC global 0.841, AUC01
El organismo foco, Plasmodium falciparum, en su óptimo: AUC global 0.841, AUC01 0.736. A la derecha, el puntaje de propagación de las proteínas druggables frente al resto.

Qué decide el resultado

De los cuatro parámetros sólo β mueve la AUC01 de forma consistente: penalizar las categorías grandes mejora la priorización, y el óptimo tiene β > 0 en 15 de 16 organismos. Entre las diez mejores combinaciones de cada organismo, β = 1 aparece 2.45 veces más de lo que daría el azar y β = 0 apenas 0.25.

AUC01 de las 120 combinaciones por organismo, agrupadas por el valor de cada par
AUC01 de las 120 combinaciones por organismo, agrupadas por el valor de cada parámetro. En el panel de β, 0 es la red G'r y >0 la G'rk.

Qué tan firme es el óptimo

En todos los organismos las veinte mejores combinaciones quedan a menos del 2.1 % del máximo: el óptimo es una meseta, no un pico casual. Y el perfil de la grilla se parece entre organismos (Spearman mediana 0.64, positiva en el 85 % de los pares): los parámetros que funcionan en uno funcionan en los demás.

Caída de la AUC01 entre el óptimo y la K-ésima mejor combinación.
Caída de la AUC01 entre el óptimo y la K-ésima mejor combinación.
Concordancia entre organismos sobre el perfil de la grilla.
Concordancia entre organismos sobre el perfil de la grilla.

Sobre quién actúa β

Que β ayude no dice a costa de qué. Para aislarlo se fija el mejor (α, λ, γ) de cada organismo dentro de β = 1 y después se mueve sólo β a 0: lo único que cambia entre las dos corridas es la penalización. El grupo de prueba son las quinasas, el caso de libro de una categoría grande y promiscua (391 dominios, el 3.4 % de las proteínas de un genoma típico).

Apagar la penalización cuesta AUC01 en 15 de los 16 organismos (mediana 0.057, máximo 0.275), y lo que se pierde se ve en la cabeza del ranking: con β = 0, en 8 organismos las primeras cien posiciones se llenan de quinasas —hasta 37 veces más de las que daría el azar, y en varios casos el top-100 es enteramente quinasa—. Con β = 1 ese enriquecimiento no pasa de 3.5 en ningún organismo.

AUC01 con la penalización (β = 1) y sin ella (β = 0), a (α, λ, γ) fijos.
AUC01 con la penalización (β = 1) y sin ella (β = 0), a (α, λ, γ) fijos.
Quinasas en las primeras cien posiciones, contra las que daría el azar.
Quinasas en las primeras cien posiciones, contra las que daría el azar.

El desplazamiento es específico: al pasar de β = 0 a β = 1 las quinasas bajan en 15 de los 16 organismos (mediana 10.3 percentiles), mientras que la mediana del resto del genoma no se mueve de cero en ninguno. β no reordena el ranking entero: saca del tope a las proteínas que estaban ahí por compartir una anotación que comparte medio genoma.

Desplazamiento en percentiles al pasar de β = 0 a β = 1, separando quinasas del
Desplazamiento en percentiles al pasar de β = 0 a β = 1, separando quinasas del resto del genoma. Positivo = la proteína baja.

2 · Desorfanización de compuestos

La segunda pregunta invierte la dirección: dado un compuesto sin blanco conocido, proponer uno. Para medir el acierto se usan pseudohuérfanas, compuestos con exactamente un blanco conocido a los que se les borra toda su bioactividad; la semilla se arma desde su vecindario químico y se mide la posición relativa del blanco verdadero (frank, recuperado si < 0.1). Se evaluaron 7 782.

El blanco se recupera en el 17.5 % de los casos, y la causa está medida: la recuperación la decide la clase de semilla, no el modelo. El 68 % no tiene ningún vecino químico con blanco (semilla nula). Con semilla pero sin ninguna anotación en común con el blanco (1 144 casos), la recuperación es del 0.0 %; con al menos una (1 365), del 99.6 %.

Recuperación por clase de semilla.
Recuperación por clase de semilla.
Composición de la semilla por organismo: la fracción informativa (verde) es el t
Composición de la semilla por organismo: la fracción informativa (verde) es el techo del método.

La fracción informativa es un techo que ninguna reponderación de la red puede superar; por organismo va del 3.9 % al 33 %. Tres palancas para ampliar la semilla (subir el umbral de similitud, sumar KEGG, usar la actividad fenotípica) rescataron 0 de 500; las dos primeras no podían hacerlo en esta base.

Cuando hay semilla informativa

El 99.6 % dice poco: en la mediana de estos casos, frank < 0.1 es quedar entre las primeras ~656 proteínas del organismo. Mirando la posición absoluta, el blanco queda primero en el 30 % de los casos, en el top-10 en el 72 % y en el top-100 en el 93 % (el azar pondría en el top-10 al 0.13 %). Son dos poblaciones: en la inferencia directa (1 113; el blanco ya está en la semilla) la posición mediana es 2 y el top-10 llega al 79 %; en la indirecta (252; sólo por anotaciones) la mediana es 20 y el top-10, 40 %. Las semillas grandes diluyen la señal (ρ = 0.45, positiva en 11 de 11 organismos con casos suficientes). En el 40 % el blanco empata en puntaje con otras proteínas.

(a) Fracción con el blanco en el top-k de su organismo, frente al azar; la punte
(a) Fracción con el blanco en el top-k de su organismo, frente al azar; la punteada es frank = 0.1. (b) frank en escala log, con la mediana de cada clase.
(a) Tamaño de la semilla contra posición del blanco, con los dos ejes en la mism
(a) Tamaño de la semilla contra posición del blanco, con los dos ejes en la misma escala. (b) Posición por organismo, en seis organismos —uno por grupo—; la barra es la mediana y el violín, la distribución.

Hasta dónde confiar en el ranking

Sobre el ranking global, la recuperación acumulada tiene pendiente alta en las primeras posiciones y cae al ruido de fondo en r*G = 76: una propuesta más abajo no se distingue del azar. Es un corte operativo: con k_σ entre 2 y 4 va de 68 a 88. La inferencia directa (el blanco lo trae un vecino químico) es el 44 % de los casos y pone el blanco en la posición global mediana 40; la indirecta (sólo por anotaciones), el 56 %, lo pone en la 185 125. De los blancos recuperados, el 82 % lo trae un vecino químico.

Arriba: compuestos cuyo blanco cae antes de la posición l del ranking global. Ab
Arriba: compuestos cuyo blanco cae antes de la posición l del ranking global. Abajo: su derivada suavizada y el umbral λ∞ + 3σ que define r*G.

Aplicación al organismo foco. De 174 compuestos con actividad fenotípica contra Plasmodium falciparum, 3 no tienen blanco proteico y 3 tienen vecinos químicos con blanco; 2 reciben una propuesta por encima de r*G (2 sugerencias sobre 1 blanco distinto). Es un candidato para ensayar, no un resultado: el embudo es angosto porque la base está recortada.

3 · Contraste con la versión anterior (v4)

Este repositorio porta el análisis v4 a la base codificada y recortada. Las mismas tablas calculadas antes de los dos cambios quedaron como oráculo, con un único criterio: si el análisis toca la capa química, el recorte lo mueve; si no, no. En desorfanización cambia además por la corrección de un error que el oráculo tiene. Sobre 353 columnas: sin discrepancias

  • Priorización (sin química): 149 de 149 columnas idénticas; el control independiente coincide en 16 de 16 organismos, Δ AUC01 máx. = 0.
  • Desorfanización: 121 de 181 columnas cambian: semilla nula 83 → 68 %, recuperación 2.6 → 17.5 %, r*G 54 → 76. Casi todo es la corrección de la semilla, no el recorte: v4 corregida da las mismas clases de semilla para los compuestos compartidos. Los promiscuos filtrados pasan de 25 a 5, y en la base actual el filtro saca 0 aristas.
  • Descriptivos: 14 de 23 cambian, las que miden componentes químicas.

El port destapó cuatro filtros heredados que comparaban un entero codificado contra el texto que solía contener; ninguno lanzaba una excepción, y los encontraron las pruebas y esta comparación. Y un error que no era del port, sino heredado del código original: la semilla de un compuesto buscaba sus vecinos químicos con el id del compuesto en tablas indexadas por cluster, y como las numeraciones se solapan devolvía los vecinos de otro cluster. Se encontró en v4 y se corrigió con una prueba. Detalle en PROVENANCE.md.

Columnas comparadas contra el oráculo, por análisis. Verde: idéntica; ámbar: cam
Columnas comparadas contra el oráculo, por análisis. Verde: idéntica; ámbar: cambio explicado por el recorte (en desorfanización, también por la corrección de la semilla).

Verificarlo y reproducirlo

63 pruebas corren en menos de medio minuto: integridad de las tablas, ausencia de fuga, métricas contra valores de referencia, rutas, entorno, y que toda figura se dibuje sin tocar la base. Las tablas de la corrida están versionadas, así que las 38 figuras y todas las cifras de esta página se reproducen desde las tablas pregeneradas en alrededor de un minuto, sin volver a correr ningún modelo. Rehacer las tablas desde la base lleva unos 45 minutos con 20 procesos.

conda create -n TDR_GW python=3.12 && conda activate TDR_GW
pip install -r requirements.txt
make verificar     # pruebas + figuras desde las tablas + cifras del informe   ~1 min
make corrida       # los 10 notebooks, desde la base                          ~45 min
make entregables   # figuras, informe, presentación y esta página         ~1,5 min

Cada notebook deja un NN_meta.json junto a sus tablas con la fecha, los parámetros, la fecha de cada tabla de entrada y las versiones de python y pandas. Qué tablas lee cada figura y qué la verifica está en FIGURAS.md. El repositorio no reproduce la base misma ni la lista de compuestos promiscuos (las dos se derivan de datos privados y se versionan como insumo), ni los nombres legibles de las anotaciones ni la identidad de los organismos, que es deliberada.