Tarjeta de tamizaje de disglicemia

Sistema de puntuacion clinica construido unicamente con reglas y metodos estadisticos, sobre 253.680 registros del BRFSS 2015.

253.680
registros analizados
5
preguntas, cero examenes de laboratorio
0.793
AUC en 68.935 pacientes nunca vistos
27.129
registros con contradicciones detectadas

Reto med-data-challenge · Universidad Tecnologica de Panama, Programacion 4 · Generado automaticamente desde artefactos/informe.json en 4.6 s · SHA-256 del CSV: a971809d0786d2d7d7f6070f83dfe8af...

1. Criterio de cumplimiento

El enunciado exige clasificar unicamente con reglas y metodos estadisticos. Adoptamos este criterio explicito, y todo el proyecto lo respeta:

Una regla se admite si cabe impresa en una hoja y un medico puede recalcularla a mano con una calculadora, y si cada numero sale de un conteo sobre una tabla de frecuencias. No hay ningun .fit() ni ningun parametro ajustado por optimizacion en todo el repositorio.

Se usaPor que es estadistica clasica
Tablas de contingencia y tasas por celdaContar. Es el ladrillo de la bioestadistica y hace todo auditable.
Chi-cuadrado de independenciaPrueba de hipotesis de 1900, implementada a mano con E = fila x columna / n.
V de CramerNormaliza el chi-cuadrado. Necesaria porque con n=253.680 todo sale significativo.
Odds ratio con IC 95%Formula cerrada de Woolf sobre el log. Es el lenguaje de la epidemiologia.
Weight of Evidence (WoE)Logaritmo del cociente de verosimilitudes de Bayes. Invariante a la prevalencia.
Information Value (IV)Divergencia de Jeffreys entre las distribuciones de enfermos y sanos.
AUC por rangos de Mann-WhitneyEstadistico de rangos, calculado a mano. Sin librerias de ML.
Indice de YoudenMaximiza sensibilidad + especificidad - 1 sobre la curva ROC del train.

Excluido scikit-learn, XGBoost, LightGBM, redes neuronales y cualquier clasificador entrenado. pandas y numpy se usan como calculadora (sumas y logaritmos), nunca como clasificador; el clasificador entregable, nucleo/clasificar.py, corre con biblioteca estandar pura y una prueba automatizada lo verifica.

2. Los datos

CDC Behavioral Risk Factor Surveillance System 2015, encuesta telefonica anual. De los 441.456 registros originales con 330 variables se conservan 253.680 respuestas con 21 indicadores mas el diagnostico. Curado en el UCI ML Repository (id 891, DOI 10.24432/C53919).

Chequeo estructuralResultado
Filas253.680
Columnas22
Celdas validadas5.580.960
Valores nulos0
Valores fuera del dominio declarado0
Sin diabetes213.703 (84.24%)
Prediabetes4.631 (1.83%)
Diabetes35.346 (13.93%)
Que la validacion estructural de 5.580.960 celdas devuelva cero errores no es un no-resultado. Es el hallazgo de que toda la suciedad de este dataset es semantica: contradicciones entre columnas que ninguna validacion de tipos puede ver. Por eso la seccion siguiente existe.

Definicion del objetivo

Se clasifica disglicemia = prediabetes o diabetes (prevalencia 15.76%). Razon clinica: para un tamizaje ambas disparan la misma accion, confirmar con glucosa en ayunas. Razon empirica: separar diabetes de prediabetes con estas 21 variables es casi imposible, y la prediabetes es solo el 1.83% de la muestra.

3. Auditoria de calidad

Ocho reglas de coherencia cruzada entre columnas. Cada una marca filas cuya combinacion de respuestas es logicamente contradictoria.

#ContradiccionRegistros%Disglicemia
R1Colesterol alto declarado sin haberse hecho nunca el chequeo1.9810.78%8.3%
R2IMC fuera del rango clinicamente plausible (14-60)8320.33%23.0%
R3Tiene cobertura de salud pero no pudo ver al medico por costo16.7756.61%21.3%
R4Salud autopercibida excelente con 20 o mas dias malos en el mes1.3980.55%7.2%
R5Salud autopercibida excelente pero con dificultad seria para caminar1.0720.42%18.3%
R6Salud autopercibida mala sin ningun sintoma ni diagnostico430.02%16.3%
R7Dificultad para caminar pero hace ejercicio y 0 dias de mala salud fisica6.6032.60%27.2%
R8Evento cardiovascular declarado en menores de 30 anos1210.05%12.4%
Al menos una contradiccion27.12910.69%21.1%

Los registros inconsistentes tienen 21.1% de disglicemia frente a 15.1% en los consistentes: la inconsistencia no es ruido aleatorio, correlaciona con la enfermedad.

Los 23.899 duplicados exactos no son un error

El 9.42% de las filas esta repetida. La conclusion facil seria borrarlas. Seria un error, y lo demostramos:

