R

El g-test para tablas de contingencia

Hace unos días recibí una consulta de una vieja amiga lingüista. Ella trabaja en algo que creo que se llama cocolocación: el estudio de palabras que aparecen o que tiendan a aparecer juntas en textos. Digamos que es algo así como una correlación o una regla de asociación.

Los lingüistas están muy interesados en ese tipo de fenómenos. Tradicionalmente (cada gremio tiene su librillo) usan la información mutua. Pero, al final, lo que tienen es una tabla de contingencia: situaciones en que aparece una, la otra, ambas o ninguna de las palabras.

Madrid decide, propone, vota, etc.

De siempre, no sé por qué motivo, me interesaron esas cosas relacionadas con la democracia directa. En la feria del libro del año nosecuántos compré un libro al respecto (que presté y no me han devuelto). He seguido de cerca del desarrollo de plataformas como Agora y conozco a alguno de sus desarrolladores. Di guerrita en Suiza a los locales para que me explicasen pros, contras y funcionamientos de lo que allí tienen instalado. Estoy al tanto de los problemas que ha planteado la democracia directa en California (sobre lo que recomiendo esto). Etc.

Programa Profesional de Iniciación a R II

Del 10 de noviembre al 17 de diciembre impartiré la segunda edición de mi Programa Profesional de Iniciación a R. Los detalles pueden consultarse en el enlace anterior.

Es la segunda edición. De la primera hablé aquí.

El programa es esencialmente el mismo: presentar y trabajar con aquellas herramientas que hacen de R una herramienta útil dentro de BBVA, Santander, Mapfre, etc. Para trascender Excel y, entre otros,

  • manipular datos como un pro,
  • crear gráficos estadísticos complejos de calidad,
  • crear informes automáticos que combinan análisis de datos, gráficos, texto, etc.,
  • desarrollar plataformas interactivas de visualización y análisis de datos.

En el curso se tocarán (aunque sin profundizar) las herramientas para el análisis estadístico de datos con R (p.e., regresiones) y algunas técnicas de machine learning (p.e., árboles de decisión y random forests), pero no se trata de un curso de estadística.

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 respresentan 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 ($latex l_1$, $latex l_2$, $latex l_\infty$, etc.), construi una serie de diagramas de Voronoi usado métricas arbitrarias.

En la Wikipedia se comparan gráficamente $latex l_1$, $latex 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 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.