RuleFit

El otro día me sentí culpable porque me preguntaron sobre RuleFit y tuve que hacer un Simón (aka, me lo estudio para mañana). Y como mañana fue antier, lo que sigue. Hay descripciones estándar de RuleFit (p.e., esta o la del artículo original) pero me voy a atrever con una original de mi propio cuño. Comenzamos con lasso. Lasso está bien, pero tiene una limitación sustancial: se le escapan las interacciones (vale, admito que lo anterior no es universalmente exacto, pero lo es casi y eso me vale). Entonces, la pregunta es: ¿cómo introducir interacciones en lasso? ...

19 de junio de 2020 · Carlos J. Gil Bellosta

Explicación de modelos

Este es el primer año en el que en mi curso de ciencia de datos (hasta ahora en el EAE; a partir del año que viene, vaya uno a saber si y dónde) introduzco una sección sobre explicación de modelos. Hay quienes sostienen que, mejor que crear un modelo de caja negra y tratar luego de explicar las predicciones, es recomendable comenzar con un modelo directamente explicable (p.e., un GLM). Por mucha razón que traigan, vox clamantis in deserto: hay y seguirá habiendo modelos de caja negra por doquier. ...

12 de junio de 2020 · Carlos J. Gil Bellosta

53 (o, ¿cuál es la prior?)

En la documentación técnica del estudio ENE-COVID19 (recuérdese: INE + ISCIII) se describe un estudio de fiabilidad previo del test rápido (sección A1.2) que se anuncia así: Según el fabricante, el test tiene una sensibilidad del 88% y 97% para determinar IgM e IgG respectivamente, y una especificidad de 100% frente a ambos isótopos. Para comprobar el comportamiento del test elegido, se han llevado a cabo dos estudios de fiabilidad. Veamos en qué consisten. ...

9 de junio de 2020 · Carlos J. Gil Bellosta

Aleatoriedad hirsuta, aleatoriedad pochola

Contemplando y comparando y se me han venido a la mente los adjetivos hirsuto y pocholo para calificar las respectivas formas de aleatoriedad que representan. La primera es el resultado del habitual n <- 200 x <- runif(n) y <- runif(n) plot(x, y, pch = 16) mientras que la segunda exige el más sofisticado library(randtoolbox) s <- sobol(n, 2, scrambling = 3) x <- s[,1] y <- s[,2] plot(x, y, pch = 16) Se ve que Sobol quería rellenar más armoniosamente el espacio. Me temo que, al hablar de aleatoriedad, muchos de nosotros también (p.e., esto).

8 de junio de 2020 · Carlos J. Gil Bellosta

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!

2 de junio de 2020 · Carlos J. Gil Bellosta

La gramática del análisis explicativo interactivo de modelos

Así vendría a traducirse el título de este artículo, que trata de taxonomizar y sistematizar una serie de técnicas muy recientes para explicar modelos de caja negra. Tal vez no acabe siendo la manera pero, sin duda, acabará habiendo una.

14 de mayo de 2020 · Carlos J. Gil Bellosta

En defensa de Simón: variaciones diarias de la mortalidad

Qué cafres tenéis que ser para que tenga que salir yo —precisamente yo, que tantas cosas no buenas tengo para decir del buen hombre— en defensa de Simón. Tiene delito que de todo lo que se le pueda echar en cara os hayáis fijado en una intervención en la que os trataba de desasnar para que no le anduviéseis buscando tres pies a la varianza. Es un tema que vengo tratando de antiguo en estas páginas y de ello dan fe: ...

13 de mayo de 2020 · Carlos J. Gil Bellosta

Consensus clustering

No hay nada tan corrosivo para la fe en el clústering que probar una y otra vez k-medias (por ejemplo) sobre los mismos datos y ver cómo los resultados cambian drásticamente de ejecución en ejecución. Pero eso viene a ser, esencialmente, lo que hay detrás del consensus clústering (CC), una técnica que puede ser usada, entre otros fines, para determinar el número óptimo de grupos. La idea fundamental de la cosa es que observaciones que merezcan ser agrupadas juntas lo serán muy frecuentemente aunque cambien ligeramente las condiciones iniciales (por ejemplo, se tome una submuestra de los datos o cambien las condiciones iniciales de k-medias, por ejemplo). Si uno altera esas condiciones iniciales repetidas veces puede contar la proporción de las veces que las observaciones i y j fueron emparejadas juntas y crear la correspondiente matriz (simétrica, para más señas) $C(i,j)$. ...

14 de abril de 2020 · Carlos J. Gil Bellosta

lme4 + simulate

Esta entrada es casi una referencia para mí. Cada vez tiro más de lme4 en mis modelos y en uno en concreto que tengo entre manos toca simular escenarios. Para lo cual, simulate.merMod. Veámoslo en funcionamiento. Primero, datos (ANOVA-style) y el modelo que piden a gritos: library(plyr) library(lme4) a <- c(0,0,0, -1, -1, 1, 1, -2, 2) factors <- letters[1:length(a)] datos <- ldply(1:100, function(i){ data.frame(x = factors, y = a + rnorm(length(a))) }) modelo <- lmer(y ~ (1 | x), data = datos) El resumen del modelo está niquelado: summary(modelo) # Linear mixed model fit by REML ['lmerMod'] # Formula: y ~ (1 | x) # Data: datos # # REML criterion at convergence: 2560.3 # # Scaled residuals: # Min 1Q Median 3Q Max # -3.6798 -0.6442 -0.0288 0.6446 3.3582 # # Random effects: # Groups Name Variance Std.Dev. # x (Intercept) 1.5197 1.2328 # Residual 0.9582 0.9789 # Number of obs: 900, groups: x, 9 # # Fixed effects: # Estimate Std. Error t value # (Intercept) -0.009334 0.412212 -0.023 En particular, ...

18 de marzo de 2020 · Carlos J. Gil Bellosta

Intervalos de confianza, intervalos de predicción

Contexto: modelo <- lm(dist ~ speed, data = cars) Intervalos de confianza: head(predict(modelo, interval = "confidence")) # fit lwr upr #1 -1.849460 -12.329543 8.630624 #2 -1.849460 -12.329543 8.630624 #3 9.947766 1.678977 18.216556 #4 9.947766 1.678977 18.216556 #5 13.880175 6.307527 21.452823 #6 17.812584 10.905120 24.720047 Intervalos de predicción: head(predict(modelo, interval = "prediction")) # fit lwr upr #1 -1.849460 -34.49984 30.80092 #2 -1.849460 -34.49984 30.80092 #3 9.947766 -22.06142 41.95696 #4 9.947766 -22.06142 41.95696 #5 13.880175 -17.95629 45.71664 #6 17.812584 -13.87225 49.49741 Creo que la diferencia (y el significado) es claro. Para todos los demás, esto.

4 de marzo de 2020 · Carlos J. Gil Bellosta