De que habla este caso: Se trata de un modelo de simulación para delitos de alto impacto (High Impact Crimes) en un distrito policial, enfocado en robos a casas (burglaries) y robos a tiendas (robberies). El objetivo es entender la dinámica de estos delitos, su relación con la estacionalidad (robos en casas son estacionales; robos a tiendas no), la reincidencia de los delincuentes (conocidos y desconocidos), y cómo influyen las medidas de protección y los programas de rehabilitación.
1.- Inicialmente hay 200 delincuentes conocidos y 750 desconocidos. 2.- Delincuentes conocidos cometen más delitos por año (2.5) que los desconocidos (1). 3.- Los robos en casas siguen un patrón estacional (pico a fin de año, mínimo en verano). 4.- Atractivo de cometer un robo depende de ganancias, dificultad y probabilidad de ser atrapado. 5.- Se modela cómo la instalación de protecciones (en casas y tiendas) reduce la proporción de objetivos “fáciles” (IP, insufficiently protected). 6.- Después de ser atrapados, algunos delincuentes reinciden y otros no; se considera la salida de prisión y programas como el PBA, que reduce la reincidencia. 7.- Se contempla cómo la proporción de viviendas/tiendas IP impacta la facilidad para cometer delitos.
El modelo ayuda a la policía a simular y entender cómo los delitos evolucionan en el tiempo, y cómo intervenciones como la protección de propiedades o programas de acompañamiento afectan la delincuencia.
Se agregaron algunas variables para una mejor modelacion del modelo y de esa forma lograr los resultados deseados:
Variables auxiliariares total.offenses known.offenses unknown.offenses
library(deSolve)
# Variables de estado
InitialConditions <- c(
known.offenders.at.liberty = 200, # Known at liberty
unknown.offenders.at.liberty = 750, # Unknown at liberty
Delay1 = 100,
Delay2 = 100,
Delay3 = 100, # arrestos efectivos (delay)
offenders.in.jail = 185 # Offenders in jail
)
#Tiempo de simulación
times <- seq(0,#initial time
10,# años
1/12) # mensual
examen <- function(t, state, parameters) {
with(as.list(c(state,parameters)), {
#Endogenous auxiliary variables
known.offenses <- known.offenders.at.liberty * number.of.offenses.per.know.offender.at.liberty
unknown.offenses <- unknown.offenders.at.liberty * number.of.offenses.per.unknown.offender
total.offenses <- known.offenses + unknown.offenses
seasonality.of.these.offenses <- 1 + 0.5 * sin(2 * pi * (t - 0.75)) # creada
number.of.seasonal.robberies.and.burglaries <- seasonality.of.these.offenses * (known.offenses + unknown.offenses)
attractiveness.of.burglary <- average.gain.per.burglary / (chance.of.being.caught.after.a.burglary * difficulty.of.a.burglary)
attractiveness.of.robbery <- average.gain.per.robbery / (chance.of.being.caught.after.a.robbery * difficulty.of.a.robbery)
relative.attractiveness.of.burglary <- attractiveness.of.burglary / ( attractiveness.of.burglary + attractiveness.of.robbery)
relative.attractiveness.of.robbery <- attractiveness.of.robbery / (attractiveness.of.burglary + attractiveness.of.robbery)
burglaries <- relative.attractiveness.of.burglary * number.of.seasonal.robberies.and.burglaries
robberies <- relative.attractiveness.of.robbery * number.of.seasonal.robberies.and.burglaries
effective.arrests <- Delay3
arrests.after.burglaries <- chance.of.being.caught.after.a.burglary * burglaries
arrests.after.robberies <- chance.of.being.caught.after.a.robbery * robberies
#Flow variables
those.who.stop.after.leaving.jail <- percentage.that.stops.after.leaving.jail * (offenders.in.jail/average.time.in.jail)
known.offenders.released.from.jail <- (offenders.in.jail/average.time.in.jail) - those.who.stop.after.leaving.jail
known.offenders.sent.to.jail <- effective.arrests * (number.of.offenses.per.know.offender.at.liberty/(number.of.offenses.per.know.offender.at.liberty+number.of.offenses.per.unknown.offender))
new.offenders <- unknown.offenders.at.liberty * percentage.increase.of.new.offenders
unknown.offenders.sent.to.jail <- effective.arrests - known.offenders.sent.to.jail
total.number.of.arrests.after.burglaries.and.robberies <- arrests.after.burglaries + arrests.after.robberies
#métricas de desempeño
#State (stock) variables (d)
dknown.offenders.at.liberty <- known.offenders.released.from.jail - known.offenders.sent.to.jail
dunknown.offenders.at.liberty <- new.offenders - unknown.offenders.sent.to.jail
dDelay1 <- (total.number.of.arrests.after.burglaries.and.robberies - Delay1) / delay.time
dDelay2 <- (Delay1 - Delay2) / delay.time
dDelay3 <- (Delay2 - Delay3) / delay.time
doffenders.in.jail <- unknown.offenders.sent.to.jail + known.offenders.sent.to.jail - known.offenders.released.from.jail - those.who.stop.after.leaving.jail
# AGREGAR LA VARIABLE DE ESTADO, POR QUE ESO ES LO QUE SE VA A PLOTEAR
list(c(dknown.offenders.at.liberty,
dunknown.offenders.at.liberty,
dDelay1,
dDelay2,
dDelay3,
doffenders.in.jail))
})
}
parameters<-c(
average.time.in.jail = 2, #años
number.of.offenses.per.know.offender.at.liberty = 2.5, #offenses per year
number.of.offenses.per.unknown.offender = 1, # offenses per year
percentage.increase.of.new.offenders = 2/100, # %
average.gain.per.burglary = 600, # euros
chance.of.being.caught.after.a.burglary = 8/100, # %
difficulty.of.a.burglary = 100/100, # 100%
average.gain.per.robbery = 1200, #euros
chance.of.being.caught.after.a.robbery = 33/100,
difficulty.of.a.robbery = 10, # 10 times higher
delay.time = 0.25, # años
percentage.that.stops.after.leaving.jail = 25/100 # %
)
intg.method<-c("rk4")
out <- ode(y = InitialConditions,
times = times,
func = examen,
parms = parameters,
method =intg.method )
plot(out,
col=c("green"))
Se incorporará una intervención adicional que consiste en realizar 100 arrestos extra en el tercer año. Para ello, se introducirá una nueva variable auxiliar llamada extra.arrests, que se sumará a la cantidad total de arrestos por robos en casas y en tiendas (es decir, a la variable total.number.of.arrests.after.burglaries.and.robberies).
Adicionalmente, se considerará la implementación de la intervención PBA (Person Bound Approach), la cual tiene como propósito que los agentes de policía visiten de manera regular a los delincuentes conocidos en libertad, fomentando así su reinserción y reduciendo la reincidencia.
library(deSolve)
# son de las variables de estado
InitialConditions <- c(
known.offenders.at.liberty = 200, # Known at liberty
unknown.offenders.at.liberty = 750, # Unknown at liberty
Delay1 = 100,
Delay2 = 100,
Delay3 = 100, # arrestos efectivos (delay)
offenders.in.jail = 185, # Offenders in jail
known.offenders.in.PBA = 0
)
#tiempo de simulación
times <- seq(0,#initial time
10,# años
1/12) # mensual
examen <- function(t, state, parameters) {
with(as.list(c(state,parameters)), {
#Endogenous auxiliary variables
known.offenses <- known.offenders.at.liberty * number.of.offenses.per.know.offender.at.liberty
unknown.offenses <- unknown.offenders.at.liberty * number.of.offenses.per.unknown.offender
total.offenses <- known.offenses + unknown.offenses
seasonality.of.these.offenses <- 1 + 0.5 * sin(2 * pi * (t - 0.75)) # creada
number.of.seasonal.robberies.and.burglaries <- seasonality.of.these.offenses * (known.offenses + unknown.offenses)
attractiveness.of.burglary <- average.gain.per.burglary / (chance.of.being.caught.after.a.burglary * difficulty.of.a.burglary)
attractiveness.of.robbery <- average.gain.per.robbery / (chance.of.being.caught.after.a.robbery * difficulty.of.a.robbery)
relative.attractiveness.of.burglary <- attractiveness.of.burglary / ( attractiveness.of.burglary + attractiveness.of.robbery)
relative.attractiveness.of.robbery <- attractiveness.of.robbery / (attractiveness.of.burglary + attractiveness.of.robbery)
burglaries <- relative.attractiveness.of.burglary * number.of.seasonal.robberies.and.burglaries
robberies <- relative.attractiveness.of.robbery * number.of.seasonal.robberies.and.burglaries
effective.arrests <- Delay3
arrests.after.burglaries <- chance.of.being.caught.after.a.burglary * burglaries
arrests.after.robberies <- chance.of.being.caught.after.a.robbery * robberies
extra.arrests <- ifelse(t >= 3 & t < 4, 100, 0)
###--------------------- INTERVENCIONES --------------
aimed.number.of.known.offenders.in.PBA <- ifelse(t >= 3 & t < 4, pba.aimed, 0)
known.offenses <- (known.offenders.at.liberty) * number.of.offenses.per.know.offender.at.liberty
#Flow variables
those.who.stop.after.leaving.jail <- percentage.that.stops.after.leaving.jail * (offenders.in.jail/average.time.in.jail)
known.offenders.released.from.jail <- (offenders.in.jail/average.time.in.jail) - those.who.stop.after.leaving.jail
known.offenders.sent.to.jail <- effective.arrests * (number.of.offenses.per.know.offender.at.liberty/(number.of.offenses.per.know.offender.at.liberty+number.of.offenses.per.unknown.offender))
new.offenders <- unknown.offenders.at.liberty * percentage.increase.of.new.offenders
unknown.offenders.sent.to.jail <- effective.arrests - known.offenders.sent.to.jail
total.number.of.arrests.after.burglaries.and.robberies <- arrests.after.burglaries + arrests.after.robberies + extra.arrests
net.increase.of.known.offenders.in.PBA <- pmin((aimed.number.of.known.offenders.in.PBA - known.offenders.in.PBA)/PBA.adaptation.time, known.offenders.at.liberty )
those.who.stop.due.to.the.PBA <- (known.offenders.in.PBA *effectiveness.of.the.PBA.to.quit)/ average.time.in.PBA.before.quitting
#métricas de desempeño
#State (stock) variables (d)
dknown.offenders.at.liberty <- known.offenders.released.from.jail - known.offenders.sent.to.jail
dunknown.offenders.at.liberty <- new.offenders - unknown.offenders.sent.to.jail
dDelay1 <- (total.number.of.arrests.after.burglaries.and.robberies - Delay1) / delay.time
dDelay2 <- (Delay1 - Delay2) / delay.time
dDelay3 <- (Delay2 - Delay3) / delay.time
doffenders.in.jail <- unknown.offenders.sent.to.jail + known.offenders.sent.to.jail - known.offenders.released.from.jail - those.who.stop.after.leaving.jail
dknown.offenders.in.PBA <- net.increase.of.known.offenders.in.PBA - those.who.stop.due.to.the.PBA
# AGREGAR LA VARIABLE DE ESTADO, ESO ES LO QUE SE VA A PLOTEAR
list(c(dknown.offenders.at.liberty,
dunknown.offenders.at.liberty,
dDelay1,
dDelay2,
dDelay3,
doffenders.in.jail,
dknown.offenders.in.PBA))
})
}
parameters<-c(
average.time.in.jail = 2, #años
number.of.offenses.per.know.offender.at.liberty = 2.5, #offenses per year
number.of.offenses.per.unknown.offender = 1, # offenses per year
percentage.increase.of.new.offenders = 2/100, # %
average.gain.per.burglary = 600, # euros
chance.of.being.caught.after.a.burglary = 8/100, # %
difficulty.of.a.burglary = 100/100, # 100%
average.gain.per.robbery = 1200, #euros
chance.of.being.caught.after.a.robbery = 33/100,
difficulty.of.a.robbery = 10, # 10 times higher
delay.time = 0.25, # años
percentage.that.stops.after.leaving.jail = 25/100, # %
PBA.adaptation.time= 0.125, #años
pba.aimed = 200, #personas
effectiveness.of.the.PBA.to.quit = 50/100,
average.time.in.PBA.before.quitting = 0.75 # 3/4 de año
)
intg.method<-c("rk4")
out <- ode(y = InitialConditions,
times = times,
func = examen,
parms = parameters,
method =intg.method )
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(tidyr)
out_df <- as.data.frame(out)
out_long <- out_df %>%
select(
time,
known.offenders.at.liberty,
unknown.offenders.at.liberty,
offenders.in.jail,
known.offenders.in.PBA
) %>%
pivot_longer(
cols = c(
known.offenders.at.liberty,
unknown.offenders.at.liberty,
offenders.in.jail,
known.offenders.in.PBA
),
names_to = "Stock",
values_to = "Value"
)
ggplot(out_long, aes(x = time, y = Value)) +
geom_line(color = "green", size = 1.2) +
geom_vline(xintercept = 3, linetype = "dashed", color = "orange") +
facet_wrap(~ Stock, scales = "free_y") +
labs(
title = "Evolution of Offender Stocks with PBA Intervention",
x = "Time (years)",
y = "Value"
) +
theme_minimal(base_size = 15)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Ahora despues de ver los graficos se puede observar evidentemente cómo cambian las conductas de los delincuentes (“offenders”) que ya tienen antecedentes, especialmente en el contexto de esta segunda iteración, donde se consideran las dos intervenciones antes mencionadas.
Cabe señalar que solo los robos a casas (burglaries) presentan un patrón estacional, mientras que los robos a tiendas (robberies) no están sujetos a esta variación estacional.
library(deSolve)
# son de las variables de estado
InitialConditions <- c(
known.offenders.at.liberty = 200, # Known at liberty
unknown.offenders.at.liberty = 750, # Unknown at liberty
Delay1 = 100,
Delay2 = 100,
Delay3 = 100, # cantidad de arrestos efectivos (delay)
offenders.in.jail = 185, # Offenders in jail
known.offenders.in.PBA = 0,
sufficiently.protected.homes = 150000,
Insufficiently.protected.homes = 150000,
SP.stores = 200,
IP.stores = 500
)
#tiempo de simulación
times <- seq(0,#initial time
10,# años
1/12) # mensual
examen <- function(t, state, parameters) {
with(as.list(c(state,parameters)), {
#Endogenous auxiliary variables
known.offenses <- known.offenders.at.liberty * number.of.offenses.per.know.offender.at.liberty
unknown.offenses <- unknown.offenders.at.liberty * number.of.offenses.per.unknown.offender
total.offenses <- known.offenses + unknown.offenses
seasonality.of.these.offenses <- 1 + 0.5 * sin(2 * pi * (t - 0.75)) # creada
# ---- cambio po estacionalidad----
potential.total.crimes <- known.offenses + unknown.offenses
fraction.of.IP.homes <- Insufficiently.protected.homes / (Insufficiently.protected.homes+ sufficiently.protected.homes)
fraction.of.IP.stores <- IP.stores/ (IP.stores + SP.stores)
attractiveness.of.burglary <- (average.gain.per.burglary / (chance.of.being.caught.after.a.burglary *
difficulty.of.a.burglary))* fraction.of.IP.homes
attractiveness.of.robbery <- (average.gain.per.robbery / (chance.of.being.caught.after.a.robbery *
difficulty.of.a.robbery))* fraction.of.IP.stores
relative.attractiveness.of.burglary <- attractiveness.of.burglary / ( attractiveness.of.burglary +
attractiveness.of.robbery)
relative.attractiveness.of.robbery <- attractiveness.of.robbery / (attractiveness.of.burglary + attractiveness.of.robbery)
# La cantidad de burglaries se debe reflejar unicamente para los hogares IP
burglaries <- relative.attractiveness.of.burglary * potential.total.crimes *
seasonality.of.these.offenses * fraction.of.IP.homes
# stores fraction
robberies <- relative.attractiveness.of.robbery * potential.total.crimes * fraction.of.IP.stores
effective.arrests <- Delay3
arrests.after.burglaries <- chance.of.being.caught.after.a.burglary * burglaries
arrests.after.robberies <- chance.of.being.caught.after.a.robbery * robberies
extra.arrests <- ifelse(t >= 3 & t < 4, 100, 0)
###--------------------- INTERVENCIONES --------------
aimed.number.of.known.offenders.in.PBA <- ifelse(t >= 3 & t < 4, pba.aimed, 0)
known.offenses <- (known.offenders.at.liberty) * number.of.offenses.per.know.offender.at.liberty
#Flow variables
those.who.stop.after.leaving.jail <- percentage.that.stops.after.leaving.jail * (offenders.in.jail/average.time.in.jail)
known.offenders.released.from.jail <- (offenders.in.jail/average.time.in.jail) - those.who.stop.after.leaving.jail
known.offenders.sent.to.jail <- effective.arrests *
(number.of.offenses.per.know.offender.at.liberty/(number.of.offenses.per.know.offender.at.liberty+number.of.offenses.per.unknown.offender))
new.offenders <- unknown.offenders.at.liberty * percentage.increase.of.new.offenders
unknown.offenders.sent.to.jail <- effective.arrests - known.offenders.sent.to.jail
total.number.of.arrests.after.burglaries.and.robberies <- arrests.after.burglaries + arrests.after.robberies + extra.arrests
net.increase.of.known.offenders.in.PBA <- pmin((aimed.number.of.known.offenders.in.PBA - known.offenders.in.PBA)/PBA.adaptation.time, known.offenders.at.liberty )
those.who.stop.due.to.the.PBA <- (known.offenders.in.PBA *effectiveness.of.the.PBA.to.quit)/ average.time.in.PBA.before.quitting
protection.against.burglary <- burglaries * percentage.installation.of.protection.after.a.burglary
installation.of.protection.stores <- robberies * percentage.installation.of.protection.after.a.robbery
#State (stock) variables (d)
dknown.offenders.at.liberty <- known.offenders.released.from.jail - known.offenders.sent.to.jail
dunknown.offenders.at.liberty <- new.offenders - unknown.offenders.sent.to.jail
dDelay1 <- (total.number.of.arrests.after.burglaries.and.robberies - Delay1) / delay.time
dDelay2 <- (Delay1 - Delay2) / delay.time
dDelay3 <- (Delay2 - Delay3) / delay.time
doffenders.in.jail <- unknown.offenders.sent.to.jail + known.offenders.sent.to.jail - known.offenders.released.from.jail - those.who.stop.after.leaving.jail
dknown.offenders.in.PBA <- net.increase.of.known.offenders.in.PBA - those.who.stop.due.to.the.PBA
dsufficiently.protected.homes <- + protection.against.burglary
dInsufficiently.protected.homes <- - protection.against.burglary
dSP.stores <- + installation.of.protection.stores
dIP.stores <- - installation.of.protection.stores
# AÑADIMOS LA VARIABLE DE ESTADO, ESO ES LO QUE SE VA A PLOTEAR
list(c(dknown.offenders.at.liberty,
dunknown.offenders.at.liberty,
dDelay1,
dDelay2,
dDelay3,
doffenders.in.jail,
dknown.offenders.in.PBA,
dsufficiently.protected.homes,
dInsufficiently.protected.homes,
dSP.stores,
dIP.stores))
})
}
parameters<-c(
average.time.in.jail = 2, #años
number.of.offenses.per.know.offender.at.liberty = 2.5, #offenses per year
number.of.offenses.per.unknown.offender = 1, # offenses per year
percentage.increase.of.new.offenders = 2/100, # %
average.gain.per.burglary = 600, # euros
chance.of.being.caught.after.a.burglary = 8/100, # %
difficulty.of.a.burglary = 100/100, # 100%
average.gain.per.robbery = 1200, #euros
chance.of.being.caught.after.a.robbery = 33/100,
difficulty.of.a.robbery = 10, # 10 times higher
delay.time = 0.25, # años
percentage.that.stops.after.leaving.jail = 25/100, # %
PBA.adaptation.time= 0.125, #años
pba.aimed = 200, #personas
effectiveness.of.the.PBA.to.quit = 50/100,
average.time.in.PBA.before.quitting = 0.75, # 3/4 de año
percentage.installation.of.protection.after.a.burglary = 50/100,
percentage.installation.of.protection.after.a.robbery = 50/100
)
intg.method<-c("rk4")
out <- ode(y = InitialConditions,
times = times,
func = examen,
parms = parameters,
method =intg.method )
Graficamos y visualizamos el modelo completo, para saber tanto las intervenciones como la segunda iteración
library(RColorBrewer)
out_df <- as.data.frame(out)
out_long <- out_df %>%
select(
time,
known.offenders.at.liberty,
unknown.offenders.at.liberty,
offenders.in.jail,
known.offenders.in.PBA,
sufficiently.protected.homes,
Insufficiently.protected.homes,
SP.stores,
IP.stores
) %>%
pivot_longer(
cols = c(
known.offenders.at.liberty,
unknown.offenders.at.liberty,
offenders.in.jail,
known.offenders.in.PBA,
sufficiently.protected.homes,
Insufficiently.protected.homes,
SP.stores,
IP.stores
),
names_to = "Stock",
values_to = "Value"
)
ggplot(out_long, aes(x = time, y = Value, color = Stock)) +
geom_line( size = 1.2) +
geom_vline(xintercept = 3, linetype = "dashed", color = "green") +
facet_wrap(~ Stock, scales = "free_y") +
scale_color_brewer(palette = "Dark2")+
labs(
title = "Evolution of Offender Stocks within a second interation",
x = "Time (years)",
y = "Value"
) +
theme_minimal(base_size = 15)
difficulty.of.a.burglary = 100/100, # 100% chance.of.being.caught.after.a.burglary = 8/100, # % chance.of.being.caught.after.a.robbery = 33/100 percentage.installation.of.protection.after.a.burglary = 50/100, percentage.installation.of.protection.after.a.robbery = 50/100
x1 <- seq(0.10, 1.10, length.out=10) # difficulty.of.a.burglary
x2 <- seq(0.04, 0.20, length.out=10) # chance.of.being.caught.after.a.burglary
x3 <- seq(0.20, 0.66, length.out=10) # chance.of.being.caught.after.a.robbery
#combine all stressors
Xs <- expand.grid(
difficulty.of.a.burglary = x1,
chance.of.being.caught.after.a.burglary = x2,
chance.of.being.caught.after.a.robbery = x3
)
Xs$Run.ID <- 1:nrow(Xs)
Xs$Run.ID <- 1:nrow(Xs)
#map all Xs into the model
out_all <- list()
Corremos nuestro modelo la cantidad de veces que sea necesaria (es decir, la cantidad de escenarios que se vayan a generar) utilizando un loop o apply
#Establecemos el loop
for (i in 1:nrow(Xs))
{
x <- 4
#Variables exógenas o parámetros
parameters.Xs<- c(average.time.in.jail = 2, #años
number.of.offenses.per.know.offender.at.liberty = 2.5, #offenses per year
number.of.offenses.per.unknown.offender = 1, # offenses per year
percentage.increase.of.new.offenders = 2/100, # %
average.gain.per.burglary = 600, # euros
chance.of.being.caught.after.a.burglary = Xs$chance.of.being.caught.after.a.burglary[i], # %
difficulty.of.a.burglary = Xs$difficulty.of.a.burglary[i], # 100%
average.gain.per.robbery = 1200, #euros
chance.of.being.caught.after.a.robbery = Xs$chance.of.being.caught.after.a.robbery[i],
difficulty.of.a.robbery = 10, # 10 times higher
delay.time = 0.25, # años
percentage.that.stops.after.leaving.jail = 25/100, # %
PBA.adaptation.time= 0.125, #años
pba.aimed = 200, #personas
effectiveness.of.the.PBA.to.quit = 50/100,
average.time.in.PBA.before.quitting = 0.75, # 3/4 de año
percentage.installation.of.protection.after.a.burglary = 50/100,
percentage.installation.of.protection.after.a.robbery = 50/100
)
#Simulación del model
out <- ode(y = InitialConditions,
times = times,
func = examen, #recuerda actualizar el nombre de tu función para cada caso que resulevas
parms = parameters.Xs,
method =intg.method )
# Convertir el objeto out (que es una matriz) a un data frame para facilitar el manejo.
# Esto también permite agregar una nueva columna Run.ID en el siguiente paso.
out <- data.frame(out)
# Agregar una columna Run.ID al data frame out.
# Esto proporciona un identificador único para cada simulación.
out$Run.ID <- Xs$Run.ID[i]
# Agregar el data frame out a la lista out_all.
# out_all es una lista que recopila los resultados de todas las simulaciones.
# La función append() se utiliza para agregar el data frame out a la lista out_all.
out_all <- append(out_all, list(out))
# Imprimir el Run.ID para esta simulación particular.
# Esto podría ser útil para el seguimiento del progreso de la simulación, especialmente si hay muchas iteraciones.
print(Xs$Run.ID[i])
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
## [1] 11
## [1] 12
## [1] 13
## [1] 14
## [1] 15
## [1] 16
## [1] 17
## [1] 18
## [1] 19
## [1] 20
## [1] 21
## [1] 22
## [1] 23
## [1] 24
## [1] 25
## [1] 26
## [1] 27
## [1] 28
## [1] 29
## [1] 30
## [1] 31
## [1] 32
## [1] 33
## [1] 34
## [1] 35
## [1] 36
## [1] 37
## [1] 38
## [1] 39
## [1] 40
## [1] 41
## [1] 42
## [1] 43
## [1] 44
## [1] 45
## [1] 46
## [1] 47
## [1] 48
## [1] 49
## [1] 50
## [1] 51
## [1] 52
## [1] 53
## [1] 54
## [1] 55
## [1] 56
## [1] 57
## [1] 58
## [1] 59
## [1] 60
## [1] 61
## [1] 62
## [1] 63
## [1] 64
## [1] 65
## [1] 66
## [1] 67
## [1] 68
## [1] 69
## [1] 70
## [1] 71
## [1] 72
## [1] 73
## [1] 74
## [1] 75
## [1] 76
## [1] 77
## [1] 78
## [1] 79
## [1] 80
## [1] 81
## [1] 82
## [1] 83
## [1] 84
## [1] 85
## [1] 86
## [1] 87
## [1] 88
## [1] 89
## [1] 90
## [1] 91
## [1] 92
## [1] 93
## [1] 94
## [1] 95
## [1] 96
## [1] 97
## [1] 98
## [1] 99
## [1] 100
## [1] 101
## [1] 102
## [1] 103
## [1] 104
## [1] 105
## [1] 106
## [1] 107
## [1] 108
## [1] 109
## [1] 110
## [1] 111
## [1] 112
## [1] 113
## [1] 114
## [1] 115
## [1] 116
## [1] 117
## [1] 118
## [1] 119
## [1] 120
## [1] 121
## [1] 122
## [1] 123
## [1] 124
## [1] 125
## [1] 126
## [1] 127
## [1] 128
## [1] 129
## [1] 130
## [1] 131
## [1] 132
## [1] 133
## [1] 134
## [1] 135
## [1] 136
## [1] 137
## [1] 138
## [1] 139
## [1] 140
## [1] 141
## [1] 142
## [1] 143
## [1] 144
## [1] 145
## [1] 146
## [1] 147
## [1] 148
## [1] 149
## [1] 150
## [1] 151
## [1] 152
## [1] 153
## [1] 154
## [1] 155
## [1] 156
## [1] 157
## [1] 158
## [1] 159
## [1] 160
## [1] 161
## [1] 162
## [1] 163
## [1] 164
## [1] 165
## [1] 166
## [1] 167
## [1] 168
## [1] 169
## [1] 170
## [1] 171
## [1] 172
## [1] 173
## [1] 174
## [1] 175
## [1] 176
## [1] 177
## [1] 178
## [1] 179
## [1] 180
## [1] 181
## [1] 182
## [1] 183
## [1] 184
## [1] 185
## [1] 186
## [1] 187
## [1] 188
## [1] 189
## [1] 190
## [1] 191
## [1] 192
## [1] 193
## [1] 194
## [1] 195
## [1] 196
## [1] 197
## [1] 198
## [1] 199
## [1] 200
## [1] 201
## [1] 202
## [1] 203
## [1] 204
## [1] 205
## [1] 206
## [1] 207
## [1] 208
## [1] 209
## [1] 210
## [1] 211
## [1] 212
## [1] 213
## [1] 214
## [1] 215
## [1] 216
## [1] 217
## [1] 218
## [1] 219
## [1] 220
## [1] 221
## [1] 222
## [1] 223
## [1] 224
## [1] 225
## [1] 226
## [1] 227
## [1] 228
## [1] 229
## [1] 230
## [1] 231
## [1] 232
## [1] 233
## [1] 234
## [1] 235
## [1] 236
## [1] 237
## [1] 238
## [1] 239
## [1] 240
## [1] 241
## [1] 242
## [1] 243
## [1] 244
## [1] 245
## [1] 246
## [1] 247
## [1] 248
## [1] 249
## [1] 250
## [1] 251
## [1] 252
## [1] 253
## [1] 254
## [1] 255
## [1] 256
## [1] 257
## [1] 258
## [1] 259
## [1] 260
## [1] 261
## [1] 262
## [1] 263
## [1] 264
## [1] 265
## [1] 266
## [1] 267
## [1] 268
## [1] 269
## [1] 270
## [1] 271
## [1] 272
## [1] 273
## [1] 274
## [1] 275
## [1] 276
## [1] 277
## [1] 278
## [1] 279
## [1] 280
## [1] 281
## [1] 282
## [1] 283
## [1] 284
## [1] 285
## [1] 286
## [1] 287
## [1] 288
## [1] 289
## [1] 290
## [1] 291
## [1] 292
## [1] 293
## [1] 294
## [1] 295
## [1] 296
## [1] 297
## [1] 298
## [1] 299
## [1] 300
## [1] 301
## [1] 302
## [1] 303
## [1] 304
## [1] 305
## [1] 306
## [1] 307
## [1] 308
## [1] 309
## [1] 310
## [1] 311
## [1] 312
## [1] 313
## [1] 314
## [1] 315
## [1] 316
## [1] 317
## [1] 318
## [1] 319
## [1] 320
## [1] 321
## [1] 322
## [1] 323
## [1] 324
## [1] 325
## [1] 326
## [1] 327
## [1] 328
## [1] 329
## [1] 330
## [1] 331
## [1] 332
## [1] 333
## [1] 334
## [1] 335
## [1] 336
## [1] 337
## [1] 338
## [1] 339
## [1] 340
## [1] 341
## [1] 342
## [1] 343
## [1] 344
## [1] 345
## [1] 346
## [1] 347
## [1] 348
## [1] 349
## [1] 350
## [1] 351
## [1] 352
## [1] 353
## [1] 354
## [1] 355
## [1] 356
## [1] 357
## [1] 358
## [1] 359
## [1] 360
## [1] 361
## [1] 362
## [1] 363
## [1] 364
## [1] 365
## [1] 366
## [1] 367
## [1] 368
## [1] 369
## [1] 370
## [1] 371
## [1] 372
## [1] 373
## [1] 374
## [1] 375
## [1] 376
## [1] 377
## [1] 378
## [1] 379
## [1] 380
## [1] 381
## [1] 382
## [1] 383
## [1] 384
## [1] 385
## [1] 386
## [1] 387
## [1] 388
## [1] 389
## [1] 390
## [1] 391
## [1] 392
## [1] 393
## [1] 394
## [1] 395
## [1] 396
## [1] 397
## [1] 398
## [1] 399
## [1] 400
## [1] 401
## [1] 402
## [1] 403
## [1] 404
## [1] 405
## [1] 406
## [1] 407
## [1] 408
## [1] 409
## [1] 410
## [1] 411
## [1] 412
## [1] 413
## [1] 414
## [1] 415
## [1] 416
## [1] 417
## [1] 418
## [1] 419
## [1] 420
## [1] 421
## [1] 422
## [1] 423
## [1] 424
## [1] 425
## [1] 426
## [1] 427
## [1] 428
## [1] 429
## [1] 430
## [1] 431
## [1] 432
## [1] 433
## [1] 434
## [1] 435
## [1] 436
## [1] 437
## [1] 438
## [1] 439
## [1] 440
## [1] 441
## [1] 442
## [1] 443
## [1] 444
## [1] 445
## [1] 446
## [1] 447
## [1] 448
## [1] 449
## [1] 450
## [1] 451
## [1] 452
## [1] 453
## [1] 454
## [1] 455
## [1] 456
## [1] 457
## [1] 458
## [1] 459
## [1] 460
## [1] 461
## [1] 462
## [1] 463
## [1] 464
## [1] 465
## [1] 466
## [1] 467
## [1] 468
## [1] 469
## [1] 470
## [1] 471
## [1] 472
## [1] 473
## [1] 474
## [1] 475
## [1] 476
## [1] 477
## [1] 478
## [1] 479
## [1] 480
## [1] 481
## [1] 482
## [1] 483
## [1] 484
## [1] 485
## [1] 486
## [1] 487
## [1] 488
## [1] 489
## [1] 490
## [1] 491
## [1] 492
## [1] 493
## [1] 494
## [1] 495
## [1] 496
## [1] 497
## [1] 498
## [1] 499
## [1] 500
## [1] 501
## [1] 502
## [1] 503
## [1] 504
## [1] 505
## [1] 506
## [1] 507
## [1] 508
## [1] 509
## [1] 510
## [1] 511
## [1] 512
## [1] 513
## [1] 514
## [1] 515
## [1] 516
## [1] 517
## [1] 518
## [1] 519
## [1] 520
## [1] 521
## [1] 522
## [1] 523
## [1] 524
## [1] 525
## [1] 526
## [1] 527
## [1] 528
## [1] 529
## [1] 530
## [1] 531
## [1] 532
## [1] 533
## [1] 534
## [1] 535
## [1] 536
## [1] 537
## [1] 538
## [1] 539
## [1] 540
## [1] 541
## [1] 542
## [1] 543
## [1] 544
## [1] 545
## [1] 546
## [1] 547
## [1] 548
## [1] 549
## [1] 550
## [1] 551
## [1] 552
## [1] 553
## [1] 554
## [1] 555
## [1] 556
## [1] 557
## [1] 558
## [1] 559
## [1] 560
## [1] 561
## [1] 562
## [1] 563
## [1] 564
## [1] 565
## [1] 566
## [1] 567
## [1] 568
## [1] 569
## [1] 570
## [1] 571
## [1] 572
## [1] 573
## [1] 574
## [1] 575
## [1] 576
## [1] 577
## [1] 578
## [1] 579
## [1] 580
## [1] 581
## [1] 582
## [1] 583
## [1] 584
## [1] 585
## [1] 586
## [1] 587
## [1] 588
## [1] 589
## [1] 590
## [1] 591
## [1] 592
## [1] 593
## [1] 594
## [1] 595
## [1] 596
## [1] 597
## [1] 598
## [1] 599
## [1] 600
## [1] 601
## [1] 602
## [1] 603
## [1] 604
## [1] 605
## [1] 606
## [1] 607
## [1] 608
## [1] 609
## [1] 610
## [1] 611
## [1] 612
## [1] 613
## [1] 614
## [1] 615
## [1] 616
## [1] 617
## [1] 618
## [1] 619
## [1] 620
## [1] 621
## [1] 622
## [1] 623
## [1] 624
## [1] 625
## [1] 626
## [1] 627
## [1] 628
## [1] 629
## [1] 630
## [1] 631
## [1] 632
## [1] 633
## [1] 634
## [1] 635
## [1] 636
## [1] 637
## [1] 638
## [1] 639
## [1] 640
## [1] 641
## [1] 642
## [1] 643
## [1] 644
## [1] 645
## [1] 646
## [1] 647
## [1] 648
## [1] 649
## [1] 650
## [1] 651
## [1] 652
## [1] 653
## [1] 654
## [1] 655
## [1] 656
## [1] 657
## [1] 658
## [1] 659
## [1] 660
## [1] 661
## [1] 662
## [1] 663
## [1] 664
## [1] 665
## [1] 666
## [1] 667
## [1] 668
## [1] 669
## [1] 670
## [1] 671
## [1] 672
## [1] 673
## [1] 674
## [1] 675
## [1] 676
## [1] 677
## [1] 678
## [1] 679
## [1] 680
## [1] 681
## [1] 682
## [1] 683
## [1] 684
## [1] 685
## [1] 686
## [1] 687
## [1] 688
## [1] 689
## [1] 690
## [1] 691
## [1] 692
## [1] 693
## [1] 694
## [1] 695
## [1] 696
## [1] 697
## [1] 698
## [1] 699
## [1] 700
## [1] 701
## [1] 702
## [1] 703
## [1] 704
## [1] 705
## [1] 706
## [1] 707
## [1] 708
## [1] 709
## [1] 710
## [1] 711
## [1] 712
## [1] 713
## [1] 714
## [1] 715
## [1] 716
## [1] 717
## [1] 718
## [1] 719
## [1] 720
## [1] 721
## [1] 722
## [1] 723
## [1] 724
## [1] 725
## [1] 726
## [1] 727
## [1] 728
## [1] 729
## [1] 730
## [1] 731
## [1] 732
## [1] 733
## [1] 734
## [1] 735
## [1] 736
## [1] 737
## [1] 738
## [1] 739
## [1] 740
## [1] 741
## [1] 742
## [1] 743
## [1] 744
## [1] 745
## [1] 746
## [1] 747
## [1] 748
## [1] 749
## [1] 750
## [1] 751
## [1] 752
## [1] 753
## [1] 754
## [1] 755
## [1] 756
## [1] 757
## [1] 758
## [1] 759
## [1] 760
## [1] 761
## [1] 762
## [1] 763
## [1] 764
## [1] 765
## [1] 766
## [1] 767
## [1] 768
## [1] 769
## [1] 770
## [1] 771
## [1] 772
## [1] 773
## [1] 774
## [1] 775
## [1] 776
## [1] 777
## [1] 778
## [1] 779
## [1] 780
## [1] 781
## [1] 782
## [1] 783
## [1] 784
## [1] 785
## [1] 786
## [1] 787
## [1] 788
## [1] 789
## [1] 790
## [1] 791
## [1] 792
## [1] 793
## [1] 794
## [1] 795
## [1] 796
## [1] 797
## [1] 798
## [1] 799
## [1] 800
## [1] 801
## [1] 802
## [1] 803
## [1] 804
## [1] 805
## [1] 806
## [1] 807
## [1] 808
## [1] 809
## [1] 810
## [1] 811
## [1] 812
## [1] 813
## [1] 814
## [1] 815
## [1] 816
## [1] 817
## [1] 818
## [1] 819
## [1] 820
## [1] 821
## [1] 822
## [1] 823
## [1] 824
## [1] 825
## [1] 826
## [1] 827
## [1] 828
## [1] 829
## [1] 830
## [1] 831
## [1] 832
## [1] 833
## [1] 834
## [1] 835
## [1] 836
## [1] 837
## [1] 838
## [1] 839
## [1] 840
## [1] 841
## [1] 842
## [1] 843
## [1] 844
## [1] 845
## [1] 846
## [1] 847
## [1] 848
## [1] 849
## [1] 850
## [1] 851
## [1] 852
## [1] 853
## [1] 854
## [1] 855
## [1] 856
## [1] 857
## [1] 858
## [1] 859
## [1] 860
## [1] 861
## [1] 862
## [1] 863
## [1] 864
## [1] 865
## [1] 866
## [1] 867
## [1] 868
## [1] 869
## [1] 870
## [1] 871
## [1] 872
## [1] 873
## [1] 874
## [1] 875
## [1] 876
## [1] 877
## [1] 878
## [1] 879
## [1] 880
## [1] 881
## [1] 882
## [1] 883
## [1] 884
## [1] 885
## [1] 886
## [1] 887
## [1] 888
## [1] 889
## [1] 890
## [1] 891
## [1] 892
## [1] 893
## [1] 894
## [1] 895
## [1] 896
## [1] 897
## [1] 898
## [1] 899
## [1] 900
## [1] 901
## [1] 902
## [1] 903
## [1] 904
## [1] 905
## [1] 906
## [1] 907
## [1] 908
## [1] 909
## [1] 910
## [1] 911
## [1] 912
## [1] 913
## [1] 914
## [1] 915
## [1] 916
## [1] 917
## [1] 918
## [1] 919
## [1] 920
## [1] 921
## [1] 922
## [1] 923
## [1] 924
## [1] 925
## [1] 926
## [1] 927
## [1] 928
## [1] 929
## [1] 930
## [1] 931
## [1] 932
## [1] 933
## [1] 934
## [1] 935
## [1] 936
## [1] 937
## [1] 938
## [1] 939
## [1] 940
## [1] 941
## [1] 942
## [1] 943
## [1] 944
## [1] 945
## [1] 946
## [1] 947
## [1] 948
## [1] 949
## [1] 950
## [1] 951
## [1] 952
## [1] 953
## [1] 954
## [1] 955
## [1] 956
## [1] 957
## [1] 958
## [1] 959
## [1] 960
## [1] 961
## [1] 962
## [1] 963
## [1] 964
## [1] 965
## [1] 966
## [1] 967
## [1] 968
## [1] 969
## [1] 970
## [1] 971
## [1] 972
## [1] 973
## [1] 974
## [1] 975
## [1] 976
## [1] 977
## [1] 978
## [1] 979
## [1] 980
## [1] 981
## [1] 982
## [1] 983
## [1] 984
## [1] 985
## [1] 986
## [1] 987
## [1] 988
## [1] 989
## [1] 990
## [1] 991
## [1] 992
## [1] 993
## [1] 994
## [1] 995
## [1] 996
## [1] 997
## [1] 998
## [1] 999
## [1] 1000
# Concatenar resultados
# La función do.call() ejecuta una función (en este caso "rbind") en una lista de argumentos (en este caso out_all).
# "rbind" es una función que combina data frames por filas.
# Al utilizar do.call con "rbind", se están combinando todos los data frames en la lista out_all en un solo data frame.
out_all <- do.call("rbind", out_all)
# La función dim() devuelve las dimensiones del objeto, mostrando el número de filas y columnas del data frame out_all.
# Esto puede ser útil para verificar que todos los data frames se hayan combinado correctamente.
dim(out_all)
## [1] 121000 13
# Combinar out_all y Xs
# La función merge() combina dos data frames en uno, basándose en una o más columnas en común.
# En este caso, se están combinando los data frames out_all y Xs basándose en la columna "Run.ID".
# Esto agregará las columnas de Xs al data frame out_all, alineando las filas basadas en los valores de "Run.ID".
out_all <- merge(out_all, Xs, by="Run.ID")
# Nuevamente, se utiliza dim() para mostrar las dimensiones del objeto resultante.
# Esto puede ser útil para verificar que la fusión se haya realizado correctamente y para entender cómo ha cambiado
# el tamaño del data frame como resultado de la fusión.
dim(out_all)
## [1] 121000 16
#Plot
ggplot(out_all,aes(x=time,y=known.offenders.at.liberty,group=Run.ID, colour=difficulty.of.a.burglary))+
geom_line()+
scale_color_gradient(low = "green", high = "red")
#Varios plots
# Crea una gráfica para cada variable de interés
p1<- ggplot(out_all,aes(x=time,y=known.offenders.at.liberty,group=Run.ID, colour=difficulty.of.a.burglary))+
geom_line()+
scale_color_gradient(low = "green", high = "red")
p2<- ggplot(out_all,aes(x=time,y=known.offenders.at.liberty,group=Run.ID, colour= chance.of.being.caught.after.a.burglary))+
geom_line()+
scale_color_gradient(low = "orange", high = "pink")
p3<- ggplot(out_all,aes(x=time,y=known.offenders.at.liberty,group=Run.ID, colour= chance.of.being.caught.after.a.robbery))+
geom_line()+
scale_color_gradient(low = "purple", high = "orange")
# Ahora puedes ver las gráficas individualmente
p1
p2
p3
# Para ver las gráficas juntas, se puede usar gridExtra
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
grid.arrange(p1, p2, p3, ncol = 1)
variable de estado = known.offenders.at.liberty (time) parametro = difficulty.of.a.burglary (colour) A medida que la dificultad para cometer un robo (difficulty.of.a.burglary) aumenta (de naranja a rosa en la gráfica), la cantidad de delincuentes conocidos en libertad tiende a disminuir con el tiempo. Esto sucede porque, cuando los robos son más difíciles de llevar a cabo, menos delincuentes logran delinquir exitosamente y mantenerse activos sin ser capturados. Al inicio, los delincuentes en libertad aumentan debido a la inercia inicial de la criminalidad, pero cuando la dificultad crece, esa “barrera” frena el ritmo de crecimiento e incluso revierte la tendencia, haciendo que la población de delincuentes activos se mantenga o disminuya. En resumen, cuanto más difícil es cometer un robo, menor es el número de delincuentes que logra mantenerse en libertad, moderando y estabilizando el sistema.
1.- La variable de estado depende directamente de la dificultad del delito. 2.- Colores verdes indican facilidad y llevan a más delincuentes en libertad. 3.- Colores rojos indican dificultad y llevan a menos delincuentes en libertad. 4.- La evolución temporal con ondas sugiere un equilibrio dinámico que responde continuamente a la dificultad (o facilidad) de cometer robos.
variable de estado = known.offenders.at.liberty (time) parametro = chance.of.being.caught.after.a.burglary (colour) A medida que la probabilidad de ser capturado después de un robo (chance.of.being.caught.after.a.burglary) aumenta, el número de delincuentes conocidos en libertad disminuye progresivamente. Esto se debe a que, si la captura de los delincuentes después de cometer un robo es más probable, las fuerzas del orden logran detener a más delincuentes activos, reduciendo el grupo de delincuentes en libertad. La gráfica muestra cómo, en escenarios con una alta chance de captura, la curva de delincuentes en libertad se aplana o disminuye más rápidamente que en escenarios con una baja chance de captura. Así, el sistema tiende a estabilizarse en niveles más bajos de delincuentes en libertad conforme la probabilidad de captura crece.
variable de estado = known.offenders.at.liberty (time) parametro = chance.of.being.caught.after.a.robbery (colour) El parámetro chance.of.being.caught.after.a.robbery (probabilidad de ser atrapado después de un robo) tiene un efecto inversamente proporcional en la variable de estado known.offenders.at.liberty (delincuentes conocidos en libertad). A medida que aumenta esta probabilidad (colores más cálidos, del morado al naranja), el número de delincuentes conocidos en libertad tiende a disminuir. Esto sucede porque un mayor riesgo de ser atrapado desincentiva los robos o provoca arrestos más rápidos y frecuentes, reduciendo la cantidad de delincuentes conocidos que permanecen en libertad.
#Varios plots
# Crea una gráfica para cada variable de interés
p1<- ggplot(out_all,aes(x=time,y=unknown.offenders.at.liberty,group=Run.ID, colour=difficulty.of.a.burglary))+
geom_line()+
scale_color_gradient(low = "orange", high = "pink")
p2<- ggplot(out_all,aes(x=time,y=unknown.offenders.at.liberty,group=Run.ID, colour= chance.of.being.caught.after.a.burglary))+
geom_line()+
scale_color_gradient(low = "green", high = "red")
p3<- ggplot(out_all,aes(x=time,y=unknown.offenders.at.liberty,group=Run.ID, colour= chance.of.being.caught.after.a.robbery))+
geom_line()+
scale_color_gradient(low = "purple", high = "orange")
# Ahora puedes ver las gráficas individualmente
p1
p2
p3
# Para ver las gráficas juntas, se puede usar gridExtra
library(gridExtra)
grid.arrange(p1, p2, p3, ncol = 1)
variable de estado = unknown.offenders.at.liberty (time) parametro = difficulty.of.a.burglary (colour)
El parámetro “difficulty of a burglary” representa qué tan difícil es cometer un robo (burglary). A medida que aumenta la dificultad (color naranja más intenso en el gráfico), la posibilidad de que los delincuentes tengan éxito disminuye. Como resultado, el número de delincuentes desconocidos en libertad también disminuye: hay menos robos exitosos y, por lo tanto, menos delincuentes que permanecen en libertad sin ser identificados. Por el contrario, cuando la dificultad de cometer un robo es baja (color naranja más claro), los delincuentes tienen más éxito en llevar a cabo los delitos, lo que provoca que el número de delincuentes desconocidos en libertad aumente. En el gráfico, esto se refleja en una banda más ancha en las zonas de baja dificultad y más estrecha en las zonas de alta dificultad. En resumen, a mayor dificultad de un robo, menor cantidad de delincuentes libres. A menor dificultad, más delincuentes logran cometer delitos y permanecen en libertad.
variable de estado = unknown.offenders.at.liberty (time) parametro = chance.of.being.caught.after.a.burglary (colour)
Este parámetro indica la probabilidad de que un delincuente sea capturado después de haber cometido un robo. Cuando la probabilidad de captura es alta (color verde en el gráfico), los delincuentes son identificados y arrestados más rápidamente. Como consecuencia, el número de delincuentes desconocidos en libertad disminuye de forma más acelerada. Por el contrario, cuando la probabilidad de captura es baja (color rojo), los delincuentes permanecen más tiempo en libertad, ya que son menos propensos a ser atrapados. Esto provoca que la banda que representa a los “unknown offenders at liberty” sea más ancha y permanezca más tiempo alta en el eje vertical. El gráfico ilustra que a mayor probabilidad de ser atrapado después de un robo, el número de delincuentes desconocidos en libertad se reduce más rápidamente.
variable de estado = unknown.offenders.at.liberty (time) parametro = chance.of.being.caught.after.a.robbery (colour)
Este parámetro mide la probabilidad de ser capturado después de cometer un asalto (robbery). Cuando esta probabilidad es alta (color naranja intenso), los delincuentes son rápidamente arrestados, lo que reduce significativamente la cantidad de “unknown offenders at liberty”. En el gráfico, esto se muestra con bandas que disminuyen más rápido y son más estrechas. Por el contrario, cuando la probabilidad de captura es baja (color amarillo más claro), los delincuentes no son atrapados con facilidad y, por lo tanto, permanecen más tiempo en libertad. Esto se traduce en bandas más anchas y persistentes en el tiempo. En resumen, un mayor riesgo de ser capturado tras un asalto contribuye a que disminuya el número de delincuentes desconocidos en libertad. Una menor probabilidad de captura permite que la cantidad de delincuentes libres aumente o disminuya más lentamente.
#Varios plots
# Crea una gráfica para cada variable de interés
p1<- ggplot(out_all,aes(x=time,y=offenders.in.jail,group=Run.ID, colour=difficulty.of.a.burglary))+
geom_line()+
scale_color_gradient(low = "orange", high = "green")
p2<- ggplot(out_all,aes(x=time,y=offenders.in.jail,group=Run.ID, colour= chance.of.being.caught.after.a.burglary))+
geom_line()+
scale_color_gradient(low = "pink", high = "red")
p3<- ggplot(out_all,aes(x=time,y=offenders.in.jail,group=Run.ID, colour= chance.of.being.caught.after.a.robbery))+
geom_line()+
scale_color_gradient(low = "purple", high = "orange")
# Ahora puedes ver las gráficas individualmente
p1
p2
p3
# Para ver las gráficas juntas, se puede usar gridExtra
library(gridExtra)
grid.arrange(p1, p2, p3, ncol = 1)
variable de estado = offenders.in.jail (time) parametro = difficulty.of.a.burglary (colour)
El parámetro “difficulty of a burglary” muestra qué tan difícil es cometer un robo. Cuando la dificultad es alta (color verde intenso en el gráfico), los robos tienen menos éxito. Por lo tanto, menos delincuentes son arrestados y encarcelados, lo que genera una cantidad menor de “offenders in jail”. Se observa en el gráfico que las curvas verdes son más delgadas y no suben tanto. Por el contrario, cuando la dificultad de un robo es baja (color amarillo o verde claro), más robos son exitosos y, por ende, más delincuentes son arrestados y enviados a la cárcel. Esto provoca que la cantidad de “offenders in jail” aumente y las curvas sean más gruesas y altas. En resumen, a mayor dificultad de un robo, menos delincuentes en la cárcel; a menor dificultad, más delincuentes encarcelados.
variable de estado = offenders.in.jail (time) parametro = chance.of.being.caught.after.a.burglary (colour)
El parámetro indica la probabilidad de que un delincuente sea capturado después de cometer un robo. Cuando esta probabilidad es alta (color rojo más intenso), más delincuentes son arrestados y terminan en la cárcel. Esto se refleja en el gráfico en bandas rojas más anchas y con mayor altura a lo largo del tiempo. En cambio, cuando la probabilidad de ser atrapado es baja (color rosa claro), menos delincuentes son encarcelados, y la curva correspondiente es más delgada y baja. Así, a mayor probabilidad de ser atrapado tras un robo, aumenta el número de delincuentes en la cárcel; a menor probabilidad, disminuye la cantidad de delincuentes encarcelados.
variable de estado = offenders.in.jail (time) parametro = chance.of.being.caught.after.a.robbery (colour)
Este parámetro refleja la probabilidad de ser atrapado después de un asalto (robbery). Cuando la probabilidad es alta (color amarillo intenso), más delincuentes involucrados en asaltos son arrestados y encarcelados. El gráfico muestra cómo las curvas amarillas crecen y son más gruesas, indicando un aumento en la cantidad de “offenders in jail”. Por otro lado, cuando la probabilidad de ser atrapado es baja (color amarillo más claro o púrpura), menos delincuentes terminan en la cárcel, y las curvas son más bajas y delgadas. En resumen, una mayor probabilidad de ser atrapado después de un asalto incrementa el número de delincuentes en la cárcel, mientras que una menor probabilidad lo reduce.
#Varios plots
# Crea una gráfica para cada variable de interés
p1<- ggplot(out_all,aes(x=time,y=known.offenders.in.PBA,group=Run.ID, colour=difficulty.of.a.burglary))+
geom_line()+
scale_color_gradient(low = "red", high = "green")
p2<- ggplot(out_all,aes(x=time,y=known.offenders.in.PBA,group=Run.ID, colour= chance.of.being.caught.after.a.burglary))+
geom_line()+
scale_color_gradient(low = "blue", high = "red")
p3<- ggplot(out_all,aes(x=time,y=known.offenders.in.PBA,group=Run.ID, colour= chance.of.being.caught.after.a.robbery))+
geom_line()+
scale_color_gradient(low = "green", high = "orange")
# Ahora puedes ver las gráficas individualmente
p1
p2
p3
# Para ver las gráficas juntas, se puede usar gridExtra
library(gridExtra)
grid.arrange(p1, p2, p3, ncol = 1)
variable de estado = known.offenders.in.PBA (time) parametro = difficulty.of.a.burglary (colour)
Este gráfico muestra cómo varía la cantidad de ofensores conocidos en el área PBA en función de la dificultad para cometer un robo en una vivienda (difficulty.of.a.burglary). Los colores representan diferentes niveles de dificultad, donde el rojo indica una baja dificultad (es decir, es fácil cometer el delito) y el verde una alta dificultad (más difícil cometer el delito). Se observa que cuando la dificultad es baja, hay un incremento notable en el número de ofensores conocidos, alcanzando un pico significativo. A medida que la dificultad aumenta, la cantidad de ofensores disminuye drásticamente. Esto sugiere que, cuando es más difícil cometer robos, la actividad delictiva disminuye y, por tanto, hay menos ofensores conocidos en la zona. En resumen, un incremento en la dificultad para delinquir tiene un efecto disuasivo claro sobre la delincuencia.
variable de estado = known.offenders.in.PBA (time) parametro = chance.of.being.caught.after.a.burglary (colour)
En este segundo gráfico se analiza cómo afecta la probabilidad de ser atrapado después de cometer un robo en una vivienda (chance.of.being.caught.after.a.burglary) sobre la cantidad de ofensores conocidos en PBA. Los colores van del azul (baja probabilidad de ser capturado) al rojo (alta probabilidad de ser capturado). Se puede ver que cuando la probabilidad de ser capturado es baja, el número de ofensores conocidos aumenta considerablemente, alcanzando valores altos. Sin embargo, cuando esta probabilidad incrementa, el número de ofensores disminuye de forma notoria. Esta relación inversa indica que una mayor probabilidad de ser atrapado funciona como un factor de disuasión, disminuyendo la actividad delictiva y, por lo tanto, la cantidad de individuos registrados como ofensores.
variable de estado = known.offenders.in.PBA (time) parametro = chance.of.being.caught.after.a.robbery (colour)
El tercer gráfico representa el impacto de la probabilidad de ser atrapado después de cometer un asalto (chance.of.being.caught.after.a.robbery) sobre los ofensores conocidos en PBA. En este caso, los colores varían desde el verde (baja probabilidad de arresto) hasta el amarillo/naranja (alta probabilidad de arresto). Se observa un patrón similar al gráfico anterior: cuando la probabilidad de arresto es baja, el número de ofensores se incrementa de manera considerable. En cambio, cuando la probabilidad de arresto es mayor, la cantidad de ofensores disminuye rápidamente. Esto refuerza la idea de que un entorno con mayor riesgo de arresto desalienta la comisión de delitos, reduciendo la presencia de ofensores en el sistema.
#Varios plots
# Crea una gráfica para cada variable de interés
p1<- ggplot(out_all,aes(x=time,y=sufficiently.protected.homes,group=Run.ID, colour=difficulty.of.a.burglary))+
geom_line()+
scale_color_gradient(low = "green", high = "red")
p2<- ggplot(out_all,aes(x=time,y=sufficiently.protected.homes,group=Run.ID, colour= chance.of.being.caught.after.a.burglary))+
geom_line()+
scale_color_gradient(low = "red", high = "blue")
p3<- ggplot(out_all,aes(x=time,y=sufficiently.protected.homes,group=Run.ID, colour= chance.of.being.caught.after.a.robbery))+
geom_line()+
scale_color_gradient(low = "orange", high = "green")
# Ahora puedes ver las gráficas individualmente
p1
p2
p3
# Para ver las gráficas juntas, se puede usar gridExtra
library(gridExtra)
grid.arrange(p1, p2, p3, ncol = 1)
variable de estado = sufficiently.protected.homes (time) parametro = difficulty.of.a.burglary (colour)
Este gráfico analiza cómo influye la dificultad para cometer un robo (difficulty.of.a.burglary) en la cantidad de hogares suficientemente protegidos. A medida que aumenta la dificultad del delito (pasando de colores rojos a verdes), se observa un incremento en el número de hogares considerados suficientemente protegidos. Es decir, cuando es más difícil robar, la población u hogares logran mantener un nivel de protección más alto frente a los delincuentes. Por el contrario, cuando la dificultad es baja, la cantidad de hogares protegidos es mucho menor, lo cual puede interpretarse como un mayor éxito de los ofensores en vulnerar la seguridad residencial. En resumen, incrementar la dificultad de robo contribuye directamente a que más hogares estén protegidos.
variable de estado = sufficiently.protected.homes (time) parametro = chance.of.being.caught.after.a.burglary (colour)
Este gráfico muestra el impacto de la probabilidad de ser atrapado después de un robo en una vivienda (chance.of.being.caught.after.a.burglary) sobre la cantidad de hogares suficientemente protegidos. Aquí, cuando la probabilidad de ser capturado es baja (colores azules), el número de hogares protegidos es más bajo. A medida que la probabilidad de arresto aumenta (colores que se acercan al rojo), también lo hace la cantidad de hogares protegidos. Esto indica que un entorno en el que es más probable que los delincuentes sean atrapados desincentiva los robos, lo cual genera un efecto indirecto positivo sobre la seguridad del entorno residencial. En otras palabras, un mayor riesgo de castigo eleva la protección general de los hogares.
variable de estado = sufficiently.protected.homes (time) parametro = chance.of.being.caught.after.a.robbery (colour)
En este tercer gráfico se observa cómo la probabilidad de ser atrapado después de cometer un asalto (chance.of.being.caught.after.a.robbery) afecta la cantidad de hogares suficientemente protegidos. El comportamiento es similar a los gráficos anteriores: cuando la probabilidad de arresto es baja (colores verdes), la cantidad de hogares protegidos es menor. A medida que la probabilidad de arresto aumenta (colores más cálidos como el amarillo y el naranja), también lo hace el número de hogares suficientemente protegidos. Este patrón sugiere que aumentar el riesgo de ser atrapado, incluso en delitos distintos como el asalto, tiene un efecto positivo en la seguridad de los hogares, probablemente porque disuade a los ofensores de actuar en general.
#Varios plots
# Crea una gráfica para cada variable de interés
p1<- ggplot(out_all,aes(x=time,y=Insufficiently.protected.homes,group=Run.ID, colour=difficulty.of.a.burglary))+
geom_line()+
scale_color_gradient(low = "red", high = "green")
p2<- ggplot(out_all,aes(x=time,y=Insufficiently.protected.homes,group=Run.ID, colour= chance.of.being.caught.after.a.burglary))+
geom_line()+
scale_color_gradient(low = "orange", high = "blue")
p3<- ggplot(out_all,aes(x=time,y=Insufficiently.protected.homes,group=Run.ID, colour= chance.of.being.caught.after.a.robbery))+
geom_line()+
scale_color_gradient(low = "blue", high = "green")
# Ahora puedes ver las gráficas individualmente
p1
p2
p3
# Para ver las gráficas juntas, se puede usar gridExtra
library(gridExtra)
grid.arrange(p1, p2, p3, ncol = 1)
variable de estado = Insufficiently.protected.homes (time) parametro = difficulty.of.a.burglary (colour)
En este gráfico se analiza cómo cambia la cantidad de hogares insuficientemente protegidos en función de la dificultad para cometer un robo (difficulty.of.a.burglary). A medida que la dificultad es baja (colores rojos), el número de hogares insuficientemente protegidos aumenta más rápidamente. En cambio, cuando la dificultad es alta (colores verdes), esta cantidad disminuye de forma más lenta. Esto indica que cuando es más difícil cometer un robo, hay un menor deterioro en la seguridad de los hogares. En resumen, aumentar la dificultad de los robos tiene un efecto protector indirecto: los hogares tienden a mantenerse seguros por más tiempo, lo que reduce el crecimiento de hogares insuficientemente protegidos.
variable de estado = Insufficiently.protected.homes (time) parametro = chance.of.being.caught.after.a.burglary (colour)
Aquí se representa el impacto de la probabilidad de ser atrapado después de cometer un robo en una vivienda (chance.of.being.caught.after.a.burglary) sobre la cantidad de hogares insuficientemente protegidos. Se observa que cuando la probabilidad de ser capturado es baja (colores azules), los hogares insuficientemente protegidos aumentan más rápidamente. A medida que la probabilidad de arresto incrementa (colores más rosados o morados), la velocidad de incremento de esta variable disminuye. Esto sugiere que un mayor riesgo de ser atrapado frena la actividad delictiva, preservando mejor la seguridad residencial y reduciendo el número de hogares vulnerables.
variable de estado = Insufficiently.protected.homes (time) parametro = chance.of.being.caught.after.a.robbery (colour)
Este último gráfico muestra cómo influye la probabilidad de ser atrapado después de un asalto (chance.of.being.caught.after.a.robbery) en la cantidad de hogares insuficientemente protegidos. Se evidencia que con una baja probabilidad de arresto (colores azules), el número de hogares vulnerables crece más. En contraste, a medida que la probabilidad de ser capturado tras un asalto aumenta (colores verdes), el crecimiento de esta variable se desacelera. Esto refuerza la idea de que mayores consecuencias legales disuaden el crimen en general, incluso si el parámetro está asociado a un tipo de delito distinto, y con ello se preserva mejor la protección de los hogares.
#Varios plots
# Crea una gráfica para cada variable de interés
p1<- ggplot(out_all,aes(x=time,y=SP.stores,group=Run.ID, colour=difficulty.of.a.burglary))+
geom_line()+
scale_color_gradient(low = "orange", high = "green")
p2<- ggplot(out_all,aes(x=time,y=SP.stores,group=Run.ID, colour= chance.of.being.caught.after.a.burglary))+
geom_line()+
scale_color_gradient(low = "green", high = "pink")
p3<- ggplot(out_all,aes(x=time,y=SP.stores,group=Run.ID, colour= chance.of.being.caught.after.a.robbery))+
geom_line()+
scale_color_gradient(low = "blue", high = "green")
# Ahora puedes ver las gráficas individualmente
p1
p2
p3
# Para ver las gráficas juntas, se puede usar gridExtra
library(gridExtra)
grid.arrange(p1, p2, p3, ncol = 1)
variable de estado = SP.stores (time) parametro = difficulty.of.a.burglary (colour)
Este gráfico muestra cómo evoluciona el número de tiendas suficientemente protegidas a lo largo del tiempo dependiendo de la dificultad para cometer un robo. Se observa que cuando la dificultad es baja (colores amarillos), el crecimiento de tiendas protegidas es mucho más limitado. En contraste, a medida que la dificultad de robo aumenta (colores verdes), el número de tiendas suficientemente protegidas crece de manera más sostenida y rápida. Esto sugiere que cuando los robos son más difíciles de realizar, se incentiva la protección de las tiendas, ya sea por aumento en inversiones de seguridad o menor deterioro del entorno comercial.
variable de estado = SP.stores (time) parametro = chance.of.being.caught.after.a.burglary (colour)
En este gráfico se explora cómo influye la probabilidad de ser atrapado tras un robo domiciliario sobre el número de tiendas suficientemente protegidas. A medida que esta probabilidad es baja (colores verdes), el crecimiento de tiendas protegidas es también más limitado. Sin embargo, al aumentar la probabilidad de ser capturado (colores rosados a púrpura), se observa una tendencia de mayor incremento en la cantidad de tiendas protegidas. Esto podría explicarse por un efecto indirecto: mayor control policial o judicial frente a los robos también mejora la percepción de seguridad general, y por lo tanto más tiendas se mantienen protegidas o invierten en seguridad.
variable de estado = SP.stores (time) parametro = chance.of.being.caught.after.a.robbery (colour)
Finalmente, este gráfico examina cómo la probabilidad de ser atrapado después de un asalto afecta el número de tiendas suficientemente protegidas. Con bajas probabilidades de captura (colores azules), el crecimiento de tiendas protegidas es más lento. En cambio, con altas probabilidades (colores verdes), el número de tiendas suficientemente protegidas crece más rápidamente. Esto refuerza la hipótesis de que un mayor riesgo para los delincuentes genera un entorno más seguro, donde las tiendas pueden permanecer protegidas por más tiempo o adoptar medidas preventivas más efectivas.
#Varios plots
# Crea una gráfica para cada variable de interés
p1<- ggplot(out_all,aes(x=time,y=IP.stores,group=Run.ID, colour=difficulty.of.a.burglary))+
geom_line()+
scale_color_gradient(low = "green", high = "orange")
p2<- ggplot(out_all,aes(x=time,y=IP.stores,group=Run.ID, colour= chance.of.being.caught.after.a.burglary))+
geom_line()+
scale_color_gradient(low = "green", high = "pink")
p3<- ggplot(out_all,aes(x=time,y=IP.stores,group=Run.ID, colour= chance.of.being.caught.after.a.robbery))+
geom_line()+
scale_color_gradient(low = "blue", high = "orange")
# Ahora puedes ver las gráficas individualmente
p1
p2
p3
# Para ver las gráficas juntas, se puede usar gridExtra
library(gridExtra)
grid.arrange(p1, p2, p3, ncol = 1)
variable de estado = IP.stores (time) parametro = difficulty.of.a.burglary (colour)
Este gráfico muestra cómo evoluciona el número de tiendas insuficientemente protegidas a lo largo del tiempo, dependiendo de la dificultad para cometer un robo. Se observa que cuando la dificultad del robo es baja (colores naranja/amarillo), el número de tiendas insuficientemente protegidas se mantiene elevado por más tiempo. En cambio, con mayor dificultad (colores verdes), la cantidad de estas tiendas disminuye más rápidamente. Esto sugiere que cuando es más difícil robar, las tiendas tienen mayor incentivo (o mayor oportunidad) de reforzar sus sistemas de seguridad, reduciendo la vulnerabilidad general.
variable de estado = IP.stores (time) parametro = chance.of.being.caught.after.a.burglary (colour)
Aquí se analiza cómo influye la probabilidad de ser atrapado después de un robo domiciliario sobre la cantidad de tiendas insuficientemente protegidas. Con probabilidades bajas de captura (colores verdes), las tiendas permanecen más tiempo en condición de vulnerabilidad. En cambio, a mayor probabilidad de captura (colores rosados), se ve una reducción más marcada de tiendas no protegidas. Esto puede explicarse por una transferencia indirecta de seguridad: un ambiente donde se castiga con mayor eficacia el crimen desalienta también el robo comercial, motivando a los dueños de tiendas a mejorar sus medidas preventivas.
variable de estado = IP.stores (time) parametro = chance.of.being.caught.after.a.robbery (colour)
En este último gráfico se muestra cómo la probabilidad de ser capturado tras un robo a tienda afecta la cantidad de tiendas insuficientemente protegidas. Colores azul oscuro indican baja probabilidad de ser atrapado, mientras que los colores naranja más claro representan alta probabilidad. Se observa que cuando la probabilidad es baja, el número de tiendas insuficientemente protegidas decrece lentamente. A medida que la probabilidad de captura sube, la caída en tiendas vulnerables se acentúa. Esto refleja un efecto directo: mayores consecuencias para los criminales derivan en un entorno más seguro y motivan una mejor protección comercial.
REFERENCIAS: Modelo del caso 18.9 Fighting HIC on the Regional Level Incluido en el libro Small System Dynamics Models for Big Issues de Erik Pruyt. FIN - JAIRO ACUÑA RETANA