Modelos

Modelos como "hechos estilizados"

El otro día, una remesa de nuevos datos rompió un modelo (no mío) en producción. El modelo suponía que la forma de los datos era muy concreta y estos se rebelaron. Un amigo me preguntó por qué se usaba un modelo paramétrico tan simple. El motivo no es otro que la búsqueda de hechos estilizados, resúmenes a muy alto nivel de la realidad que quepan y queden bien en un tuit.

Un recordatorio: MOMOCalor está "up and running"

Por desgracia, MoMo ya no exige presentación. Pero con los termómetros acariciando los 40º no está mal recordar la existencia de MoMoCalor, su hermanito, que trata atribuir mortalidad a los excesos de temperaturas. ¿Por qué es particularmente importante MoMoCalor hoy? Recuérdese que MoMo estima, simplemente, desviaciones de mortalidad con respecto a la que sería la normal en una fecha determinada. Cuando hay una epidemia o una ola de calor, la mortalidad crece y MoMo lo detecta.

No hagáis esto o se darán cuenta de que sois muy cutres

Lo que no hay que hacer nunca si no quieres que se enteren de que eres inmensamente cutre es escribir código en las líneas del siguiente seudocódigo: m = model(y ~ a + b + c) if (modelo.p_value(a) > .05) m = model(y ~ b + c) ¡No, no, no, no, NO!

¿Agregar antes de modelar?

El otro día me pasaron unos datos artificiales para poder probar el ajuste de cierto tipo de modelos. El autor de la simulación construyó tres conjuntos de pares (x,y) y luego los agregó (media de los y agrupando por x) antes de proporcionármelos. ¿Tiene sentido agregar antes de modelar? Incluso sin entrar en el problema del potencial número desigual de observaciones por punto (datos desbalanceados) o las heterogeneidades entre las distintas iteraciones (que nos llevaría al mundo de los modelos mixtos).

MoMo: una documentación oficiosa

Estos días se habla de MoMo y por primera vez en quince años largos, el público está contemplando gráficas como que resumen lo más jugoso del sistema. MoMo (de monitorización de la mortalidad) es un sistema desarrollado por el ISCIII para seguir en tiempo casi real la evolución de la mortalidad en España. Utiliza como fuente de datos fundamental la procedente de los registros civiles informatizados, que son la práctica mayoría (aunque no todos: queda excluido ~5% de la población).

WoE,... pero ¿y las interacciones?

Esto del WoE he tenido que aplicarlo (de manera no estándar, además) en alguna ocasión. Pero forzado por las circunstancias (que, concretamente, eran el misteriosísimo y no siempre conforme a lo que cabría esperar que hace ranger de las variables categóricas). Digamos que a veces toca, pero no es tampoco algo de lo que enorgullecerse. Pero cuando escucho o leo a los apologetas del WoE, siempre me pregunto mucho por lo que tendrán que decir sobre la pérdida de información en términos abstractos y, en otros más concretos, qué ocurre con las interacciones.

GoF para modelos bayesianos

Existe una muy perezosa escuela de pensamiento que sostiene que dado que las probabilidades son subjetivas, cualquier modelo y, en particular, los bayesianos, como expresión de la subjetividad de sus autores, no necesita ser contrastado con la realidad. Porque, de hecho, la realidad no existe y es una construcción que cada cual hace a su manera, deberían añadir. Existe, por supuesto, una escuela realista tan mayoritaria que ni siquiera es consciente de que lo es.

El modelo son las conclusiones

El título es un tanto exagerado, tal vez tanto como el aforismo de McLuhan que lo inspira. Pero no pudo dejar de ocurrírseme al ver el gráfico acompañado del tuit Promedio anual de NO2 en la ciudad de València. Accesos y Grandes Vias por encima de los 40 microgramos, umbral máximo fijado por la OMS. Correlación clara con las intensidades de tráfico. #valenciaperlaire #Ajvalencia pic.twitter.com/wl6Wqpo273 — Francesc Arechavala 🍊 (@FraArechavala) October 14, 2019 Es increíble: un mapa de contaminación por NO2 con una enorme resolución tanto espacial (a nivel de manzana, prácticamente) como temporal (¡correla con la intensidad del tráfico!

¿Y si quitamos el puntico de arriba a la izquierda?

Esta entrada es una illustración de otra de no hace mucho, Análisis de la discontinuidad + polinomios de grado alto = … Mirad: Se ha hecho un análisis de la discontinuidad usando parábolas a ambos lados del punto de corte. Y la discontinuidad no es pequeña. Pero me juego un buen cacho de lo que quede de mi reputación a que mucho de ella la explica el puntico de arriba a la izquierda.

Sobre la (necesaria) validación a posteriori de modelos de caja negra

Esta entrada viene a cuento de una conversación que tuve el otro día con un economista clásico que me preguntaba mi opinión sobre los métodos del ML aplicados en su disciplina (y no solo en ella). Le causaba cierto desasosiego, muy razonable, el hecho de que le pusieran delante cajas negras que presuntamente, y eso era artículo de fe, predecían ciertos fenómenos macroeconómicos. ¿Qué —decía— si los modelos están recogiendo las correlaciones erróneas?

Las decisiones son lo primario; la estadística es subsidiaria

En Circiter estamos negociando con unos clientes potenciales acerca de, tal como nos dijeron inicialmente, construir un modelo. Todo bien. En la última reunión surgió la pregunta (¡qué vergüenza por mi parte no haberla planteado mucho antes!): ¿cómo habría que usarlo para dar soporte al negocio? La discusión subsiguiente dejó claro que habría que cambiar sustancialmente la aproximación al modelo. Por ejemplo: Era tanto o más importante la discriminación intra-sujeto que la entre-sujeto (es decir, importaba más lo que el modelo pudiera decir de los ítems de cada sujeto que las diferencias que pudiera mostrar entre sujetos).

AUC = Wilcoxon

Construyo unos datos, n <- 30 si <- data.frame(res = "si", score = rnorm(n, 1, 1)) no <- data.frame(res = "no", score = rnorm(n, 0, 1)) dat <- rbind(si, no) que simulan los scorings de un modelo hipótetico en el que comparo unos casos positivos y otros negativos. Comparo con el test de Wilcoxon el scoring según la etiqueta y normalizo (adecuadamente): test <- wilcox.test(score ~ res, data = dat)$statistic test / n^2 Por otro lado calculo el AUC: