Voy a comenzar con una simulación inofensiva,
set.seed(1)
n <- 10000
sigma <- .1
x <- runif(n)
# coeficientes:
indep <- -1
b_0 <- .5
# variable objetivo:
error <- rnorm(n, 0, sigma)
y_0 <- indep + x * b_0 + error
# modelo:
modelo_0 <- lm(y_0 ~ x)
summary(modelo_0)
La notación y la justificación de (1 | A)
está aquí, una vieja entrada que no estoy seguro de que no tenga que retocar para que no me gruña el ministerio de la verdad.
Esta entrada lo es solo para anunciar que en uno de nuestros proyectos y a resultas de una idea de Luz Frías, vamos a implementar una versión mucho más parecida al lo que podría representar el término (B | A)
, que es, casi seguro, chorrocientasmil veces mejor.
Ayer se leía en Twitter que
Cabe preguntarse qué pasa si se analizan los mismos datos usando ambas técnicas. Obviamente, hay muchos tipos de datos y supongo que los resultados variarán según qué variante se utilice. Aquí voy a centrarme en unos donde hay medidas repetidas de un factor aleatorio. También voy a situarme en un contexto académico, en el que interesan más las estimaciones de los efectos fijos, que en uno más próximo a mi mundo, la consultoría, donde son más relevantes las estimaciones regularizadas de los efectos aleatorios.
Desafortunadamente, el concepto de interacción, muy habitual en modelización estadística, no ha penetrado la literatura del llamado ML. Esencialmente, el concepto de interacción recoge el hecho de que un fenómeno puede tener un efecto distinto en subpoblaciones distintas que se identifican por un nivel en una variable categórica.
El modelo lineal clásico,
$$ y \sim x_1 + x_2 + \dots$$
no tiene en cuenta las interacciones (aunque extensiones suyas, sí, por supuesto).
Los modelos mixtos en Python son un bien público.
El sector privado no produce suficientes bienes públicos (con excepciones tan notables como las búsquedas en Google o las páginas aún sin paywall de los periódicos). El sector público y los impuestos que lo financian argumenta la conveniencia de su propia existencia en términos de esa provisión de bienes públicos que dizque realiza.
Pero ese subsector del sector público que debería implementar los modelos mixtos en Python se dedica a otra cosa. A cosas como estas.
Tengo por ahí leído y encolado el artículo League Tables and Their Limitations: Statistical Issues in Comparisons of Institutional Performance del perínclito Spiegelhalter que toma una serie de ránkings (de colegios, de hospitales) y trata de medir cuánto tienen de sustancia y cuánto de ruido.
Hace cosas muy similares a las que escribí aquí. Mi entrada, además, cuenta con la ventaja (que lo será solo para algunos) de usar la sintaxis y código de lme4
en lugar de la nomenclatura que más odio para describir los modelos mixtos utilizados.
Era casi todavía el siglo XX cuando yo, desesperado por hacer cosas que consideraba normales y que SAS no me permitía, pregunté a un profesor por algo como C pero para estadística. Y el profesor me contó que conocía a alguien que conocía a alguien que conocía a alguien que usaba una cosa nueva que se llamaba R y que podía servirme.
Fue amor a primera vista, pero esa es otra historia. La relevante aquí es que volví a hablar con aquel profesor para agradecerle el consejo y, de paso, le pregunté que por qué no lo usaba él. Me contestó que porque en R no había modelos mixtos (aunque nlme
es anterior, del 99; ¡a saber en qué estado se encontraba entonces!).
Imagina que tienes que generar (reitero: generar) datos compatibles con el siguiente modelo:
- Tienes n sujetos a los que se proporciona un remedio para dormir en distintas dosis (conocidas) en distintos días.
- El número adicional de horas que duerme cada sujeto es lineal con una pendiente que depende de la dosis (una serie de dosis fijas).
- Esa recta tiene un término independiente (el número de horas que duerme el sujeto con una dosis igual a cero del remedio).
Argumento que para generar los términos independientes usarías algo así como una normal de media igual a 8 horas. Seguro que usarías alguna otra distribución razonable para las pendientes (p.e., que prohibiese que con dosis pequeñas se durmiese, p.e., 80 horas).
gam
/bam
admiten efectos aleatorios
gam
/bam
admiten efectos aleatorios
gam
/bam
admiten efectos aleatorios
gam
/bam
admiten efectos aleatorios
gam
/bam
admiten efectos aleatorios
gam
/bam
admiten efectos aleatorios
gam
/bam
admiten efectos aleatorios
Y solo me enteré anoche (gracias a José Luis Cañadas).
(Para más detalles, esto o esto).
Aquí quedó pendiente hablar de datos y métodos. Los primeros proceden de El Mundo. Solicité a Marta Ley, una coautora, los datos pero, antes de que contestase que sí (¡gracias!), me di cuenta de que podía obtenerlos solito: basta con capturar la llamada que el javascript local hace al servidor.
¿Métodos? Mejorables: se suaviza la intención de voto (con loess) y se estima la diferencia con un modelo de efectos mixtos, i.e.,
Sí, de drogas de las que mantienen despierto al lumpenazgo. Porque he encontrado (aquí) un conjunto datos muy interesante sobre la valoración que una serie de personas, unas 900, da a una serie de drogas más o menos legales que se llaman —me acabo de enterar— nootrópicos.
El gráfico
extraído de la página enlazada más arriba resume parte de los resultados. No obstante, es sabido entre los que se dedican a los sistemas de recomendación que hay usuarios que tienden a valorar sistemáticamente por encima de la media y otros, por debajo. En los manuales de la cosa suelen recogerse mecanismos más o menos sofisticados para mitigar ese efecto y normalizar las valoraciones entre usuarios. Generalmente, solo exigen matemáticas de bachillerato. Y son meras aproximaciones que no tienen en cuenta circunstancias tales como que puede que un usuario da valoraciones bajas solo porque evalúa productos malos, etc.
Los códigos postales, por ejemplo, son un problema a la hora de crear modelos predictivos: son variables categóricas con demasiados niveles. Así, por ejemplo, los bosques aleatorios de R solo admiten variables categóricas con no más de 32 niveles.
Hay trucos de todo tipo para mitigar el problema. Hace un año, Jorge Ayuso me puso sobre la pista de uno de los que tiene más recorrido. Consiste en [su versión más simplificada en]: