# Predictor ypN0 — Riesgo de respuesta nodal patológica completa tras NAC

> Proyecto: Sergio Cervera · Compilado: 2026-05-12 · 2 niveles operativos + roadmap Nivel 3
> **Pregunta clínica:** ¿Cuál es la probabilidad de que esta paciente cN+ alcance ypN0 tras la quimioterapia neoadyuvante que se le va a administrar?

---

## ⚡ Inicio rápido (60 segundos)

```bash
# Opción 1: Python (instantáneo)
python3 nivel1_calculadora/predictor.py
```
```bash
# Opción 2: Excel (sin código)
abrir nivel1_calculadora/predictor_ypN0.xlsx
```
```bash
# Opción 3: Navegador (cero instalación, móvil OK)
abrir nivel1_calculadora/predictor.html
```

**Resultados de demo (verificados):**

| Caso clínico típico | Probabilidad ypN0 | Banda |
|---|--:|---|
| TNBC joven cN1 + pembrolizumab + carboplatino | **62.3%** | 🟢 alta |
| HR+/HER2- 68a cN1 Ki67 10% (luminal viejo) | **8.5%** | 🔴 baja |
| HR-/HER2+ cN1 + pertuzumab (HER2-enriched ideal) | **87.0%** | 🟢 alta |
| HR+/HER2+ cN2 + pertuzumab (triple-positive avanzado) | **60.4%** | 🟢 alta |
| HR+/HER2- 45a cN1 Ki67 35% (luminal B) | **25.9%** | 🟡 media |

---

## 📐 Arquitectura del sistema

```
predictor_ypN0/
├── README.md (este archivo)
│
├── data/                          ← Foundational data (83 datapoints, 22 estudios)
│   ├── ypN0_rates_by_subtype.csv     (51 filas)
│   ├── predictor_effect_sizes.csv    (17 ORs)
│   ├── regimen_effect.csv            (15 regímenes)
│   ├── nomogram_coefficients.csv     (12 coeficientes finales)
│   ├── predictor_data_dictionary.md
│   └── build_dataset.py
│
├── nivel1_calculadora/            ← Nivel 1: Calculadora basada en literatura
│   ├── predictor.py                  (clase LogisticPredictor)
│   ├── predictor_ypN0.xlsx           (Excel con 4 sheets)
│   ├── predictor.html                (standalone, sin dependencias)
│   └── build_excel.py
│
├── nivel2_metaregresion/          ← Nivel 2: Meta-regresión pooled
│   ├── meta_regression.py            (DerSimonian-Laird RE)
│   ├── nomogram_plot.py              (matplotlib plots)
│   ├── nomogram_interactive.py       (Tk GUI)
│   ├── results.md                    (reporte clínico ES)
│   ├── results_pooled_subtype.csv
│   ├── results_meta_or_subtype.csv
│   ├── results_validation.csv
│   └── plots/
│       ├── forest_subtype.png        ⭐ visualizar tasas pooled
│       ├── calibration.png           ⭐ predicho vs observado
│       └── nomogram.png              ⭐ nomograma estilo Harrell
│
├── tests/                         ← Validación automatizada
│   ├── run_all.py                    (entry point único)
│   ├── test_calibration_vs_cohorts.py (6 cohortes pivotales)
│   ├── test_unit_cases.py            (21 pytest-style)
│   ├── calibration_report.md
│   ├── test_results.md
│   └── README.md
│
└── docs/                          ← Documentación clínica en español
    ├── manual_clinico.md             (uso clínico, 5 min)
    ├── limitaciones.md               (10 secciones técnicas)
    ├── casos_clinicos_uso.md         (10 viñetas resueltas)
    └── comparacion_niveles.md        (Nivel 1/2/3 + roadmap)
```

---

## 🧮 Nivel 1 — Calculadora basada en literatura

**Para qué sirve:** Predicción rápida en consulta. Una pantalla, una cifra, una banda. Recomendación de decisión TAD/SLNB/ALND.

