Por: Arturo Nepomuceno

Bienvenidxs de nuevo a la nueva publicación de mi blog Investigación Social. En esta edición, les traigo un ejemplo de Modelación de Sistemas aplicado, es decir, un caso hipotético con datos hipotéticos, esto para tener más claro cuál es la utilidad de esta metodología de investigación.

En esta publicación, se trabajó con el ejemplo 6.6 Gangs and Arms Races del libro Small System Dynamics Models for Big Issues: Triple Jump towards Real-World Dynamic Complexity de Erik Pruyt, en el que se detalla un proceso de carrera armamentística entre dos pandillas, A y B, es decir, un proceso en el cual dos actores en conflicto responden a las actividades armamentísticas del rival a través de la adopción propia de actividades armamentísticas (Pruyt, 2013, p. 95).

  1. Diagrama causal del problema

El siguiente diagrama causal se propone para explicar el comportamiento del almacenamiento de armas de las pandillas rivales A y B con base en el almacenamiento de armas del rival y otras variables establecidas en el caso 6.6.

Este diagrama causal tiene 3 ciclos de retroamlimentación:

  1. Diagrama de flujo del problema

Se propone también un diagrama de flujo del mismo sistema. Esto con el fin de simplificar las visualización de las relaciones causales del anterior diagrama.

Con base en el anterior sistema, podemos empezar a trabajar en el código que simulará cuál será la evolución del armamento de cada pandilla a través del tiempo, según las relaciones causales establecidas.

Código del Modelo de Sistemas

  1. Librerías
# Cargar el paquete deSolve para utilizar funciones de resolución de ecuaciones diferenciales
library(deSolve)
library(tidyverse)
library(ggplot2)

# Librería para arreglar gráficos en un mismo panel
library(ggpubr)
  1. Modelo del problema y comportamiento dinámico de las variables de estado
# Establecer las condiciones iniciales de la variable de estado
inicial.conditions <- c(armsStockGangA = 1, # Es decir, 100% de las armas necesarias para 
                                            # destruir a la pandilla B
                        armsStockGangB = 1) # Es decir, 100% de las armas necesarias para 
                                            # destruir a la pandilla A

# Definir el vector de tiempos para la simulación
times <- seq(0, 100, by = 1) # Periodo de 100 meses, con saltos cada mes

# Definir la función del modelo
model_gangs <-function(t, state, parameters){
  with(as.list(c(state, parameters)),{
    
    # Variables Auxiliares o endógenas
    relative.arming.rate.of.gang.a <- overassesment.factor.of.gang.b.arming.by.gang.a * arms.obsolescence.rate.of.gang.a * armsStockGangB - (arms.obsolescence.rate.of.gang.a * armsStockGangA)
    
    relative.arming.rate.of.gang.b <- overassesment.factor.of.gang.a.arming.by.gang.b * arms.obsolescence.rate.of.gang.b * armsStockGangA - (arms.obsolescence.rate.of.gang.b * armsStockGangB)
    
    # Variables de flujo (son las que modifican a las variables de estado)
    arming.of.gang.a <- autonomous.arming.rate.of.gang.a + relative.arming.rate.of.gang.a
    arming.of.gang.b <- autonomous.arming.rate.of.gang.b + relative.arming.rate.of.gang.b
       
    # Variable de estado (se establece su ecuación diferencial de ahí viene la d)
    darmsStockGangA <- arming.of.gang.a
    darmsStockGangB <- arming.of.gang.b
    
    # Devuelve los resultados de la variable de estado
    return(list(c(darmsStockGangA, darmsStockGangB),
                arming.of.gang.a = arming.of.gang.a,
                arming.of.gang.b = arming.of.gang.b))
  })
}

Con el código base de la simulación, podemos establecer variaciones en los valores de los parámetros del modelo, es decir, las variables exógenas, para así simular escenarios y comparar los resultados de estos, y así tener un mejor entendimiento de las relaciones causales en el sistema.

Escenario 1

En este escenario, se simuló una situación en la que la pandilla A sobreestima el armamento de la pandilla B en un 10%, es decir, que la variable overassessment factor del armamento de la pandilla B por la pandilla A es igual a 110%, y que la pandilla B evalúa correctamente el armamento de la pandilla A, es decir, que la variable overassessment factor del armamento de la pandilla A por la pandilla B es igual a 100%.

# Definir los parámetros del modelo (variables exógenas) 
parameters <- c(autonomous.arming.rate.of.gang.a = 0.05,
                autonomous.arming.rate.of.gang.b = 0.05,
                overassesment.factor.of.gang.b.arming.by.gang.a = 1.1, 
                overassesment.factor.of.gang.a.arming.by.gang.b = 1,
                arms.obsolescence.rate.of.gang.a = 0.1,
                arms.obsolescence.rate.of.gang.b = 0.1) 

# Seleccionar el método de integración a utilizar en la simulación, en este caso 'rk4' (Runge-Kutta de 4to orden)
intg.method <- c("rk4")

# Realizar la simulación utilizando la función 'ode' del paquete deSolve
out <- ode(
  y = inicial.conditions, #condiciones iniciales
  times = times, #tiempo de simulación
  func = model_gangs, #función del modelo
  parms = parameters,
  method = intg.method
)

# Graficar los resultados de la simulación

# Gráfico del stock de armas de la pandilla A
graph1 <- as.data.frame(out) %>% 
  ggplot(aes(x = time, y = armsStockGangA)) +
  geom_line() +
  labs(title = "Stock de armas de A en el tiempo",
       x = "Tiempo",
       y = "Stock de armas de A (Caso 1)") +
  theme_minimal() + 
  theme(axis.title.y = element_text(size = 9))