EvidenciaValor
Filas duplicadas con 0 dias de mala salud fisica96.2%
Filas unicas con 0 dias de mala salud fisica57.8%
Perfil mas repetido59 veces
Prevalencia con duplicados15.76%
Prevalencia si se borran17.29%
Son colisiones estadisticas, no corrupcion. Con 21 variables discretas y 253.680 encuestados, los perfiles sanos de baja entropia se repiten por fuerza: el 96.2% de las filas duplicadas declara cero dias de mala salud fisica. Borrarlas eliminaria sanos y subiria artificialmente la prevalencia del 15.76% al 17.29%. Se reportan y se conservan en el analisis epidemiologico; solo se deduplica antes de partir en entrenamiento y prueba, para que un mismo perfil no caiga en ambos lados.

IMC: rango observado 12 a 98 (media 28.4). 805 registros superan 60 y 7 declaran exactamente 98, que es el tope de captura de la fuente. 27 estan por debajo de 14. Se marcan como implausibles pero no se borran: los IMC altos reales son casos de alto riesgo genuinos.

4. Factores clinicos

Cada variable se cruza con el diagnostico. Ordenamos por Information Value, no por significancia: con 253.680 registros el chi-cuadrado da p<0,001 para practicamente todo, asi que la significancia no discrimina. El tamano del efecto si.

VariableIVV de Cramerchi-cuadradoOdds ratio (IC 95%)Fuerza
Salud general autopercibida0.7490.30623.791-Muy fuerte
Presion arterial alta0.5750.27018.5394.78 (4.67-4.90)Muy fuerte
Indice de masa corporal0.4090.23714.262-Fuerte
Grupo etario0.3660.1909.173-Fuerte
Colesterol alto0.3350.21011.2183.24 (3.17-3.32)Fuerte
Dificultad para caminar0.2980.22212.5193.70 (3.61-3.79)Media
Ingreso del hogar0.2240.1737.617-Media
Dias de mala salud fisica0.2060.1808.237-Media
Cardiopatia o infarto0.1780.1777.9413.51 (3.41-3.61)Media
Nivel educativo0.1270.1334.471-Media
Actividad fisica0.1000.1213.7380.50 (0.48-0.51)Media
Chequeo de colesterol (5 anos)0.0620.0681.1685.86 (5.22-6.57)Debil
Accidente cerebrovascular0.0620.1052.7862.97 (2.85-3.10)Debil
Dias de mala salud mental0.0400.0771.517-Debil
Consumo elevado de alcohol0.0320.0578150.41 (0.38-0.43)Debil
Fumador0.0290.0639991.41 (1.38-1.44)Debil
Consume vegetales a diario0.0250.0598890.68 (0.66-0.70)Debil
Consume frutas a diario0.0130.0424490.79 (0.77-0.81)Inutil
No pudo ver al medico por costo0.0100.0383661.41 (1.36-1.46)Inutil
Sexo0.0070.0302221.18 (1.15-1.20)Inutil
Tiene cobertura de salud0.0020.014501.21 (1.15-1.27)Inutil
04_forest_plot
Dos asociaciones que NO son causales, y hay que decirlo. Haberse hecho un chequeo de colesterol aparece como el mayor odds ratio: es sesgo de deteccion, quien va al medico recibe mas diagnosticos. Y el consumo elevado de alcohol aparece como protector (OR 0.41): es causalidad inversa, a quien le diagnostican diabetes deja de beber. Ninguna de las dos entra en la tarjeta.
02_genhlth 03_escalera_imc

5. El sistema de puntuacion

Se seleccionan las variables con IV ≥ 0.30, el umbral estandar de "predictor fuerte" en la literatura de scorecards. El criterio es a priori: no se elige mirando el resultado. Quedan 5 variables.

Para cada tramo se calcula WoE = ln( P(tramo | enfermo) / P(tramo | sano) ) y se convierte a puntos enteros con puntos = round( (WoE - WoE_minimo) x K ), donde K = 10.129 es comun a todas las variables y se elige para que el maximo sea 100. Es un cambio de unidades, como pasar de Celsius a Fahrenheit: no altera el orden de los pacientes.

El clasificador completo son 21 numeros enteros. Cabe en media hoja, se aplica sin computadora y cada punto tiene una lectura clinica directa.
VariableTramoRegistrosTasa observadaWoEPuntos
Salud general autopercibidaExcelente45.2993.2%-1.7300
Muy buena89.0848.5%-0.6979
Buena75.64620.1%+0.29518
Regular31.57034.3%+1.02425
Mala12.08140.8%+1.30428
Presion arterial altaNo144.8517.2%-0.8770
Si108.82927.1%+0.68815
Indice de masa corporalBajo peso3.1276.3%-1.0210
Normal86.0997.3%-0.8623
Sobrepeso91.17614.5%-0.10010
Obesidad I44.45323.7%+0.50716
Obesidad II17.34631.8%+0.91519
Obesidad III11.47936.8%+1.13622
Grupo etario18-3424.4212.8%-1.8770
35-4429.9806.6%-0.97210
45-5446.13312.1%-0.31116
55-6464.07617.6%+0.12921
65-7455.72723.3%+0.48624
75+33.34322.5%+0.44123
Colesterol altoNo146.0899.2%-0.6150
Si107.59124.7%+0.56111

