R

Ficheros KML con R y ggmap

Fácil:

library(maptools)
library(ggmap)

# un fichero bajado el Ayto. de Madrid
# (catálogo de datos abiertos)
rutas <- getKMLcoordinates("dat/130111_vias_ciclistas.kml")

# procesando el fichero kml
rutas <- lapply(1:length(rutas),
    function(x) data.frame(rutas[[x]], id = x))
rutas <- do.call(rbind, rutas)

# mapa de Madrid
mapa <- get_map("Madrid",
    source = "stamen", maptype = "toner",
    zoom = 12)

# pintando los tramos sobre el mapa
ggmap(mapa) + geom_path(aes(x = X1, y = X2,
    group = id), data = rutas,
    colour = "red")

produce

rutas_ciclistas_madrid

Nota: KML es esto.

¿Hay una epidemia en mi grafo?

Tengo un grafo, g cuyas aristas pueden ser cualquier cosa susceptible de contaminarse. Me pregunto si la contaminación puede contagiarse a través del grafo. Es decir, si A y B están unidos por una arista y A está contaminado, la probabilidad de que B también lo esté es superior a la normal.

Se me ocurre probar esa hipótesis así:

library(igraph)

# mi grafo
g <- erdos.renyi.game(10000,
  p.or.m = 0.001, type="gnp")

min.mean.dist <- function(n){
  # contaminación al azar
  contaminados <- sample(V(g), n)

  # distancias entre aristas contaminadas
  res <- shortest.paths(g,
    v = contaminados, to = contaminados)
  diag(res) <- Inf

  # distancia al contaminado más próximo
  min.dist <- apply(res, 1, min, na.rm = T)

  # y su media
  mean(min.dist)
}

# histograma bajo la hipótesis nula
res <- replicate(100, min.mean.dist(100))

El resto son detalles que el lector atento sabrá completar por su cuenta.

Validación cruzada en R

Está de moda usar caret para estas cosas, pero yo estoy todavía acostumbrado a hacerlas a mano. Creo, además, que es poco instructivo ocultar estas cuestiones detrás de funciones de tipo caja-negra-maravillosa a quienes se inician en el mundo de la construcción y comparación de modelos. Muestro, por tanto, código bastante simple para la validación cruzada de un modelo con R:

# genero ids
ids <- rep(1:10, length.out = nrow(cars))

# Nota: da igual si nrow(df) no es múltiplo de 10

# los aleatorizo
ids <- sample(ids)

# esto devuelve una lista de dfs:
preds.cv <- lapply(unique(ids), function(i){
  preds <- predict(lm(dist ~ speed,
    data = cars[ids != i,]), cars[ids == i,])
  data.frame(
    preds = preds,
    real = cars[ids == i,]$dist)
})

# "apilo" los dfs:
preds.cv <- do.call(rbind, preds.cv)

# calculo el rmse
rmse <- sqrt(mean((preds.cv$preds - preds.cv$real)^2))

Sí, estoy usando el RMSE aunque sea un detractor del mismo.

Hoy se ha anunciado la propuesta de nueva página de la Comunidad R Hispano

R

Acabo de escribir a los socios de la Comunidad R Hispano acerca de la existencia de una propuesta para renovar la página de la asociación. Podéis ver la versión actual y la propuesta.

Logo de la Comunidad R Hispano

(Y agradezco muchísimo el trabajo de Paula López Casado, responsable de que la nueva página tenga un aspecto infinitamente más atractivo que la que lees).

(Además, esta entrada incluye el que será el nuevo logo de la Comunidad R Hispano).

storr: como Redis, pero con R

R

Probablemente no habéis utilizado nunca Redis. Redis es un sistema de almacenamiento basado en parejas clave-valor. Es similar a un diccionario de Python o a un entorno en R. Salvo que el almacenamiento es externo al proceso: los datos se guardan en un sistema distribuido y potencialmente ilimitado en cuanto a capacidad.

Si queréis probar algo parecido, además de los diccionarios y los entornos, podéis probar con storr , un paquete reciente de R. Aquí tenéis una minisesión de ejemplo:

Premoniciones de Tirole sobre sobre el R Consortium

R

A J. Tirole tiene Nobel de economía. En 2002 escribió un artículo, Some Simple Economics of Open Source, en el que trataba de explicar desde un punto de vista económico y de organización industrial el porqué de esa rareza. Aparte de cuestiones como si sería extrapolable a otros sectores distintos del del desarrollo de software.

En la sección sobre la reacción de las compañías de software frente al fenómeno del software libre tiene un apartado titulado viviendo simbióticamente de [no con] un proyecto de código abierto que termina con la frase (mi traducción):

Comparaciones de tres grupos: pruebas vs modelos

Una pregunta reciente en r-help-es se refería a la comparación en R de las proporciones en tres grupos. Obviando algunas pequeñas complicaciones en el problema, la respuesta canónica podría ser esta:

total <- c(56, 49,51)
positivos <- c(14, 10, 17)
prop.test(tmp$positivos, tmp$positivos + tmp$negativos)

# 3-sample test for equality of proportions without continuity correction
#
# data:  tmp$positivos out of tmp$positivos + tmp$negativos
# X-squared = 2.2289, df = 2, p-value = 0.3281
# alternative hypothesis: two.sided
# sample estimates:
#   prop 1    prop 2    prop 3
# 0.2500000 0.2040816 0.3333333

Los grupos no parecen ser desiguales.

Por si os interesa el tema de la energía, las centrales, las emisiones, etc.

R

Esta entrada será del interés de a quien le atraigan dos temas bastante independientes entre sí:

  • La energía, las centrales eléctricas, sus emisiones, etc.
  • SPARQL

Allá va el código

library(SPARQL)
library(ggplot2)

queryString = "PREFIX a: <http://enipedia.tudelft.nl/wiki/>
PREFIX prop: <http://enipedia.tudelft.nl/wiki/Property:>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?plant ?name ?elec_capacity_MW ?lat ?lon ?operator
where {
?plant prop:Country a:Spain .
#get the name
#?plant rdfs:label ?name .
?plant prop:Generation_capacity_electrical_MW ?elec_capacity_MW .
#?plant prop:Operator ?operator .
?plant prop:Latitude ?lat .
?plant prop:Longitude ?lon .
}"


d <- SPARQL(url="http://enipedia.tudelft.nl/sparql",
            query=queryString, format='csv',
            extra='&format=text%2Fcsv')

ggplot(d$results, aes(x = lon, y = lat, size = elec_capacity_MW)) +
  geom_point()

y lo que genera, que es

¿En qué año era la el almacenamiento en disco tan caro como hoy en memoria?

R

La respuesta a sea pregunta, y siempre de acuerdo con los datos de John C. McCallum, la da

discos_vs_memoria

que hace corresponder a cada año del eje horizontal el correspondiente (en el vertical) aquel en el que el almacenamiento en disco venía a costar lo mismo (euros por MB) que el memoria en el primero.

Hoy vamos casi por 2000.

Me llama la atención que el crecimiento se esté ralentizando.

El código, por si alguien le encuentra alguna tara, es