Modelado de la dinámica de un sistema delictivo por Alejandra Martínez Blackaller

Problema 6.6 del libro Small System Dynamics Models for Big Issues: Triple Jump towards Real-World Complexity de Erik Pruyt, Gangs and Arms Races

1. Diagrama causal del problema

2. Diagrama de flujo del problema

3. Modelo del problema y comportamiento dinámico de las variables de estado

library("deSolve")
library(ggplot2)

# Establecer las condiciones iniciales de la variable de estado. En este caso 1
inicial.conditions <- c(arms_stock_gang_a = 1.0,
                        arms_stock_gang_b = 1.0)

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

# Definir la función del modelo. 
#parametros son las variables exógenas
model_arms<-function(t, state, parameters){
  with(as.list(c(state, parameters)),{
    
    #Variables Auxiliares o endógenas
    relative_arming_rate_a= overassesment_factor_gang_b_by_a*obsolescence_rate_a*arms_stock_gang_b-obsolescence_rate_a*arms_stock_gang_a
    relative_arming_rate_b=overassesment_factor_gang_a_by_b*obsolescence_rate_b*arms_stock_gang_a-obsolescence_rate_b*arms_stock_gang_b
    
    #Variables de flujo
    arming_gang_a=autonomous_arming_rate_a+relative_arming_rate_a
    arming_gang_b=autonomous_arming_rate_b+relative_arming_rate_b

    #SE EMPIEZA DE AQUI: variable de estado
    darms_stock_gang_a=arming_gang_a
    darms_stock_gang_b=arming_gang_b
    
    
#Devuelve los resultados de la variable de estado
    return(list(c(darms_stock_gang_a, darms_stock_gang_b), 
               arming_gang_a = arming_gang_a, 
               arming_gang_b = arming_gang_b)) 
  })
}

# Definir los parámetros del modelo. 

## Simulación 1
### Supongamos que la gang A sobreestima el armamento de la banda B en un 10%, es decir, que el "overassessment factor of gang B arming by gang A" es 110%, y que la banda B evalúa correctamente el armado de la banda A, es decir, el "overassessment factor of gang A arming by gang B" es 100%. Modela este sistema y simula el modelo durante un periodo de 100 meses. Describe el comportamiento que muestra la simulación y relacionalo con los ciclos de causalidad que hayas encontrado en el diagrama causal.
parameters <- c(autonomous_arming_rate_a= 0.05,
                autonomous_arming_rate_b =0.05 ,
                overassesment_factor_gang_b_by_a =1.1 ,
                overassesment_factor_gang_a_by_b =1.0 ,
                obsolescence_rate_a=0.10,
                obsolescence_rate_b=0.10)

## Simulación 2
### Ahora supongamos que la gang A subestima el armamento de la banda B en un 50%, es decir, que el "overassessment factor of gang B arming by gang A" es 50%, y que la banda B evalúa correctamente el armado de la banda A, es decir, el "overassessment factor of gang A arming by gang B" es 100%. Haz una nueva corrida del modelo durante un periodo de 100 meses. Describe el comportamiento que muestra la simulación y relacionalo con los ciclos de causalidad que hayas encontrado en el diagrama causal. 
parameters2 <- c(autonomous_arming_rate_a= 0.05,
                autonomous_arming_rate_b =0.05 ,
                overassesment_factor_gang_b_by_a =0.50 ,
                overassesment_factor_gang_a_by_b =1.00 ,
                obsolescence_rate_a=0.10,
                obsolescence_rate_b=0.10)


# Seleccionar el método de integración a utilizar 
intg.method = c("rk4")

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

out2 <- ode(
  y = inicial.conditions,  #condiciones iniciales
  times = times, #tiempo de simulación
  func = model_arms, #función del modelo
  parms = parameters,
  method = intg.method
)
out3 <- ode(
  y = inicial.conditions,  #condiciones iniciales
  times = times, #tiempo de simulación
  func = model_arms, #función del modelo
  parms = parameters2,
  method = intg.method
)
out4 <- ode(
  y = inicial.conditions,  #condiciones iniciales
  times = times, #tiempo de simulación
  func = model_arms, #función del modelo
  parms = parameters2,
  method = intg.method
)


out1 <- as.data.frame(out1)
out2 <- as.data.frame(out2)
out3 <- as.data.frame(out3)
out4 <- as.data.frame(out4)



ggplot() +
  geom_line(data = out1, aes(x = time, y = arms_stock_gang_a, color = "arms_stock_gang_a"), show.legend = TRUE) +
  geom_line(data = out2, aes(x = time, y = arms_stock_gang_b, color = "arms_stock_gang_b"), show.legend = TRUE) +
  scale_color_manual(name = "Legend", 
                     values = c("arms_stock_gang_a" = "blue", "arms_stock_gang_b" = "red"),
                     labels = c("arms_stock_gang_a" = "Blue: Arms stock of gang A", "arms_stock_gang_b" = "Red: Arms stock of gang B")) +
  labs(title = "Sobre estimación del armamento de la banda B \n y evaluación correcta del armado de la banda A",
       y = "Arms stock of gangs")

ggplot() +
  geom_line(data = out3, aes(x = time, y = arms_stock_gang_a, color = "arms_stock_gang_a"), show.legend = TRUE) +
  geom_line(data = out4, aes(x = time, y = arms_stock_gang_b, color = "arms_stock_gang_b"), show.legend = TRUE) +
  scale_color_manual(name = "Legend", 
                     values = c("arms_stock_gang_a" = "blue", "arms_stock_gang_b" = "red"),
                     labels = c("arms_stock_gang_a" = "Blue: Arms stock of gang A", "arms_stock_gang_b" = "Red: Arms stock of gang B")) +
  labs(title = "Subestimación del armamento de la banda B \n y evaluación correcta del armado de la banda A",
       y = "Arms stock of gangs")