simmer 3.6.1

A new patch release of simmer, the Discrete-Event Simulator for R, is on CRAN. Three months have passed since the last release. The last year was a period of intense development (one release per month). Now, the package has reached some level of maturity, so we intend to extend the release cycle.

In this maintenance release, the replacement operators for trajectories ([<-, [[<-) now work as expected. Also, we have removed previously deprecated plotting capabilities, which are covered and extended by the simmer.plot package.

Last but not least, we have extended the from_to() convenience function with a parameter every, which enables the generation of arrivals in cycles. For instance, let us suppose we want to simulate different patient arrival rates in the morning, evening and night:

library(simmer)
library(simmer.plot)
## Loading required package: ggplot2
set.seed(1234)
# units are hours
# visit time between 10 and 20 minutes
patient <- trajectory() %>%
seize("doctor", 1) %>%
timeout(function() runif(1, 10/60, 20/60)) %>%
release("doctor", 1)
morning <- from_to(start_time = 8,
stop_time = 16,
dist = function() rexp(1, 60/15),
arrive = FALSE, 
every = 24)
evening <- from_to(start_time = 16,
stop_time = 24,
dist = function() rexp(1, 60/30),
arrive = FALSE, 
every = 24)
night   <- from_to(start_time = 0,
stop_time = 8,
dist = function() rexp(1, 60/60),
arrive = FALSE, 
every = 24)
env <- simmer() %>%
add_resource("doctor", 1) %>%
add_generator("morning", patient, morning) %>%
add_generator("evening", patient, evening) %>%
add_generator("night",   patient, night) %>%
run(24 * 5) # simulate 5 days
breaks <- c(0, cumsum(rep(8, 3 * 5)))
env %>%
get_mon_arrivals() %>%
dplyr::mutate(generator = factor(gsub("\\d", "", name))) %>%
ggplot(aes(start_time, fill=generator)) + xlab("time") +
stat_bin(breaks = breaks) +
scale_x_continuous(breaks = breaks)

plot(env, what="resources", metric="usage", "doctor", steps=TRUE) +
scale_x_continuous(breaks = breaks)

Minor changes and fixes:

  • Recycle logical indexes when subsetting (2526e75).
  • Implement replacement operators, [<- and [[<- (#88).
  • Provide rep() S3 method for trajectories (7fa515e).
  • Remove plotting functions (bb9656b), deprecated since v3.6.0. The new simmer.plot package (on CRAN) already covers these features among others.
  • Don’t evaluate vignette chunks if Suggests are not installed (e40e5b6).
  • Rewrite DESCRIPTION (3f26516).
  • Add an every parameter to the from_to() convenience function (9d68887).

Suggests and Vignettes

Dirk Eddelbuettel quite rightly reminded us the other day that Suggests is not Depends. I am sorry to say that I am one of those who are using Suggests… “casually”. Mea culpa. I must say that this is restricted to vignettes: there are no tests nor examples using suggested packages. But I am not checking if my suggested packages are available at all, which is definitely wrong. And I understand that it must be frustrating to run reverse dependencies on a package as popular as Rcpp when the rest of us are using Suggests so… casually. So I was definitely determined to solve this, and I finally managed to find a very simple solution that may be helpful to other maintainers.

Our simmer package has seven vignettes. Two of them are very introductory and do not use any external package. But as you try to demonstrate more advanced features and use cases, you start needing some other tools; and their use could be intensive, so that checking suggested packages for every call or every code chunk might not scale. However, I realised that the important thing for those advanced vignettes is just to make the story they tell available to your users, and anyway they are always built and available online on CRAN. Therefore, I decided to add the following at the beginning of each vignette:

required <- c("pkg1", "pkg2", "pkgn")
if (!all(unlist(lapply(required, function(pkg) requireNamespace(pkg, quietly = TRUE)))))
knitr::opts_chunk$set(eval = FALSE)

Problem solved. Yes, I know, I am still taking knitr for granted. But given that it has its own entry (VignetteBuilder) in the DESCRIPTION, I think this is fair enough. I only hope that Dirk will unblacklist simmer after our next release. ;-)

Periodismo de datos sin datos

(Esta anotación se publica simultáneamente en Naukas)

Me encuentro en Twitter con el siguiente gráfico despropósito de CBS News:

donde se hace referencia al porcentaje de estadounidenses que dice haber probado la marihuana. Evidentemente, los porcentajes no suman 100 % porque se refieren a una misma población en tres instantes temporales diferentes. Evidentemente, digo, si uno lee todo el texto y se para a digerir lo que está viendo, por lo que mostrar una gráfica pierde toda su razón de ser.

Gráficas horribles como esta constituyen, desafortunadamente, la tónica generalizada en los medios de comunicación, con mención especial para la televisión. Pero esta en concreto me ha llamado especialmente la atención porque, paradójicamente, la torpeza en la representación esconde un despropósito mucho mayor que tiene que ver con los datos (o su ausencia, más bien).

Desconozco si CBSN quería decirnos simplemente que mucha gente apoya la legalización de la marihuana, como reza el titular. Si es así, no entiendo qué tiene que ver el porcentaje de gente que la ha probado y, en todo caso, el dato de hoy en día sería más que suficiente. Por el contrario, la elección de la pregunta y los datos históricos sugieren más bien que el número de fumetas se ha disparado peligrosamente (crecimiento de 9 puntos en 19 años y ¡8 puntos en el último año!). Pero independientemente de su intención, la representación de una serie temporal debe hacerse de la siguiente manera:

Además, cuando hablamos de porcentajes, lo ideal es comprimir el eje hasta mostrar la referencia del 0 %:

Desatinos aparte, se agradece que CBSN especifique el margen de error, que es del +/- 4 % (con un nivel de confianza del 95 %, asumo, por lo que podemos inferir que el número de encuestados se sitúa entre 500 y 1000 personas). Una última mejora, por tanto, pasaría por añadir dicho margen de error:

Ahora tenemos una buena gráfica, pero el problema de fondo persiste: estamos haciendo periodismo de datos sin datos. ¿Qué hay entre 1997 y 2016? No lo sabemos (y no sabemos si lo saben), y por tanto no hay manera de interpretar el aparente crecimiento del último año. Podemos hacer, no obstante, el ejercicio de inventarnos unos cuantos datos, aunque sea de manera chabacana, y ver cómo podría cambiar el cuento:

Simplemente he cogido la media de los datos de 1997 y hoy y he generado valores según una normal de desviación adecuada al margen de error. Como resultado, el efecto de crecimiento acelerado desaparece. En definitiva, parece claro que ha habido un incremento desde el año 1997, pero poco o nada podemos decir del incremento del último año.

Sobrentendidos. 11 de febrero, Día de la Mujer y la Niña en la Ciencia

Hace algunos años, yo no creía que días como hoy fuesen necesarios: días en los que se reivindica a tantas figuras históricas no solo como científicas, sino también en tanto que mujeres. Solía defender, con el ceño fruncido y la voz herida de orgullo que «yo» no necesitaba discriminación positiva, que los méritos debían brillar por sí mismos, que los genitales de cada cual son cosa suya, que el tiempo pone las cosas en su sitio…

Es lo que tienen los instintos morales: que hunden sus raíces hasta el estómago y, solo con tiempo, información y suficiente esfuerzo, somos capaces de cambiarlos. ¿Os habéis preguntado alguna vez por qué cada vez que sale la palabra «feminismo» se monta un flame en Internet? Bien, este es el motivo. Todo el mundo conoce mujeres y todo el mundo «siente» (muy fuerte, a la altura del ombligo) cuál debe ser la actitud correcta hacia ellas; a saber, la suya propia. Rara vez 140 caracteres son suficientes para darse cuenta de que, además de sentimientos y un conocimiento parcial de ciertas mujeres, conviene tener a mano estudios e información objetiva que aclare las bases del problema. Muchos ni siquiera piensan que los datos deban ocupar un lugar en el debate.

Sin embargo, no hay nada como pillarte infraganti, víctima de tus propios sesgos, para empezar a dudar de esas intuiciones y girar la cabeza hacia los datos. En mi caso, la anécdota reveladora (o así la recuerdo yo: una especie de bisagra) vino de la mano de mi nueva carrera.

Cuando empecé el grado en Física, dio la casualidad de que tres de mis compañeros de trabajo habían empezado a estudiar por la UNED también. Ellos eran ingenieros y se habían matriculado en matemáticas. La rutina de estudios y exámenes daba para bastantes anécdotas y fomentaba el sentimiento de compañerismo, pero también… cierto grado de competición: llegaron los primeros exámenes y se descubrió que mis resultados en física eran muy buenos. Más concretamente, mis resultados en física eran mejores que los suyos en matemáticas. No en vano, soy una gran empollona, tan empollona que en 2° de carrera me dieron el premio a empollona del año de la Facultad de Ciencias de la UNED. Pero claro, ellos eran ingenieros, eran tres y, sí, eran hombres, así que algo debía de estar fallando.

La broma cuajó pronto. «Es que física es una carrera muy fácil», mucho más fácil que matemáticas, esto es. Pero lo malo no fue la broma. A fin de cuentas, era solo un comentario que nacía del juego, de la competencia sana entre pares, era eso, solo una broma. Lo malo fue el sobrentendido. Pronto, todos pensábamos que matemáticas debía de ser mucho más difícil que mis estudios. Pronto, yo misma pensaba que física no podía ser una carrera tan complicada.

Tardé todavía un año en darme cuenta de mi propio sobrentendido y algo más en asociarlo a cuestiones de género, a la imagen que yo misma tenía de “ellos” (ingenieros varones, luego más brillantes que yo) y de mi capacidad para las materias técnicas, esa capacidad que nunca hubiese puesto en duda de manera consciente. Descubrir ese sesgo misógino en mis propios ojos, como un filtro inconsciente y dirigido hacia mi propio desempeño, me hizo darme cuenta de cómo se lo aplicaba, sin quererlo, a otras mujeres. Me obligó a revisarme y a darme cuenta de que, sin datos, sin esfuerzo, sin activismo y sin días como hoy, el tiempo por sí solo nunca pondrá las cosas en su sitio.