R

purrr: otro dialecto para la programación funcional en R

R

Acaba de publicarse purrr. Es un paquete del universo Wickham que ofrece funciones para desarrollar otro dialecto funcional sobre R.

R es un lenguaje oportunista: ni del todo funcional, ni del todo orientado a objetos, ni del todo procedural. Es como es porque nació con un objetivo muy concreto y fue adoptando cosas de aquí y de allá como cuando uno recorre el supermercado. Merece la pena traer a colación cómo el primerísimo R (cuando era S), durante los ochenta, antes de adoptar la forma actual a través de los diversos libros de colores de Chambers y compañía, estaba fuertemente inspirado por Lisp.

Anunciado el programa de las VII Jornadas de Usuarios de R

Se acercan las VII Jornadas de Usuarios de R. Y se acaba de actualizar la página con la siguiente información:

  • El programa, en el que, además de charlas, hay varios talleres muy atractivos.
  • La cena social (para la que es bueno que reserves: ¡necesitamos una buena estimación de cuántos acabaremos siendo!)
  • El anuncio de una visita guiada gratuita a la ciudad de Salamanca.
  • Como novedad con respecto a otras jornadas, el anuncio de una excursión durante el sábado a la sierra de Francia y alrededores.

La asistencia a las jornadas es gratuita y, de momento, estamos inscritos unos 150. ¿Te sumas tú también?

Un problema "sencillo": posiciones y ruido

Voy a describir la solución un problema sencillo. Se trata de un objeto que se mueve a una velocidad no necesariamente constante en línea recta. Este objeto emite su posición y velocidad periódicamente (p.e., cada segundo). Por centrar ideas, su posición y velocidad reales en esos momentos es

n <- 100
v.real <- rnorm(n, 1, 0.2)
x.real <- cumsum(v.real)

(Perdóneseme lo gañán de la física que aplico para calcular las posiciones: prometo que se puede y que sé hacerlo mejor; pero para el presente caso, vale).

NMF: una técnica mergente de análisis no supervisado

[N]NMF (se encuentra con una o dos enes) es una técnica de análisis no supervisado emergente. Se cuenta entre mis favoritas.

[N]NMF significa non negative matrix factorization y, como SVD, descompone una matriz M como UDV'. Solo que, en este caso, las entradas de M son todas positivas. Y la descomposición es UV', donde las entradas de ambas matrices son también positivas.

¿Qué tipo de matrices tienen entradas estrictamente positivas?

  • Las resultantes de cuestionarios donde sujetos (filas) valoran (de 0 a 10) objetos, propuestas, etc. (columnas).
  • Las que representan clientes (filas) que compran (un determinado número >= 0) de productos (columnas).

Y acabo con un instrumento (el paquete NMF de R) y el análisis de una encuesta realizado con dicha técnica para que la veáis en acción.

Cosas de R (¿que tal vez alguien sabrá explicar?)

R

En Twitter, leo

The state of the art in statistical computing:

sum(c(1, 2), na.r=F) [1] 3 sum(c(1, 2), na.r=T) [1] 4

– John Myles White (@johnmyleswhite) September 8, 2015

¿Alguien puede explicar lo que ocurre? ¿Es tan grade como parece indicar sorna el autor del tuit?

Voronois con distintas distancias

Especulando sobre la diferencia en la práctica entre distintas métricas ($l_1$, $l_2$, $l_\infty$, etc.), construi una serie de diagramas de Voronoi usado métricas arbitrarias.

En la Wikipedia se comparan gráficamente $l_1$, $l_2$ (o euclídea y Manhattan). Mi código,

library(data.table)
library(reshape2)
library(grid)

n <- 20
dim.image <- 1000
puntos <- data.frame(id = 1:n,
                      x0 = runif(n) * dim.image,
                      y0 = runif(n) * dim.image)
colores <- rainbow(n)

voronoi <- function(p){
  tmp <- data.table(expand.grid(
      x = 1:dim.image,
      y = 1:dim.image, id = 1:n), key = "id")
  tmp <- merge(tmp, puntos, by = "id")

  distancia <- function(a, b, c, d, p)
    (abs(a-c)^p + abs(b-d)^p)^(1/p)

  tmp$distancia <- distancia(tmp$x,
    tmp$y, tmp$x0, tmp$y0, p)
  tmp[, rank := rank(distancia, ties = "random"),
    by = c("x", "y")]

  rejilla <- tmp[tmp$rank == 1,]
  rejilla$x0 <- rejilla$y0 <-
    rejilla$distancia <- rejilla$rank <- NULL

  rejilla$color <- colores[rejilla$id]

  imagen <- as.matrix(dcast(rejilla, x ~ y, value.var = "color")[,-1])

  grid.raster(imagen)
}

permite usar más en función del parámetro p.

Guías de estilo para programar en R

R

Frans van Dunné me ha hecho llegar su guía de estilo de programación en R. Abunda en otra creada por Google hace un tiempo y que traduje y adapté aquí.

Tiene como novedad, dice, su adaptación a las formas y maneras de Hadley Wickham, aún no tan conocido entonces. Coinciden, no obstante, en lo más.

Ninguna de las dos trata el uso las tuberías (operador %>%). Pero es un asunto que se nos puede ir de las manos: de hecho, hoy he conocido el paquete [backpipe](https://github.com/decisionpatterns/backpipe), que implementa %<% y que nos augura largas y desesperantes sesiones de depuración de código.

Estar en racha (y promediar promedios)

Suponemos que observamos rachas de longitud 2 + rpois(1, 10) de un juego en el que se tiene éxito (1) o se fracasa (0) con probabilidad 1/2. Nos interesa saber si existe eso de las rachas de suerte, es decir, si es más probable que a un éxito le suceda otro o lo contrario.

El observador ve rachas y calcula el número de veces que a un éxito le sigue un éxito y el número de veces que a un éxito le sigue un fracaso así:

Ajuste de probabilidades en regresiones logísticas bajo sobremuestreo ( y otros)

En ocasiones, el conjunto de datos sobre el que se ajusta una regresión logística está desequilibrado con respecto a la población subyacente. Por ejemplo, puede suceder que la tasa de casos positivos en los datos sea del 20% mientras que en la población general es del 5%.

Esto puede suceder por varios motivos. El sobremuestreo es uno de ellos: se sobremuestrea cuando se toman, por ejemplo, todos los casos positivos y solo un subconjunto de los negativos.

Estrategias escalables con R

R

Recomiendo leer Scalable Strategies for Computing with Massive Data, un artículo que trata dos de los problemas de escalabilidad con que tropezamos los usuarios de R:

  • Los de memoria, para los que proponen e ilustran el uso del paquete bigmemory.
  • Los de velocidad de ejecución, a los que se enfrentan paralelizando el código, tanto en una única máquina como en un clúster, con foreach.

En el artículo no solo discute los dos paquetes por separado sino que ilustra además cómo usarlos conjuntamente en su propuesta de estrategia escalable con R.