R

Sobre la normalización de las direcciones postales

Lo de las direcciones postales es un caos. Trabajar con ellas, una tortura. Y cualquier proyecto de ciencia de datos que las emplee se convierte en la n-ésima reinvención de la rueda: normalización y tal. Cuando todo debería ser más sencillo. Cada portal en España tiene asociado un número de policía, un identificador numérico único. Independientemente de que quienes lo habiten se refieran a él de formas variopintas, vernaculares y, en definitiva, desnormalizadas y desestandarizadas hasta pedir basta.

model4you

Un grupo de estudiantes se examina en horas distintas con exámenes parecidos pero no iguales. Se pretende estudiar si el examen tiene algún efecto sobre la nota final y para eso se hace algo así como bmod_math <- lm(pcorrect ~ group, data = MathExam) para obtener una distribución de la nota media por grupo descrita bien cbind(estimate = coef(bmod_math), confint(bmod_math)) ## estimate 2.5% 97.5% ## (Intercept) 57.600184 55.122708 60.07766 ## group2 -2.

x[] <- lapply(...)

R
Estos días he aprendido una expresión muy compacta para operar sobre las columnas de una tabla en R: x <- iris # por ejemplo x[] <- lapply(x, function(x) factor(x)) # o cualquier otra función Aunque lapply debería devolver (y, de hecho, devuelve) una lista, esos corchetes de x fuerzan de una manera contraintuitiva que la salida final sea una tabla. La magia es consecuencia de que [<- es una función en sí misma (puedes consultar help("[<-") si quieres) con un comportamiento que es el que es (porque sí, a veces las cosas son simplemente como son).

Siete llaves al sepulcro del método delta

El desafortunado tuit Recordatorio: el método delta (para estimar el error de funciones de variables aleatorias) https://t.co/lkfnE3I5MU — Carlos Gil Bellosta (@gilbellosta) January 20, 2020 es de lo más parecido a que me repitan unos chorizos que me ha ocurrido últimamente. Salvo que en lugar de chorizos, lo que se me manifestaban fueron años estudiando matemáticas y, por extensión, las partes más analíticas de la estadística. Con inmerecida delicadeza, se me respondió:

De texto a función

R
Problema: convertir una expresión definida por un usuario (p.e., algo como "a+b") en una función (i.e., function(a, b) a + b). Solución: gen_foo <- function(expr){ my_args <- all.vars(parse(text = expr)) expr <- paste0("function(", paste(my_args, collapse = ","), ") ", expr) eval(parse(text = expr)) } Demostración: multiplica <- gen_foo("a * b") multiplica(5, 31)

Charla en el CodingClub de la UC3M este martes

Este martes 17 de diciembre hablaré durante una hora sobre (cierto tipo de) big data y modelos adecuados para modelizarlos en el CodingClub de la Universidad Carlos III. El contenido de la charla, entiendo, se publicará también después en el blog del CodingClub. Los detalles (sitio, hora, etc.) están en el enlace indicado más arriba. Obviamente, agradezco a los organizadores del CodingClub por haberme invitado. Espero no estar arrepentido el martes por la tarde de lo siguiente: es el ciclo de charlas sobre cosas relacionadas con datos más seria y mejor organizada que conozco.

P-valores y decisiones

Los números de esta entrada son reales aunque disfrazados: proceden de un proyecto real. Para medir la efectividad de una serie de modelos que hemos creado en Circiter, hemos pedido al cliente lo de siempre: que parta la lista de sujetos en dos al azar para después poder medir los éxitos y fracasos usando dos procedimientos distintos. Pero como tenemos dudas acerca del proceso de partición —que no controlamos nosotros— hemos medido el número de éxitos y fracasos en cada uno de los grupos en una prueba previa.

La población envejece pero, ¿envejecen también los grupos de edad?

La pregunta es relevante porque en demografía, epidemiología y otras disciplinas entre las que no se suele contar la economía, se suele agrupar la población en grupos de edad (y/u otras variables relevantes). Son habituales los grupos de edad quinquenales y la pregunta es: ¿son homogéneos dichos grupos de edad a lo largo del tiempo? No es una pregunta baladí: ha dado lugar a noticias como Why So Many White American Men Are Dying que no, no se explican por la desesperación o por la epidemia de opioides sino por el envejecimiento relativo de los grupos de edad en cuestión.

bamlss promete regresión bayesiana flexible

R
Un paquete relativamente nuevo de R (las primeras versiones son de 2017) que llevo un tiempo siguiendo de reojo es bamlss. bamlss es un paquete que permite especificar y ajustar varios tipos de modelos usando en principio métodos bayesianos, aunque tampoco necesariamente. No puedo decir mucho más de él de momento. Habrá que ver cómo se comporta más allá de los ejemplos discutidos en la documentación. Muchos paquetes tienden a hacer trivial lo que antes era sencillo e imposible lo que antes difícil.

Análisis y predicción de series temporales intermitentes

Hace tiempo me tocó analizar unas series temporales bastante particulares. Representaban la demanda diaria de determinados productos y cada día esta podía ser de un determinado número de kilos. Pero muchas de las series eran esporádicas: la mayoría de los días la demanda era cero. Eran casos de las llamadas series temporales intermitentes. Supongo que hay muchas maneras de modelizarlas y, así, al vuelo, se me ocurre pensar en algo similar a los modelos con inflación de ceros.

DLMs

O Distributed Lag Models (véase, por ejemplo, dLagM). Son modelos para estimar el impacto de una serie temporal sobre otra en situaciones como la siguientes: Una serie mide excesos de temperaturas (en verano). La otra, defunciones. Existe un efecto causal (débil, pero medible) de la primera sobre la segunda. Pero las defunciones no ocurren el día mismo en que ocurren los excesos de temperaturas, sino que suelen demorarse unos cuantos días.