R

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

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 modelarlos 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. Es, además, el ciclo de charlas sobre cosas relacionadas con datos más serio y mejor organizado que conozco.

Y con eso, prácticamente, cierro el 2019 para casi todos los efectos. En 2020, más.

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. Esperábamos que las proporciones fuesen similares en ambos grupos y hemos obtenido esto:

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. En EE.UU., claro, no en España.

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. Espero que no sea el caso y que acabe facilitando la divulgación de herramientas estadísticas avanzadas más allá del consabido $y \sim x_1 + x_2 + \dots$ envuelto sea en lm o en XGBoost.

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. Es decir, modelar la demanda como una mixtura de dos distribuciones, una, igual a 0 y otra >0, de manera que la probabilidad de la mixtura, $p_t$, dependa del tiempo y otras variables de interés.

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.