R

Huele a bicho (en plyr)

R
library(plyr)

dat <- data.frame( a = sample(c("x", "y"),    100, replace = T),
                    b = sample(c(TRUE, FALSE), 100, replace = T))

ddply(dat, .(a), summarize, b = sum(b), no.b = sum(!b))
ddply(dat, .(a), summarize, no.b = sum(!b), b = sum(b))

Huele a bicho, ¿verdad?

evtree: árboles globales

Tengo por delante otro proyecto que tiene mucho de análisis exploratorio de datos. Sospecho que más de un árbol construiré. Los árboles son como la Wikipedia: prácticamente nunca el último pero casi siempre el primer recurso.

Esta vez, además, por entretenerme un poco, probaré el paquete [evtree](http://cran.r-project.org/web/packages/evtree/index.html). Aunque no porque espere sorprendentes mejoras con respecto a los tradicionales, ctree y rpart.

¿Qué tiene aquel que los diferencie de los otros dos? Que la optimización es global. Tanto ctree como rpart utilizan algoritmos recursivos: al definir un nuevo corte del espacio, el algoritmo solo tiene en cuenta la región definida por los cortes anteriores. La optimización es local. evtree utiliza un algoritmo global de la familia de los evolucionarios (¡qué tufillo a lentorro!). Los detalles están aquí.

RMarkdown a la Tufte

El Sr. Tufte debiera ser un conocido de los habituales de estas páginas. Los desavisados siempre pueden ponerse al día aquí.

El Sr. Tufte escribe libros. Los escribe, los edita, los publica y creo que hasta los vende él solo. No puede ser de otra manera. Mensaje, texto, tipografía, maquetación, gráficos, los elementos todos de sus libros, en cada una de sus páginas, están combinados y medidos hasta el menor de los detalles. Defiende que los elementos gráficos forman parte consustancial del mensaje. Nada de referirse a la figura 7.18 que puede estar dos páginas más allá. Los gráficos tienen que estar cocolocados a la discusión. Etc.

Paralelización en R con snow

Suelo trabajar un servidor con ocho CPUs. Cuando quiero paralelizar código en R, suelo utilizar [parallel::mclapply](https://stat.ethz.ch/R-manual/R-devel/library/parallel/html/mclapply.html) (como aquí). Pero no tengo una máquina. Tengo varias. Y antes, de hecho, muchas.

¿Cómo paralelizar en distintas máquinas?

Se puede usar Spark (y SparkR), por ejemplo. Pero una ruta que no había ensayado jamás es la de la vieja escuela, i.e., MPI, snow y demás.

Pero si

  • tienes varios servidores corriendo un sistema operativo decente,
  • instalas R y snow (y todo lo que necesites) en todos ellos y
  • configuras los servidores para poder acceder a través de ssh sin contraseña desde uno central,

y, entonces, ejecutas

Me muerdo la lengua... por no contarlo todo

R

Me tengo que morder la lengua por no contarlo todo. Escribiré hasta donde pueda hacerlo. Que es casi nada. La cosa es que ha llegado a mis oídos que una muy importante empresa española con muchos, muchos empleados planea una migración muy seria de SAS a R.

Lo cual no deja de ser un cotilleo empresarial más. Que, como tal, no tendría cabida aquí. Salvo por el hecho de que me consta que me leen muchos estudiantes, muchos profesionales que se replantean sus carreras, muchos desempleados que se están formando de cara a su reincorporación.

Sevilla: otro grupo local de usuarios de R

R

Me acabo de enterar que nuestros colegas de Sevilla están organizando la primera reunión de su grupo local de usuarios de R. Además, el tema es muy, muy relevante y de interés general: R Markdown.

Los detalles, aquí.

Sevillanos que seguís esta bitácora: ¡que no me entere yo que faltáis!

Descargar ficheros .gz detrás de HTTPS con R

R

El problema consiste en leer, por ejemplo, [https://stat.ethz.ch/pipermail/r-help-es/2012-August.txt.gz](https://stat.ethz.ch/pipermail/r-help-es/2012-August.txt.gz).

Desde Windows, por algún motivo, es sencillo: se puede usar download.file y luego, readLines directamente (porque no sé si sabéis que esta y otras funciones similares saben leer directamente ficheros comprimidos con gzip).

En Linux parece algo más complicado: download.file se niega a bajar ficheros usando el protocolo [https](http://en.wikipedia.org/wiki/HTTP_Secure). Lo mejor que he sabido hacer es

library(httr)
x <- GET("https://stat.ethz.ch/pipermail/r-help-es/2012-August.txt.gz")
tmp <- tempfile()
writeBin(content(x, "raw"), tmp)
res <- readLines(tmp)
unlink(tmp)

que es feo, feo, feo.

Remuestreos y tests de hipótesis

No sé si visteis el vídeo que colgué el otro día. Trataba el problema de determinar si dos poblaciones

beer  <- c(27, 20, 21, 26, 27, 31, 24,
        21, 20, 19, 23, 24,
        18, 19, 24, 29, 18, 20, 17,
        31, 20, 25, 28, 21, 27)
water <- c(21, 22, 15, 12, 21, 16, 19,
        15, 22, 24, 19, 23, 13,
        22, 20, 24, 18, 20)

tienen o no la misma media. Más concretamente, si la población beer tiene una media superior a la de water como en efecto sucede:

mean(beer)
#[1] 23.2
mean(water)
#[1] 19.22222

¿Pero es esta diferencia significativa?

Muchos plantearían un t-test:

t.test(beer, water, alternative = "greater")
# Welch Two Sample t-test
#
# data:  beer and water
# t = 3.3086, df = 39.271, p-value = 0.001007
# alternative hypothesis: true difference in means is greater than 0
# 95 percent confidence interval:
#   1.952483      Inf
# sample estimates:
#   mean of x mean of y
# 23.20000  19.22222

Pero en el vídeo se propone una alternativa basada en remuestreos: