simmer v3.5.0 released on CRAN

We are proud to present simmer 3.5.0, a new release on CRAN of the Discrete-Event Simulator for R with a bunch of exciting features:

  • Simpler logging. So far, if we wanted arrivals to print something into the console, we had, for instance, to make a custom function returning zero, with a print() inside, and to put it into a timeout() activity. Now, with log_() it’s easier and, in addition, you get the simulation time and the arrival name:
library(simmer)

sayer <- create_trajectory() %>%
  log_("hello world!")

simmer() %>%
  add_generator("dummy", sayer, at(3, 6)) %>%
  run() %>% invisible
## 3: dummy0: hello world!
## 6: dummy1: hello world!
  • New resource modifiers. set_capacity() and set_queue_size() existed before, but they were not very useful. Now, these methods become activities and you can use them in your trajectories. They have their associatedset_capacity_selected() and set_queue_size_selected(), just like seize() and release(), for a joint use with the resource selector select().
  • New generator modifiers. Activities activate(), deactivate() allow us to start/stop generators from within trajectories. Activities set_trajectory(), set_distribution() allow us to change a generator’s assigned trajectory or distribution respectively.
  • New interarrival communication activities, allowing asynchronous programming. send(), trap(), untrap()and wait() can be used to send signals, wait for signals, trap them and launch asynchronous handlers. Nothing better than an example to understand the possibilities of this mechanism:
library(simmer)

t_blocked <- create_trajectory() %>%
  trap("you shall pass", 
       handler = create_trajectory() %>%
         log_("ok, I'm packing...") %>%
         timeout(1)) %>%
  log_("waiting...") %>%
  wait() %>%
  log_("and I'm leaving!")

t_signaler <- create_trajectory() %>%
  log_("you shall pass") %>%
  send("you shall pass")

simmer() %>%
  add_generator("blocked", t_blocked, at(0)) %>%
  add_generator("signaler", t_signaler, at(5)) %>%
  run() %>% invisible
## 0: blocked0: waiting...
## 5: signaler0: you shall pass
## 5: blocked0: ok, I'm packing...
## 6: blocked0: and I'm leaving!

Other interesting new features from past releases since our last post include post-seize and reject optional trajectories when seizing resources, arrival cloning and synchronizing, arrival batching and separating or reneging.

Please, refer to the updated Advanced Trajectory Usage vignette for more information and examples. Also remember that you can participate in our simmer-devel mailing list to get help, discuss methodologies… any feedback is always welcome.

¿La peor gráfica de la historia?

Se puede hacer peor, pero es francamente complicado. Me refiero a esta:

temperatura-piratas

La competencia es feroz, por lo que no me atreveré a responder afirmativamente al título de esta entrada, pero sin duda es una de las peores que he visto. No obstante, lo que más me duele de esta gráfica es que haya salido en uno de los pocos programas que hay en la televisión pública que tratan de popularizar la ciencia. Me estoy refiriendo a Órbita Laika – La nueva generación, y la gráfica vino de la mano del compañero @SantiGarciaCC para ilustrar el concepto de que correlación no implica causalidad:

El objetivo es loable, pero el fin no justifica los medios. En su (pequeña) defensa, hay que decir que no son los autores de la gráfica. De hecho, esta gráfica se repite una y otra vez en Internet, a modo de meme, cada vez que un artículo habla de correlación y causalidad. Se ha representado hasta la extenuación (incluso bien). Esta misma versión apareció en JotDown, y una extensa labor de investigación por mi parte —consistente en una búsqueda de diez segundos en Google— me ha permitido determinar que el atentado, al gusto en general y a la representación de datos en particular, se produjo originariamente aquí.

¿Estoy dramatizando? En absoluto, y lo voy a demostrar con un análisis de la misma. Lo más rápido es empezar por los elementos que son correctos, a saber:

  • El eje vertical. Un eje debidamente etiquetado representando una variable continua con límites razonables.