# Gráfico del stock de armas de la pandilla B
graph2 <- as.data.frame(out) %>% 
  ggplot(aes(x = time, y = armsStockGangB)) +
  geom_line() +
  labs(title = "Stock de armas de B en el tiempo",
       x = "Tiempo",
       y = "Stock de armas de B (Caso 1)") +
  theme_minimal() + 
  theme(axis.title.y = element_text(size = 9))

# Arreglar ambos gráficos en un mismo panel
ggarrange(graph1, graph2)

En el gráfico anterior, se puede observar un comportamiento de crecimiento exponencial en el almacenamiento de armamento de cada una de las pandillas. Esto se da gracias a que este modelo no cuenta con una variable de salida, es decir, no hay ninguna variable que impacte negativamente a la variable de estado almacenamiento de armamento de las pandillas. Por lo tanto, este escenario describe una situación en la que cada pandilla entra en una carrera armamentística sin un fin claro, puesto que, como evalúan que la pandilla rival tiene siempre el suficiente armamento para destruir a su pandilla, deciden ellos mismos seguir armándose por si llegara a suceder un conflicto.

Cabe resaltar que, debido a que la pandilla A sobreestima el armamento de la pandilla B, esta tiene un crecimiento un poco más grande que el de su pandilla rival.

Escenario 2

En este escenario, se simuló una situación en la que la pandilla A subestima el armamento de la pandilla B en un 50%, es decir, que la variable overassessment factor del armamento de la pandilla B por la pandilla A es igual a 50%, y que la pandilla B evalúa correctamente el armamento de la pandilla A, es decir, que la variable overassessment factor del armamento de la pandilla A por la pandilla B es igual a 100%.

# Definir los parámetros del modelo (variables exógenas) 
parameters2 <- c(autonomous.arming.rate.of.gang.a = 0.05,
                autonomous.arming.rate.of.gang.b = 0.05,
                overassesment.factor.of.gang.b.arming.by.gang.a = 0.5, 
                overassesment.factor.of.gang.a.arming.by.gang.b = 1,
                arms.obsolescence.rate.of.gang.a = 0.1,
                arms.obsolescence.rate.of.gang.b = 0.1) 

# Realizar la simulación utilizando la función 'ode' del paquete deSolve
out2 <- ode(
  y = inicial.conditions, #condiciones iniciales
  times = times, #tiempo de simulación
  func = model_gangs, #función del modelo
  parms = parameters2,
  method = intg.method
)

# Gráfico del stock de armas de la pandilla A
graph3 <- as.data.frame(out2) %>% 
  ggplot(aes(x = time, y = armsStockGangA)) +
  geom_line() +
  labs(title = "Stock de armas de A en el tiempo",
       x = "Tiempo",
       y = "Stock de armas de A (Caso 2)") +
  theme_minimal() + 
  theme(axis.title.y = element_text(size = 9)) 

# Gráfico del stock de armas de la pandilla B
graph4 <- as.data.frame(out2) %>% 
  ggplot(aes(x = time, y = armsStockGangB)) +
  geom_line() +
  labs(title = "Stock de armas de B en el tiempo",
       x = "Tiempo",
       y = "Stock de armas de B (Caso 2)") +
  theme_minimal() + 
  theme(axis.title.y = element_text(size = 9)) 

# Arreglar ambos gráficos en un mismo panel
ggarrange(graph3, graph4)

En el gráfico anterior, se pueden observar dos comportamientos distintos según la pandilla. La pandilla A tiene un comportamiento de crecimiento logístico, es decir, un crecimiento exponencial inicial hasta alcanzar un nivel de equilibrio de almacenamiento de armas. La pandilla B tiene un comportamiento de estabilización de un objetivo, es decir, un proceso de auto-regulación que lleva a un objetivo específico.

Cabe resaltar que el objetivo de estabilización de la pandilla B es mayor que el de la pandilla B, ya que ellos evalúan correctamente cuánto armamento tiene almacenado la pandilla A, mientras que esta subestima la cantidad de armamento almacenado de la pandilla B. Esto puede explicarse con base en la relación entre la variable exógena overassessment factor del armamento de la pandilla B por la pandilla A y la tasa relativa de armado de la pandilla A. Debido a que el valor de la primera variable es menor que su contraparte en la pandilla rival, el efecto que se tiene en el resultado final del almacenamiento de armamento de la pandilla A es menor también.

Comparación de modelos

Ahora, comparemos ambos modelos para tener una mejor perspectiva de la influencia de las variables en este modelo.

ggarrange(graph1, graph2, graph3, graph4, nrow = 2, ncol = 2) %>% 
  annotate_figure(plot, top = text_grob("Comparación de Simulaciones: Caso 1 y Caso 2", 
               color = "red", face = "bold", size = 14))

Gracias al gráfico anterior, podemos notar que el efecto que tienen variables exógenas en el comportamiento final de cada pandilla es de suma importancia. Si se subestima el armamento de la pandilla rival, esto puede resultar en que se almacenen menos armas, y a su vez impactar negativamente a la pandilla con menor armamento en una situación de conflicto armado.

Por lo tanto, podemos concluir que, aunque una variable no impacte directamente a una variable, si se tiene una perspectiva de dinámica de sistemas, esta variable tendrá impacto en el resultado final del sistema. Es necesario contar con un análisis de dinámica de sistemas para el estudio de variables cuyo impacto en otra parece no ser intuitivo, pero que, al introducir esta perspectiva, puede ser el factor de cambio de una situación.

Referencias

Pruyt, E. (2013). Small System Dynamics Models for Big Issues: Triple Jump towards Real-World Dynamic Complexity. TU Delft Library.