Gráficas para la ciencia y ciencia para las gráficas

A menudo, las innovaciones en ciencia son, ante todo, herramientas que simplifican la manera de abordar un problema, transformaciones que lo hacen más aprehensible a través de nuestros sentidos (la vía que tenemos para incorporar nueva información a nuestros modelos mentales, al fin y al cabo). Pensemos, por ejemplo, en la importancia de la notación en matemáticas. Representar una derivada con un símbolo o con otro puede parecer una discusión vacía, una cuestión de forma al fin y al cabo. Pero es que la forma (en ciencia, así como en arte) posibilita la aparición de nuevos contenidos. Si no, como propone Pablo Rodríguez, probad a hacer multiplicaciones con lápiz y papel usando números romanos.

Se nos pasó dejar por aquí un enlace a Gráficas para la ciencia y ciencia para las gráficas, nuestra colaboración en el Cuaderno de Cultura Científica del pasado 25 de abril.

Datos que entran por los ojos

Si uno le pregunta a Google Images qué es un una gráfica, puede encontrarse con un esperpento como el siguiente:

[…]

Más allá de la fealdad generalizada y los colores estridentes, la web y los medios de comunicación están plagados de ejemplos de malas representaciones de datos. Ejemplos donde el artificio y la ornamentación pervierten la función de estas poderosas herramientas.

Sigue leyendo Datos que entran por los ojos, nuestra última colaboración en el Cuaderno de Cultura Científica.

Aprendiendo de las máquinas

La segunda mitad del siglo XX vio nacer la computación y el sueño de la inteligencia artificial—“la ciencia de conseguir que las máquinas hagan cosas que requerirían inteligencia si las hiciesen humanos”, en palabras de Marvin Minsky—, que hoy en día está despertando un renovado interés gracias a la rama del aprendizaje automático. Se trata de un conjunto de técnicas que se benefician de los avances tecnológicos en materia de computación de las últimas dos décadas, y se caracterizan por su capacidad de engullir enormes cantidades de datos para enfrentarse a problemas de gran complejidad.

Sigue leyendo Aprendiendo de las máquinas, mi última colaboración en el Cuaderno de Cultura Científica.

Experimentación y evidencia: dos visiones opuestas

Anteriormente, hablábamos de estándares de evidencia científica y del problema filosófico de la inferencia inductiva; de cómo Ronald Fisher, hace un siglo, promovió métodos —como los contrastes de hipótesis— que evaden el problema, y adelantábamos que dichos métodos suponen una aproximación frecuentista a la realidad. A continuación abundaremos en el problema metodológico que plantean la medida y la estimación estadística de la (in)certidumbre, y que tiene su raíz en el concepto mismo de probabilidad. Esto da lugar a dos visiones opuestas aunque, como veremos, estrechamente relacionadas, lo que en estadística se denomina frecuentismo vs. bayesianismo.

Sigue leyendo Experimentación y evidencia: dos visiones opuestas, mi última colaboración en el Cuaderno de Cultura Científica.

simmer 4.2.1

The 4.2.1 release of simmer, the Discrete-Event Simulator for R, is on CRAN with quite interesting new features and fixes. As discussed in the mailing list, there is a way to handle the specific case in which an arrival is rejected because a queue is full:

library(simmer)

reject <- trajectory() %>%
  log_("kicked off...")

patient <- trajectory() %>%
  seize("nurse", continue=FALSE, reject=reject) %>%
  log_("nurse seized") %>%
  timeout(5) %>%
  release("nurse") %>%
  log_("nurse released")

env <- simmer() %>%
  add_resource("nurse", 1, 0) %>%
  add_generator("patient", patient, at(0, 1)) %>%
  run()
## 0: patient0: nurse seized
## 1: patient1: kicked off...
## 5: patient0: nurse released

But as Tom Lawton pointed out, until now, there was no way of handling any alternative path for an arrival that was preempted and “kicked off” from a resource. This mechanism has been implemented into the new handle_unfinished() activity:

patient <- trajectory() %>%
  handle_unfinished(reject) %>%
  seize("nurse") %>%
  log_("nurse seized") %>%
  timeout(5) %>%
  release("nurse") %>%
  log_("nurse released")

env <- simmer() %>%
  add_resource("nurse", 1, 0, preemptive=TRUE, queue_size_strict=TRUE) %>%
  add_generator("LowPrio_patient", patient, at(0), priority=0) %>%
  add_generator("HighPrio_patient", patient, at(1), priority=10) %>%
  run()
## 0: LowPrio_patient0: nurse seized
## 1: HighPrio_patient0: nurse seized
## 1: LowPrio_patient0: kicked off...
## 6: HighPrio_patient0: nurse released

Note that such a mechanism is more general, because it also covers the first scenario:

env <- simmer() %>%
  add_resource("nurse", 1, 0) %>%
  add_generator("patient", patient, at(0, 1)) %>%
  run()
## 0: patient0: nurse seized
## 1: patient1: kicked off...
## 5: patient0: nurse released

Whenever rejection (or preemption) happens and it is catched by the appropriate handler, the new getter get_seized() may be useful to know which resource was abandoned.

Finally, the readership may find interesting the new section about the implementation of state-dependent service rates in the Queueing Systems vignette. See below for a complete list of changes.

New features:

  • New handle_unfinished() activity sets a drop-out trajectory for unfinished arrivals, i.e., those dropped from a resource (due to preemption, resource shrinkage or a rejected seize) or those that leave a trajectory (#178 addressing #177).
  • New release_all() and release_selected_all() activities automatically retrieve the amount of resources seized and release it (#180 addressing #25).
  • New get_seized() and get_seized_selected() getters allow an arrival to retrieve the amount of resources seized (#180 addressing #179).
  • New stop_if() activity sets a conditional breakpoint (#181 addressing #100).

Minor changes and fixes:

  • Fix performance issues in data sources (#176).
  • Update CITATION.
  • Fix monitored activity for preempted arrivals (as part of #178).
  • Fix seizes/releases with a null amount (as part of #180).
  • Rename internal status codes (as part of #181).
  • Provide more context on error or warning (as part of #181).
  • Extend the Queueing Systems vignette with a section about state-dependent service rates.
  • Fix performance issues in getters (#183).