**Base estadística:**
- Modelo logístico anclado en HR+/HER2- cN1 50a Ki67 20% → ~10% ypN0
- Coeficientes principales (van Amstel BJS 2024 — [DOI](https://doi.org/10.1093/bjs/znae203)):
  - HR-/HER2+: OR 40
  - HR+/HER2+: OR 14.82
  - TNBC: OR 6.91 (× pembrolizumab OR 1.42 KEYNOTE-522, × carboplatino OR 1.5)
- Ki67 ≥20% en luminales: OR 3 (Boughey 2022)
- Edad: OR 0.99/año (An NCDB 2025)
- cN2/3: OR 0.65
- Genómico alto en HR+/HER2-: OR 2

**Verificación automatizada:** 4/4 casos vignette pasan los criterios prediseñados. Ver `tests/test_unit_cases.py` (21 tests, 100% pass).

**Cuándo usarlo:** Decisiones rápidas en consulta o pase de planta. Conversación con paciente sobre expectativas.

**Limitaciones críticas:** Confianza marcada "baja" para HR-/HER2+ (van Amstel sin IC) y para cN3. Ver [docs/limitaciones.md](docs/limitaciones.md).

---

## 📊 Nivel 2 — Meta-regresión + nomograma

**Para qué sirve:** Discusión de caso en comité de tumores. Estimación con incertidumbre. Documento publicable.

**Métodos:**
- **DerSimonian-Laird random-effects pooling** sobre proporciones logit-transformadas (manual, sin librerías)
- Heterogeneidad I² reportada (transparente)
- Validación contra 5 cohortes publicadas
- **Brier score 0.0078** (excluyendo Montagna que es selección post-hoc)

**Tasas pooled por subtipo (clínicamente útiles):**

| Subtipo | k estudios | Tasa pooled | IC 95% | I² |
|---|---|---|---|---|
| HR-/HER2+ | 2 | **65.7%** | 53.1-76.4 | 91% |
| HER2+ (combinado) | 2 | 53.3% | 41.7-64.7 | 96% |
| HR+/HER2+ | 2 | 49.3% | 39.7-59.0 | 86% |
| TNBC | 3 | **48.0%** | 47.6-48.4 | 0% (homogéneo) |
| HR+/HER2- | 7 | **21.2%** | 13.8-31.1 | 100% |

**Validación predicho vs observado:**

| Estudio | Predicho | Observado | Error |
|---|---|---|---|
| Z1071 (Boughey 2013) | 42.2% | 41.0% | **+1.2pp** ✅ |
| KEYNOTE-522 pembro | 74.1% | 76.7% | +2.6pp ✅ |
| KEYNOTE-522 placebo | 66.8% | 69.9% | +3.1pp ✅ |
| RISAS (van Amstel 2024) | 43.7% | 29.7% | +14pp ⚠️ |

**Ecuación final del nomograma:**

```
logit P(ypN0) = -1.313
   + 3.108 · 1[HR-/HER2+]
   + 2.326 · 1[HR+/HER2+]
   + 1.598 · 1[TNBC]
   + 0.752 · 1[Ki67 20-30%]   (solo HR+/HER2-)
   + 1.504 · 1[Ki67 ≥30%]
   + 1.055 · 1[genomic risk alto]
   - 0.101 · (edad-50)/10
   + 0.212 · 1[cN2-3]
   + 0.349 · 1[pembrolizumab]   (solo TNBC)
   + 0.531 · 1[pertuzumab]      (solo HER2+)
   + 0.405 · 1[carboplatino]    (solo TNBC)
```

**Plots disponibles:**
- [Forest plot](nivel2_metaregresion/plots/forest_subtype.png) — tasas pooled por subtipo con IC
- [Calibration plot](nivel2_metaregresion/plots/calibration.png) — predicho vs observado
- [Nomograma](nivel2_metaregresion/plots/nomogram.png) — Harrell-style

---

## ✅ Validación

```bash
python3 tests/run_all.py
```

**Resultados (verificados 2026-05-12):**
- Calibración 6 cohortes: PASS (MAE 10.9pp Nivel 1; Brier 0.0078 Nivel 2)
- Unit tests: 21/21 PASS

**Hallazgos clave:**
- ✅ Z1071, NeoSTOP, KEYNOTE-522 calibran bien (< 6pp)
- ⚠️ RISAS sobre-predice 14pp — el modelo no captura carga axilar PET (variable ausente)
- ⚠️ Calibration slope Nivel 1 = 2.96 (debería ser 1) — distribución demasiado estrecha; Nivel 2 corrige esto

---

## ⚠️ Limitaciones honestas (lee ANTES de usar)

1. **Literatura-based, no entrenado en pacientes** → Sergio debe recalibrar en su población antes de implementación rutinaria
2. **Subtipos HR-/HER2+ y HR+/HER2+ infrarrepresentados** → confianza baja
3. **Régimen modelado como binario** (con/sin pertu/carbo/pembro), ignora dosis/intensidad
4. **Histología ILC, metaplásico mal representados**
5. **Predice solo respuesta nodal, NO supervivencia ni recurrencia**
6. **No sustituye juicio clínico ni comité de tumores**
7. **No validado prospectivamente en cohorte española**

Detalle completo: [`docs/limitaciones.md`](docs/limitaciones.md)

---

## 🚀 Roadmap a Nivel 3 (recomendación para Sergio)

| Aspecto | Nivel 1 ✅ | Nivel 2 ✅ | Nivel 3 (futuro) |
|---|---|---|---|
| Base | Coef. literatura | Meta-regresión pooled | ML con datos institucionales |
| Datos requeridos | Solo clínicos | Solo clínicos | BD histórica (n≥300) |
| Calibración local | ❌ | Parcial | ✅ |
| AUC esperado | ~0.75 | ~0.80 | ~0.85 |
| Esfuerzo | Hecho | Hecho | 6-12 meses proyecto |
| Output | Decisión consulta | Discusión comité | Publicación + implementación |

**Para Nivel 3:** Sergio necesita una base de datos retrospectiva de su servicio con: ≥300 pacientes cN+ con NAC, variables completas (subtipo, Ki67, edad, cN, régimen, respuesta nodal patológica). Modelo XGBoost o regresión penalizada, validación externa con cohorte multicéntrica del repositorio. Paper en Ann Surg Oncol / JAMA Surg.

---

## 📚 Referencias clave (top 5)

1. **van Amstel FJG et al.** Disease extent according to baseline [18F]FDG PET/CT and molecular subtype: prediction of axillary treatment response after neoadjuvant systemic therapy. *Br J Surg* 2024. [10.1093/bjs/znae203](https://doi.org/10.1093/bjs/znae203) — sub-análisis RISAS con los ORs por subtipo
2. **Samiei S et al.** Axillary Pathologic Complete Response After Neoadjuvant Systemic Therapy by Breast Cancer Subtype. *JAMA Surg* 2021. [10.1001/jamasurg.2021.0891](https://doi.org/10.1001/jamasurg.2021.0891) — meta-análisis pooled (n=57.531)
3. **Boughey JC et al.** Neoadjuvant Chemotherapy and Nodal Response Rates in Luminal Breast Cancer: Effects of Age and Tumor Ki67. *Ann Surg Oncol* 2022. [10.1245/s10434-022-11871-z](https://doi.org/10.1245/s10434-022-11871-z) — efectos Ki67 en luminales
4. **An H et al.** Predictors of Nodal Pathologic Complete Response After Neoadjuvant Chemotherapy. *Ann Surg Oncol* 2025. [10.1245/s10434-025-17906-5](https://doi.org/10.1245/s10434-025-17906-5) — NCDB n=47.483
5. **Kuemmel S et al.** Surgical Outcomes After Neoadjuvant Pembrolizumab Plus Chemotherapy for TNBC. *Ann Surg Oncol* 2026. [10.1245/s10434-025-19xxx](https://doi.org/10.1245/s10434-025-19xxx) — KEYNOTE-522 quirúrgico

Lista completa: [`docs/casos_clinicos_uso.md`](docs/casos_clinicos_uso.md) + [`data/predictor_data_dictionary.md`](data/predictor_data_dictionary.md)

---

## 🧑‍⚕️ Para Sergio: workflow recomendado

1. **Hoy:** abrir `predictor.html` en navegador del consultorio. Bookmark.
2. **Esta semana:** validar 10-20 casos retrospectivos del servicio con el predictor — comparar con el desenlace real. Anotar discrepancias.
3. **Este mes:** generar base de datos histórica (Excel) con campos del predictor + outcome. Mínimo n=100.
4. **Trimestre:** colaboración con epidemiólogo/biostatistician para Nivel 3 (XGBoost/regresión penalizada).
5. **Año:** paper de validación externa en cohorte española.

---

*Predictor desarrollado con asistencia IA (Claude Code) a partir de búsquedas estructuradas en PubMed/PMC. NO sustituye juicio clínico. Citar todas las fuentes originales al usar en publicaciones.*