Por que solo 5 variables: la parsimonia esta medida

Anadir mas factores empeora el resultado. No es una concesion al tiempo disponible, es la decision correcta:

VariablesUltima anadidaAUC prueba
3Indice de masa corporal0.7705
4Grupo etario0.7875
5Colesterol alto0.7930 optimo
6Dificultad para caminar0.7909
8Dias de mala salud fisica0.7862
11Actividad fisica0.7848
16Fumador0.7863
21Tiene cobertura de salud0.7880

La causa es la violacion del supuesto de independencia condicional: salud autopercibida, dias de mala salud fisica y dificultad para caminar miden tres veces el mismo sindrome de fragilidad, y un puntaje aditivo lo cuenta tres veces. El modelo corto no es el barato: es el bueno.

6. Validacion

Protocolo: deduplicar, partir 70/30 estratificado con semilla fija, construir la tarjeta solo con el 70%, elegir el umbral por indice de Youden solo en el 70%, y reportar todo sobre el 30% restante (68.935 pacientes que el sistema nunca vio).

0.7930
AUC en prueba
0.0025
brecha train-test: sin sobreajuste
73.8%
sensibilidad en el corte 62
92.8%
valor predictivo negativo
05_roc
Metrica en el corte 62ValorLectura clinica
Sensibilidad73.8%de cada 100 enfermos, detecta 74
Especificidad70.5%de cada 100 sanos, descarta 70
Valor predictivo positivo34.3%de cada 100 positivos, 34 tienen la enfermedad
Valor predictivo negativo92.8%un negativo descarta con alta confianza
Exactitud balanceada72.1%media de sensibilidad y especificidad
Exactitud simple71.1%engañosa por si sola, ver nota
Por que no reportamos solo la exactitud. Un clasificador que dijera "todos sanos" acertaria el 82.7% de las veces con sensibilidad cero: seria inutil y parece excelente. Con una prevalencia del 17.3% la exactitud global no informa. Por eso reportamos sensibilidad, especificidad, VPP, VPN y AUC.

Calibracion

El puntaje no es solo un ordenador de pacientes: sus tramos corresponden a riesgos observados reales, y crecen de forma perfectamente monotona.

BandaPuntosPacientes% poblacionRiesgo observado
Muy bajo0-3413.93920.2%1.74%
Bajo35-4814.33420.8%6.06%
Moderado49-6013.76920.0%13.12%
Alto61-7313.42419.5%23.99%
Muy alto74-10013.46919.5%42.91%
01_bandas_riesgo

Entre el quintil mas bajo y el mas alto hay un gradiente de 25 veces en riesgo observado, con grupos de tamano comparable.

7. Clasificar un paciente

El clasificador completo esta embebido en esta pagina: son los 21 enteros de la tabla anterior. Funciona sin conexion y sin servidor.

8. Limitaciones

Declararlas es parte del metodo, no una concesion:

LimitacionConsecuencia
Todo es autorreportadoNo hay HbA1c ni glucosa. 'Diabetes' significa 'un profesional se lo dijo alguna vez': subestima los casos no diagnosticados.
Estudio transversalMide asociacion, nunca causalidad. Un odds ratio alto no implica que el factor cause la enfermedad.
Sin pesos muestralesEl dataset curado no incluye _LLCPWT, asi que las prevalencias no son representativas de la poblacion de EE.UU.
Sesgo de cobertura telefonicaSubrepresenta poblacion sin telefono, institucionalizada y de menores ingresos.
Datos de EE.UU. de 2015La transferibilidad a Panama es limitada; los cortes deberian recalibrarse con datos locales.
Prediabetes casi invisibleSolo el 1.83% de la muestra. No se intenta separarla de la diabetes.

9. Impacto potencial

Un tamizaje poblacional con esta tarjeta cuesta cinco preguntas y una medicion de peso y talla. No requiere laboratorio, ni personal especializado, ni conexion.

Comparacion honesta. Los trabajos publicados sobre este mismo dataset con Random Forest y XGBoost reportan AUC de 0,82 a 0,835. Nuestra tarjeta obtiene 0.7930 con 5 variables y 21 enteros. Renunciar por completo a la caja negra cuesta alrededor de 0,03 de AUC; a cambio se obtiene un instrumento que un medico puede auditar, aplicar en papel y explicarle al paciente.

Codigo fuente: github.com/JuanKsPty/med-data-challenge · Reproducible con python -m nucleo · 16 pruebas automatizadas, incluida la verificacion de que el clasificador no importa ninguna libreria de machine learning.