En el marco de este proyecto de investigación, nos adentraremos en la dinámica de sistemas tal como se describe en el libro “Small System Dynamics Models for Big Issues” de Pruyt. Nuestro enfoque se centra en examinar la rivalidad armamentista entre dos pandillas. Para lograr esto, utilizaremos herramientas como Vensim y R para desarrollar tanto el diagrama causal que representa la situación, como el diagrama de flujo correspondiente. Finalmente, llevaremos a cabo la simulación en R para comprender mejor esta compleja dinámica.
En este escenario hipotético, consideramos que la pandilla A sobreestima el armamento de la pandilla B en un 10%, lo que se traduce en un “factor de sobreestimación del armamento de la pandilla B por parte de la pandilla A” del 110%. Por otro lado, la pandilla B evalúa correctamente el armamento de la pandilla A, lo que significa que el “factor de sobreestimación del armamento de la pandilla A por parte de la pandilla B” es del 100%.
Nuestro objetivo es modelar este sistema y simular su comportamiento durante un período de 100 meses. Posteriormente, analizaremos los resultados de la simulación y los relacionaremos con los ciclos de causalidad identificados en el diagrama causal.
library("deSolve")
## Warning: package 'deSolve' was built under R version 4.2.3
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) #animal
# Definir el vector de tiempos para la simulación
times <- seq(0,100, by = 1) #100 meses, ambos
# 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.to.a*obsolescence.rate.a*arms.stock.gang.b-obsolescence.rate.a*arms.stock.gang.a
relative.arming.rate.b=overassesment.factor.gang.a.to.b*obsolescence.rate.b*arms.stock.gang.a-obsolescence.rate.b*arms.stock.gang.b
#Variables de flujo (son las que modifican a las variables de estado)
arming.gang.a=autonomous.arming.rate.a+relative.arming.rate.a
arming.gang.b=autonomous.arming.rate.b+relative.arming.rate.b
#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, #flujo
arming.gang.b = arming.gang.b))
})
}
# Definir los parámetros del modelo. Estan por fuera del sistema
parameters <- c(autonomous.arming.rate.a= 0.05,
autonomous.arming.rate.b =0.05 ,
overassesment.factor.gang.b.to.a =1.1 ,
overassesment.factor.gang.a.to.b =1.0 ,
obsolescence.rate.a=0.10,
obsolescence.rate.b=0.10)
# 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
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
)
out1 <- as.data.frame(out1)
out2 <- as.data.frame(out2)
# Graficar los resultados de la simulación
ggplot(out1, aes(x=time, y=arms.stock.gang.a )) + geom_line()
ggplot(out2, aes(x=time, y=arms.stock.gang.b)) + geom_line()
En este nuevo escenario, exploramos el caso en el que la pandilla A subestima el armamento de la pandilla B en un 50%. Es decir, el “factor de sobreestimación del armamento de la pandilla B por parte de la pandilla A” es del 50%. Por otro lado, la pandilla B evalúa correctamente el armamento de la pandilla A, con un “factor de sobreestimación del armamento de la pandilla A por parte de la pandilla B” del 100%.
Nuestro propósito es realizar una nueva corrida del modelo durante un periodo de 100 meses y observar el comportamiento resultante de esta simulación. Luego, analizaremos estos resultados y los relacionaremos con los ciclos de causalidad previamente identificados en el diagrama causal.
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) #animal
# Definir el vector de tiempos para la simulación
times <- seq(0,100, by = 1) #
# 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.to.a*obsolescence.rate.a*arms.stock.gang.b-obsolescence.rate.a*arms.stock.gang.a
relative.arming.rate.b=overassesment.factor.gang.a.to.b*obsolescence.rate.b*arms.stock.gang.a-obsolescence.rate.b*arms.stock.gang.b
#Variables de flujo (son las que modifican a las variables de estado) AQUI NO VAN ds
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 (se establece su ecuación diferencial de ahí viene la d SOLO AQUI SE PONE LA D para la de estado, las demas no)
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, #variables de flujo
arming.gang.b = arming.gang.b)) #variables de flujo
})
}
# Definir los parámetros del modelo. Estan por fuera del sistema
parameters <- c(autonomous.arming.rate.a= 0.05,
autonomous.arming.rate.b =0.05 ,
overassesment.factor.gang.b.to.a =0.50 ,
overassesment.factor.gang.a.to.b =1.00 ,
obsolescence.rate.a=0.10,
obsolescence.rate.b=0.10)
# 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
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
)
out1 <-as.data.frame(out1)
out2 <-as.data.frame(out2)
# Graficar los resultados de la simulación
ggplot(out1, aes(x=time, y=arms.stock.gang.a )) + geom_line()
ggplot(out2, aes(x=time, y=arms.stock.gang.b)) + geom_line()
Para concluir, llevamos a cabo la generación de una gráfica que muestra ambas corridas de los modelos. Al analizarla, podemos observar claramente cómo la posibilidad de conflicto y la tensión entre ambas pandillas incrementan notablemente debido a la especulación sobre el armamento.
Este análisis comparativo nos permite visualizar de manera más precisa cómo la sobreestimación o subestimación del armamento de una pandilla influye directamente en el clima de hostilidad y riesgo de confrontación entre ambas partes.
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) #animal
# Definir el vector de tiempos para la simulación
times <- seq(0,100, by = 1) #100 meses, ambos
# 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.to.a*obsolescence.rate.a*arms.stock.gang.b-obsolescence.rate.a*arms.stock.gang.a
relative.arming.rate.b=overassesment.factor.gang.a.to.b*obsolescence.rate.b*arms.stock.gang.a-obsolescence.rate.b*arms.stock.gang.b
#Variables de flujo (son las que modifican a las variables de estado)
arming.gang.a=autonomous.arming.rate.a+relative.arming.rate.a
arming.gang.b=autonomous.arming.rate.b+relative.arming.rate.b
#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, #flujo
arming.gang.b = arming.gang.b))
})
}
# Definir los parámetros del modelo. Estan por fuera del sistema
parameters <- c(autonomous.arming.rate.a= 0.05,
autonomous.arming.rate.b =0.05 ,
overassesment.factor.gang.b.to.a =1.1 ,
overassesment.factor.gang.a.to.b =1.0 ,
obsolescence.rate.a=0.10,
obsolescence.rate.b=0.10)
# 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
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
)
# Modificar parámetros para la segunda simulación
parameters <- c(autonomous.arming.rate.a= 0.05,
autonomous.arming.rate.b =0.05 ,
overassesment.factor.gang.b.to.a =0.50 , # Cambiado a 0.50
overassesment.factor.gang.a.to.b =1.00 ,
obsolescence.rate.a=0.10,
obsolescence.rate.b=0.10)
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
)
out1 <- as.data.frame(out1)
out2 <- as.data.frame(out2)
# Plot the results of both simulations
ggplot() +
geom_line(data = out1, aes(x = time, y = arms.stock.gang.a, color = "Model 1")) +
geom_line(data = out2, aes(x = time, y = arms.stock.gang.a, color = "Model 2")) +
geom_line(data = out1, aes(x = time, y = arms.stock.gang.b, color = "Model 1"), linetype = "dashed") +
geom_line(data = out2, aes(x = time, y = arms.stock.gang.b, color = "Model 2"), linetype = "dashed") +
scale_color_manual(name = "Models", values = c("Model 1" = "blue", "Model 2" = "red"),
labels = c("Model 1", "Model 2")) +
labs(x = "Time", y = "Arms Stock", title = "Comparison of Models") +
theme_minimal()
En el primer caso, la sobreestimación por parte de la pandilla A del armamento de la pandilla B en un 10% conduce a la adopción de medidas defensivas exageradas. Esto incrementa la tensión entre las pandillas y puede desencadenar conflictos. Por otro lado, en el segundo caso, la subestimación del armamento de la pandilla B por parte de la pandilla A en un 50% deja a esta última vulnerable ante posibles ataques. Esta situación puede ser aprovechada por la pandilla B para fortalecerse aún más, aumentando así la presión sobre la pandilla A y las posibilidades de violencia.
Pruyt, E. (2013). “Small System Dynamics Models for Big Issues: Triple Jump Towards Real-World Complexity” (1st ed.). TU Delft Library. ISBN 978-94-6186-195-5 - Libro donde se encuentra el caso mencionado anteriormente.