R

Nuevo paquete para procesar texto en R: stringr

Nlp, R

Hadley Wickman, el autor de plyr, reshape y ggplot2, ha vuelto a la carga en su exitoso empeño por hacernos cambiar de forma de programar en R.

Con su nuevo paquete, stringr, aspira a facilitarnos aún más la vida. En un reciente artículo, enumera sus ventajas:

  • Procesa factores y caracteres de la misma manera (de verdad, muy práctico)
  • Da a las funciones nombres y argumentos consistentes
  • Simplifica las operaciones de procesamiento de cadenas eliminando opciones que apenas se usan
  • Produce salidas que pueden ser utilizadas fácilmente como entradas a otras funciones
  • Incorpora funciones para procesar texto presentes en otros lenguajes pero no en R

Graficaca a tutiplén

Al autor le preocupa de viejo el problema de la representación gráfica de datos. Piensa que tiene más de arte que de ciencia. Tal vez lo dice porque no se le da bien: confunde tonos y colores y desgarbado es el adjetivo que mejor describe sus trazos.

Y como casi todo diletante maltratado de las musas, ejerce de crítico. Y voto a Dios que su crítica es acerba. Le irritan todos los gráficos de tarta (menos éste), desea toda clase de malaventura al cretino que lleva lo de Excel en Expansión y vive prisionero de otras manías semejantes.

Noticia de las II Jornadas de Usuarios de R

R

Hace un año, al acabar las I Jornadas de Usuarios de R, escribí un pequeño resumen de lo habido en ellas en el blog de mi compañero de penas y oficios Raúl Vaquerizo. Este año, con cierta demora (justificada documentalmente) me dispongo a hacer lo mismo con lo que vivimos hace unos días en las II Jornadas en Mieres.

Es obligado en primer lugar agradecer a la Escuela Politécnica de Mieres por haberlas acogido y muy en particular a Belén Prendes, quien desde el primer momento impulsó este proyecto. También hay que agradecer la presencia de quienes, desafiado las dificultades planteadas por la nieve y el plantón laboral de los controladores aéreos, acudieron a la cita.

Programación funcional en R: Filter

R

Quienes acudan a Mieres la semana que viene me oirán hablar de programación funcional en R. Algo de lo que no hablaré pero que dejaré acá escrito como abrebocas es un pequeño ejemplo de cómo la programación funcional hace tu vida más simple y, sobre todo, prolonga la vida de tu teclado.

Voy a ilustrar el uso de una función de R que echábamos de menos los usuarios de Python: Filter. Estaba ahí, sí, pero como escondida.

Comportamiento inesperado... ¿sólo por mí?

R

El otro día, bajo el encabezamiento Unexpected behabiour of min, tapply and POSIXct/POSIXlt classes?, mandé a la lista de desarrolladores de R el siguiente pedazo de código:

before <- Sys.time()
Sys.sleep( 1 )
now1 <- now2 <- Sys.time()

