R

pqR: un R más rápido

Hace no mucho, Radford Neal publicó pqR, una versión de R más rápida. Y algunos os preguntaréis qué es y de dónde salió esa reimplementación.

La respuesta breve es la siguiente: no hace tanto, cuando R iba por la versión 2.13, Neal sugirió una serie de modificaciones (patches) para mejorar el rendimiento de R en algunos aspectos. Creo recordar que eran catorce, aunque bien pudo haber habido otros posteriores. Los desarolladores de R, sin embargo, rechazaron algunos (si no todos) de ellos por motivos de diversa índole pero que se resumen en lo siguiente:

Hablaré de la EPA (y más cosas) en Medialab Prado

Este miércoles (2013-06-19 en formato ISO 8601: a ver si os vais acostumbrando a él de una bendita vez) hablaré en MediaLab Prado sobre la EPA y más cosas.

Va a ser una charla enteramente antiinstitucional y subversiva. Voy a tratar de abrir varias cajas de Pandora y liberar los correspondientes demonios. Y no voy a tener piedad con las neuronas de los asistentes: quienes acudan, que traigan unos sudokus hechos de casa a modo de calentamiento.

La cosa más friqui que he visto en...

Es la cosa más friqui que he visto en tiempos. “Esto va intravenoso al blog”, me he dicho. Es esto.

Se trata de un paquete de R de Emilio Torres Manzanera con el que se pueden construir gráficos como

al más puro estilo xkcd. Para probarlo,

library(xkcd)
vignette(“xkcd-intro”)

¡Disfrutad!

APIdays Mediterranea, la semana que viene

R

La semana que viene y con el lema

The Web 1.0 was readable, the Web 2.0 was social, now the web is programmable through application programming interfaces (aka APIs)

se celebrará en Madrid APIdays Mediterranea, un encuentro de entusiastas de las APIs.

Y dentro del programa, el sábado día 1, a la una menos cuarto —una hora compatible con mis poco matutinos hábitos—, tengo asignado el taller Rapidays: Quick introduction to R & APIs al que están, por supuesto, invitados los lectores de estas páginas (y para los que podría llegar a tener descuentos para el evento completo y entradas gratuitas para mi taller en particular).

Mi charla sobre un lematizador probabilístico con R (vídeo y diapositivas)

Nlp, R

Acabo de subir a mi servidor las diapositivas de la charla describiendo un lematizador desambiguado que anuncié el otro día. Gracias a Carlos Ortega y Pedro Concejero, el vídeo de la charla está disponible en Vímeo. Por su parte, las transparencias pueden descargarse aquí.

Quiero agradecer a los asistentes a la charla su interés y, muy particularmente, su participación en el debate que se abrió al final de la sesión. Fue muy enriquecedor.

Charla: un lematizador probabilístico con R

El jueves 16 de mayo hablaré en el Grupo de Interés Local de Madrid de R sobre lematizadores probabilísticos.

Hablaré sobre el proceso de lematizacion y trataré de mostrar su importancia dentro del mundo del llamado procesamiento del lenguaje natural (NLP). La lematización es un proceso humilde dentro del NLP del que apenas nadie habla: su ejercicio solo ha hecho famoso a Martin Porter. Lo eclipsan otras aplicaciones más vistosas, como el siempre sobrevalorado análisis del sentimiento. Sin embargo, es una pieza fundamental que subyace (o debería subyacer) en cualquier aplicación seria que analice textos.

data.table (II): agregaciones

Sigo con mi lacónica serie sobre data.table.

La protagonista:

frases[sample(1:nrow(frases), 3),]
#pos.es pos.en length.es length.en en        es frase          tfe      qjilm          num
#1:     15     43        72        72  i        de  2632 4.881416e-02 0.01369863 6.686871e-04
#2:     33     48        46        48  X    países  5321 2.726146e-06 0.02040816 5.563563e-08
#3:      2     35        53        66 in preguntar  4582 2.424379e-08 0.01492537 3.618476e-10
dim(frases)
#[1] 6340091      10

El tiempo:

system.time({
    setkey(frases, "frase", "es")
    denominadores <- frases[, sum(num), by = key(frases)]
    setnames(denominadores, c("frase", "es", "den") )
    frases <- merge(frases, denominadores)
    frases$delta <- frases$num / frases$den
})
#user  system elapsed
#5.628   0.208   5.841

En particular,

Dependencias funcionales en R con foodweb

El otro día tropecé con un problema de rendimiento con R y al utilizar Rprof() encontré muchas llamadas a funciones que yo no hacía directamente.

La principal sospechosa era la función daply (del paquete plyr) que parecía depender de bastantes otras. Uno puede navegar el código de las funciones para identificar esas dependencias, pero, mirad qué maravilla:

library(mvbutils)
library(plyr)
foodweb(find.funs("package:plyr"), prune = "laply")

genera

Ahí se ve la dependencia de daply con respecto a laply. Y uno adquiere, además, una visión panorámica del paquete plyr.

Mi primera aplicacion en Shiny: un detector de idiomas

R

Motivado por los experimentos de Gregorio Serrano con shiny e ilustrado por la charla que dio en el Grupo de Usuarios de R de Madrid, decidí colgar el otro día un entretenimiento que ocupó la mañana de un domingo —y las mañanas de mis domingos son proverbialmente breves— en la red.

Se trata de una aplicación que distingue el idioma en que está escrito un texto dentro de una selección de ellos: español, italiano, latín, francés, portugués y catalán.

Más sobre la ley de Benford (II): la distribución de la parte fraccionaria

Continuamos hoy nuestra serie sobre la llamada ley de Benford discutiendo la distribución de la parte fraccionaria de las muestras de una distribución.

La parte fraccionaria de un número es, para entendernos, lo que va detrás de la coma. Técnicamente, x - floor(x). ¿Le sorprendería a alguien la parte fraccionaria de una secuencia aleatoria de números no tenga una distribución uniforme sobre [0,1)?

Obviamente, si los números son enteros no. ¿Pero si siguen la distribución normal? Se puede probar, de hecho, que si la serie sigue una distribución de probabilidad que sea

data.table (I): cruces

Los protagonistas (tres tablas grandecitas):

dim(qjilm)
# [1] 3218575 5
dim(tf)
# [1] 6340091 7
dim(tfe)
#[1] 1493772 3

head(qjilm, 2)
#pos.es length.en length.es pos.en qjilm
#1 1 2 1 1 0.8890203
#2 1 2 1 2 0.1109797

head(tf, 2)
#frase es pos.es length.es en pos.en length.en
#1 996 ! 42 42 ! 43 44
#2 1231 ! 37 37 ! 37 38

head(tfe, 2)
#en es tfe
#1 ! ! 4.364360e-01
#2 ! !" 4.945229e-24

El objetivo (cruzarlas por los campos comunes):

¿Leemos "Analyzing Linguistic Data" juntos?

Victor Peinado y yo estamos organizando un grupo de lectura. Junto con quienes se nos sumen, vamos a ir leyendo el libro Analyzing Linguistic Data: A practical introduction to Statistics", que trata de:

  • R (instalación, gráficos, etc.)
  • Métodos estadísticos con R (modelos lineales, clústering,
  • clasificación, modelos mixtos)
  • Lingüística (que es el contexto en el que se aplica lo anterior).

La participación en este grupo está indicada para quienes tengan interés en las aplicaciones lingüísticas de la estadística (y de R, por supuesto). Y muy particularmente para esos lingüistas que se han encontrado con que su disciplina (o grandes partes de ella), cada vez más, está dejando de ser de letras.