Y ya. Hemos terminado. O mejor seguimos con lo que está mal, que —dejando de lado aspectos visuales como el horrible degradado de fondo— es todo lo demás:

  • Atención a la etiqueta del eje horizontal. Dice «Número de piratas (aproximado)«. 35000… 5000… 400 y de repente… ¡17! Ya de 5000 a 400 el error en la aproximación ha caído un orden de magnitud, pero seguidamente especificar 17 se corresponde con otros dos órdenes de magnitud… Simplemente absurdo.
  • El eje horizontal contiene una variable discreta (número de piratas), pero se representa como variable categórica. No se explica de otra manera la equidistancia entre cada valor y el hecho de que a veces suba (35000 a 45000) y a veces baje (el resto de casos).
  • Para representar una variable categórica, se utilizan puntos unidos con líneas. Esto no se debe hacer jamás, puesto que la línea representa evolución y no puede haber ninguna evolución entre categorías. Pensemos, por ejemplo, en el número de empleados en cada departamento de una empresa. ¿Unimos 25 del departamento de ventas con 15 del departamento de sistemas?
  • Lo anterior sucede porque de facto sí existe un pseudoeje horizontal continuo, que es sobre el que se produce el ordenamiento de los puntos, y es el tiempo. Pero, de nuevo, los intervalos numéricos y el espaciado no se corresponden, y los años aparecen absurdamente etiquetados sobre los puntos en lugar de bajo el eje horizontal, que es su sitio.
  • Por tanto, el título es incorrecto. Reza «Temperatura global vs. Nº de piratas», cuando lo que en realidad se representa es «Temperatura global vs. tiempo«. Aunque, como decíamos, el espaciado no es proporcional a la diferencia de años, por lo que la evolución mostrada no es fiel.

En definitiva, el número de piratas es un pegote, y cualquier relación que quiera verse en esa línea es pura fantasía. Esta gráfica es totalmente equivalente a poner una línea recta y datos cualesquiera inventados, y su perpetuación no le hace ningún bien a la divulgación científica.

Migración y acceso por HTTPS

Esta última semana hemos completado una migración a un nuevo proveedor de hosting para enchufa2.es y puratura.com, y si todo ha ido tan bien como parece, nadie habrá notado ni notará nada.

No obstante, gracias al nuevo proveedor, DreamHost, ambos dominios cuentan con acceso IPv6 y certificados SSL gratuitos cortesía de Let’s Encrypt, un excelente proyecto colaborativo patrocinado por gigantes como Akamai, Cisco, Google o Facebook, y cuyo objetivo es hacer de las conexiones cifradas algo ubicuo en la WWW. Esto último implica que, al acceder a cualquiera de los dos dominios, seréis automáticamente redirigidos a la versión segura, bajo HTTPS.

De la T4 a Madrid: ¿coche o transporte público? (2)

Gracias al artículo de ayer, De la T4 a Madrid: zonas favorecidas y maltratadas, algunos usuarios de Twitter de Vallecas se dieron cuenta de que los tiempos no eran correctos para su barrio. Efectivamente, Vallecas tiene una geografía peculiar: tiene mucha zona no urbanizada y la zona urbanizada se apelotona en un extremo de su territorio. Por tanto, el método original de calcular un centroide geográfico sobrestima distancia y duración en estos casos, y sobrestima el tiempo más en transporte público que en coche, lógicamente.

Marco volvió a sacar los datos de Google Maps, pero esta vez pasando a Google Maps el nombre del barrio y dejándole decidir cuál es ese destino (que parece que no lo hace mal). En el artículo de ayer ya vimos que la gráfica de tiempo vs. distancia cambiaba, y Vallecas y otros ya no aparecen fuera de la tendencia general. Ya adelantábamos, sin embargo, que la media calculada en De la T4 a Madrid: ¿coche o transporte público? a partir de los datos de los centroides no cambia mucho con esta nueva metodología.

bap4

La diferencia entre la media ponderada de distancia en coche y en transporte público, prácticamente desaparece. No obstante, las medias ponderadas de duración del viaje se mantienen similares: unos 23 minutos en coche por más de 1 hora en transporte público.