my.times <- c( before,  now1, now2
class( my.times )                     ## [1] "POSIXct" "POSIXt
min( my.times )                       ## [1] "2010-10-28 18:52:17 CEST"

### So far, so good... but:

my.period <- c( "a", "b", "b" )
tapply( my.times, my.period, min )

##          a          b
## 1288284737 1288284780

## Where did my POSIXct class go?

my.times.lt <- as.POSIXlt( my.times
min( my.times.lt )                    ## [1] "2010-10-28 18:52:17 CEST"; good

tapply( my.times.lt, my.period, min )

# $a
# [1] 17.449
#
# $b
# [1] 52
#
# Mensajes de aviso perdidos
# In ansmat[index] <- ans :
#   número de items para para sustituir no es un múltiplo de la
# longitud del reemplazo
#
# ¿?  :(

Invito a mis lectores a lo siguiente:

Una (propuesta de) guía de estilo de R

R

Síntoma del creciente interés por R es el hecho de que Google haya elaborado y publicado una guía de estilo para R. Me he tomado la libertad de traducirla. Espero que a Google no le importe.

Es conveniente (Google, yo y, seguramente, muchos otros lo creemos así) atenerse a un código de estilo a la hora de programar. No es éste foro en el que enumerar las ventajas que se derivan de ello: si habéis desarrollado código codo con codo con otros, sabréis a qué me refiero; si no, haced caso al consejo de quienes os precedieron y ahorraréis tiempo y dinero.

¡Qué mala suerte tengo con las anomalías!

El siempre muy benéfico Banco de Santander me ha proporcionado —onerosamente: veráse el porqué— un conjunto de datos con el que ilustrar a los lectores de este blog en el uso del paquete outliers de R. Los datos son los siguientes:

dia <- 17:26
precio <- 10 + c( 22, 21, 39, 18, 24, 26, 26,26,29, 28 ) / 100

Los días son los discurridos desde que di una orden de adquisición de un fondo de inversión a través de dicha entidad financiera hasta que tuve constancia de que se había completado: el dinero se había adeudado de la cuenta corriente y las participaciones, aparecían listadas en la cuenta de valores. El precio contiene los valores liquidativos diarios del fondo durante tales días. He aquí su representación gráfica:

¿Siete lenguajes de programación emergentes?

R

Hace un par de días apareció un artículo en InfoWorld en el que se enumeraban siete lenguajes de programación emergentes. Parece que por emergentes ha de entenderse cada vez más extendidos en la empresa. Como R hacía parte del rol, comencé alegrándome. Después me surgieron dos elementos de sospecha.

Véase la lista de los siete lenguajes seleccionados:

  • Python, un viejo conocido.
  • Ruby
  • Matlab
  • JavaScript, que está gozando de una segunda primavera gracias a AJAX y demás
  • R, ¡cómo no!
  • Erlang (vale la pena echarle un vistazo: tiene cosas la mar de interesantes)
  • Cobol (¡ufa!)
  • Extensiones CUDA

Los elementos de sospecha son dos (ni tres ni siete):

A vueltas con los fractales

R

Si bien no hace mucho publicaba una entrada sobre el triángulo de Sierpinsky, mi tocayo Carlos Ortega (y ahora gentil colaborador) nos ha proporcionado un enlace en este blog a un pedazo de código que bien vale la pena replicar aquí para el solaz (y tal vez, incluso, provecho) de los lectores de estas páginas. Es:

    library(fields)         # for tim.colors
    library(caTools)        # for write.gif
    m = 400                 # grid size

    C <- complex(
        real=rep(seq(-1.8,0.6, length.out=m), each=m ),
        imag=rep(seq(-1.2,1.2, length.out=m), m ) )
    C <- matrix(C,m,m)
    Z <- 0
    X <- array(0, c(m,m,20))

    for (k in 1:20) {
        Z <- Z^2+C
        X[,,k] <- exp(-abs(Z))
    }
    image(X[,,k], col=tim.colors(256))
    write.gif(X, "Mandelbrot.gif", col=tim.colors(256), delay=100)

(extraído de aquí).

Una solución al problema de la separación perfecta con regresiones logísticas

Cuando el otro día planteé al mis lectores el problema de cómo representar de manera efectiva un conjunto de datos pequeños, no lo hice de manera enteramente ociosa. Eran datos reales de un cliente que tropezó con el llamado problema de la separación perfecta al intentar aplicar una regresión logística.

Veamos de nuevo los datos:

En la gráfica cada punto representa un individuo (posiblemente una persona). Los grupos los distinguen en dos clases (posiblemente, enfermos y sanos). La variable en el eje de la x mide el nivel de cierta proteína (supongo que en las células de algún tipo de tejido). Si se intenta realizar una regresión logística sobre este conjunto de datos sucede una catástrofe: el algoritmo diverge, aparecen mensajes de error en la pantalla, etc. ¡Es el problema de la separación perfecta!