Pregunta de investigación: ¿Cuáles son los factores que contribuyen a una mayor vulnerabilidad a las personas transgénero en México que evitan que lleguen a la vejez?
Para resolver la pregunta, primero se realizó un modelo simplificado para ver la razón principal por el cual las personas trans no llegaban a la vejez. El modelo divide a la población por etapas de vida en los siguientes rangos:
Niñxs: 0-14 años
Jóvenes: 15-17 años
Adultxs: 18-54 años
Adultxs mayores: 55 años en adelante
Se utilizaron unos rangos de edad no convencionales para clasificar a la población para poder analizar de una manera más adecuada a la población trans debido a su baja esperanza de vida. Por esta misma razón la Encuesta Nacional sobre Diversidad Sexual y de Género (ENDISEG) hecha por la INEGI utiliza estos mismos rangos para describir estadísticamente a la población LGBTI+.
Partimos de una cadena de envejecimiento de la población mexicana general. Con motivo de simplificar el fenómeno, se hicieron las siguientes suposiciones:
Este código está dividido en secciones claramente definidas que representan las condiciones iniciales, los parámetros del modelo, la definición del modelo, el método de integración, la simulación y la visualización de los resultados.
| Concepto | Fuente |
|---|---|
| Niños | INEGI. |
| Jóvenes | INEGI. |
| Adultos | INEGI. |
| Adultos mayores | INEGI. |
| Jóvenes trans | INEGI. |
| Adultos trans | INEGI. |
| Adultos mayores trans | INEGI. |
| Tasa de natalidad jóvenes | INEGI. |
| Tasa de natalidad adultos | INEGI. |
| Tasa de mortalidad niños | INEGI. |
| Tasa de mortalidad jóvenes | La Rosa, A. C. (2003, January 6). La salud de adolescentes en cifras. https://saludpublica.mx/index.php/spm/article/view/4617 |
| Tasa de mortalidad adultos | Banco Mundial. |
| Tasa de mortalidad adultos mayores | INEGI. |
| Duración niños | 15 años - 0 años |
| Duración jovenes | 18 años - 15 años |
| Duración adultos | 55 años - 18 años |
| Duración adultos mayores | 75 años - 55 años |
| Esperanza de vida | INEGI. |
| Tasa de personas que se identifican como trans | INEGI. |
| Tasa de suicidio jóvenes/adultos/adultos mayores trans | Gobierno de México. INEGI. Erlangsen A, Jacobsen AL, Ranning A, Delamare AL, Nordentoft M, Frisch M. Transgender Identity and Suicide Attempts and Mortality in Denmark. JAMA. 2023;329(24):2145–2153. doi:10.1001/jama.2023.8627 |
| Tasa de homicidios jovenes/adultos/adultos mayores trans | Visible LGBT. |
# Cargar librerías necesarias para la simulación y visualización
library("deSolve")
library(ggplot2)
library(ISLR)
library(MASS)
# Condiciones iniciales del modelo. Población por grupo de edad (incluyendo población trans)
initial.conditions <- c(
ninos = 31755284,
jovenes = 10806690,
adultos = 62639330,
ancianos = 21128292,
jovenes_trans = 154460,
adultos_trans = 705063,
ancianos_trans = 49428
)
# Intervalo de tiempo para la simulación (0 a 60 días)
times <- seq(0, 60, by = 1)
# Parámetros del modelo
parameters <- c(
tasa_natalidad_jovenes = (26.3 / 1000),
tasa_natalidad_adultos = (55.6 / 1000),
tasa_mortalidad_ninos = (12 / 1000),
tasa_mortalidad_jovenes = (70.3 / 100000),
tasa_mortalidad_adultos = (12 / 1000),
tasa_mortalidad_ancianos = (654 / 100000),
duracion_ninos = 15,
duracion_jovenes = 3,
duracion_adultos = 37,
duracion_ancianos = 21,
esperanza_vida = 75,
# Población trans
tasa_poblacion_trans = 0.9 / 100,
tasa_suicidio_jovenes = (8.04) / 100,
tasa_suicidio_adultos = (28.61) / 100,
tasa_suicidio_mayores = (1.35) / 100,
tasa_homicidio_jovenes = (0.002) / 100,
tasa_homicidio_adultos = (0.004) / 100,
tasa_homicidio_mayores = (0.002) / 100
)
# Definir la función del modelo
model <- function(t, state, parameters) {
with(as.list(c(state, parameters)), {
# Variables endógenas
poblacion = ninos + jovenes + adultos + ancianos
poblacion_trans = jovenes_trans + adultos_trans + ancianos_trans
suicidio_jovenes_trans = jovenes_trans * tasa_suicidio_jovenes
suicidio_adultos_trans = adultos_trans * tasa_suicidio_adultos
suicidio_ancianos_trans = ancianos_trans * tasa_suicidio_mayores
homicidio_jovenes_trans = jovenes_trans * tasa_homicidio_jovenes
homicidio_adultos_trans = adultos_trans * tasa_homicidio_adultos
homicidio_ancianos_trans = ancianos_trans * tasa_homicidio_mayores
# Variables flujo
nacimientos = (jovenes * tasa_natalidad_jovenes) + (adultos * tasa_natalidad_adultos)
adolescencia = ninos / duracion_ninos
madurez = jovenes / duracion_jovenes
envejecimiento = adultos / duracion_adultos
muerte_ninos = ninos * tasa_mortalidad_ninos
muerte_jovenes = jovenes * tasa_mortalidad_jovenes
muerte_adultos = adultos * tasa_mortalidad_adultos
muerte_anciano = ancianos / (esperanza_vida - (duracion_ninos + duracion_jovenes + duracion_adultos))
# Población trans
autoidentificacion = tasa_poblacion_trans * jovenes
madurez_trans = jovenes_trans / duracion_jovenes
envejecimiento_trans = adultos_trans / duracion_adultos
muerte_jovenes_trans = (jovenes_trans * tasa_mortalidad_jovenes) + suicidio_jovenes_trans + homicidio_jovenes_trans
muerte_adultos_trans = (adultos_trans * tasa_mortalidad_adultos) + suicidio_adultos_trans + homicidio_adultos_trans
muerte_anciano_trans = ancianos_trans / (esperanza_vida - (duracion_ninos + duracion_jovenes + duracion_adultos)) + suicidio_ancianos_trans + homicidio_ancianos_trans
# Variables estado
dninos = nacimientos - adolescencia - muerte_ninos
djovenes = adolescencia - madurez - muerte_jovenes
dadultos = madurez - envejecimiento - muerte_adultos
dancianos = envejecimiento - muerte_anciano
djovenes_trans = autoidentificacion - madurez_trans - muerte_jovenes_trans
dadultos_trans = madurez_trans - envejecimiento_trans - muerte_adultos_trans
dancianos_trans = envejecimiento_trans - muerte_anciano_trans
# Devuelve los resultados de las variables de estado y algunas variables adicionales
return(list(c(dninos, djovenes, dadultos, dancianos, djovenes_trans, dadultos_trans, dancianos_trans),
nacimientos = nacimientos,
muerte_anciano = muerte_anciano,
poblacion = poblacion,
poblacion_trans = poblacion_trans))
})
}
# 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 = initial.conditions,
times = times,
func = model,
parms = parameters,
method = intg.method
)
# Convertir los resultados a un data frame
out <- as.data.frame(out)
# Graficar los resultados para la población trans joven, anciana, total y general
ggplot(out, aes(x = time, y = jovenes_trans)) + geom_line()
ggplot(out, aes(x = time, y = ancianos_trans)) + geom_line()
ggplot(out, aes(x = time, y = poblacion_trans)) + geom_line()
ggplot(out, aes(x = time, y = poblacion)) + geom_line()
Estas gráficas nos enseñan la proyección de la población trans, divididas en su respectivo rango de edades, en los próximos 60 años.
Para evaluar cuál es el fenómeno más significante para que las personas trans lleguen a la vejez: suicidio u homicidio. Igualmente, ver en cuál etapa de la vida ocurre más. Se realizaron escenarios con incertidumbre de la tasa de suicidio y homicidio de adultos y jóvenes.
Este código realiza simulaciones para diferentes combinaciones de tasas de suicidio y homicidio, recopilando los resultados y luego visualizándolos mediante gráficos.
# VALORES DE INCERTIDUMBRE.
# Definir rangos de valores para las tasas de suicidio y homicidio
# TASAS DE SUICIDIO
x1 <- seq(3 / 100, 13 / 100, 1 / 100) # jóvenes
x2 <- seq(22 / 100, 33.6 / 100, 1 / 100) # adultos
# TASAS DE HOMICIDIO
x3 <- seq(0.0015 / 100, 0.005 / 100, 0.001 / 100) # jóvenes
x4 <- seq(0.0015 / 100, 0.006 / 100, 0.001 / 100) # adultos
# ASIGNACIÓN DE VARIABLES A VALORES
# Crear todas las combinaciones posibles de tasas de suicidio y homicidio
Xs <- expand.grid(list(
tasa_suicidio_jovenes = x1,
tasa_suicidio_adultos = x2,
tasa_homicidio_jovenes = x3,
tasa_homicidio_adultos = x4
))
Xs$Run.ID <- 1:nrow(Xs) # Agregar identificadores únicos para cada combinación
# Lista para almacenar los resultados de todas las simulaciones
out_all <- list()
# Establecer el loop para realizar simulaciones con diferentes combinaciones de parámetros
for (i in 1:nrow(Xs)) {
# Definir los parámetros del modelo para esta iteración
parameters.Xs <- c(
tasa_natalidad_jovenes = (26.3 / 1000),
tasa_natalidad_adultos = (55.6 / 1000),
tasa_mortalidad_ninos = (12 / 1000),
tasa_mortalidad_jovenes = (70.3 / 100000),
tasa_mortalidad_adultos = (12 / 1000),
tasa_mortalidad_ancianos = (654 / 100000),
duracion_ninos = 14,
duracion_jovenes = 4,
duracion_adultos = 36,
duracion_ancianos = 21,
esperanza_vida = 75,
# Población trans
tasa_poblacion_trans = 0.9 / 100,
tasa_suicidio_jovenes = Xs$tasa_suicidio_jovenes[i],
tasa_suicidio_adultos = Xs$tasa_suicidio_adultos[i],
tasa_suicidio_mayores = (1.35) / 100,
tasa_homicidio_jovenes = Xs$tasa_homicidio_jovenes[i],
tasa_homicidio_adultos = Xs$tasa_homicidio_adultos[i],
tasa_homicidio_mayores = (0.002) / 100
)
# 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 = initial.conditions, # condiciones iniciales
times = times, # tiempo de simulación
func = model, # función del modelo
parms = parameters.Xs, # parámetros de esta iteración
method = intg.method
)
# Convertir los resultados a un data frame
out <- as.data.frame(out)
# Agregar columna al data frame para identificar la corrida
out$Run.ID <- Xs$Run.ID[i]
# Agregar el data frame a la lista de resultados
out_all <- append(out_all, list(out))
# Imprimir el Run.ID para esta simulación particular para seguimiento
#print(Xs$Run.ID[i])
}
# Combinar todos los resultados en un solo data frame
out_all <- do.call("rbind", out_all)
# Mostrar las dimensiones del data frame combinado
dim(out_all)
## [1] 161040 13
# Unir los resultados con el data frame de combinaciones de parámetros para facilitar el análisis
out_all <- merge(out_all, Xs, by = "Run.ID")
# Mostrar las dimensiones del data frame combinado con los parámetros
dim(out_all)
## [1] 161040 17
# Graficar los resultados de las simulaciones
# Gráfico de ancianos trans versus tiempo, coloreado por tasa de suicidio de jóvenes
ggplot(out_all, aes(x = time, y = ancianos_trans, group = Run.ID, colour = tasa_suicidio_jovenes)) +
geom_line() +
scale_color_gradient(low = "pink", high = "skyblue")
# Gráfico de ancianos trans versus tiempo, coloreado por tasa de homicidio de jóvenes
ggplot(out_all, aes(x = time, y = ancianos_trans, group = Run.ID, colour = tasa_homicidio_jovenes)) +
geom_line() +
scale_color_gradient(low = "pink", high = "skyblue")
# Gráfico de ancianos trans versus tiempo, coloreado por tasa de suicidio de adultos
ggplot(out_all, aes(x = time, y = ancianos_trans, group = Run.ID, colour = tasa_suicidio_adultos)) +
geom_line() +
scale_color_gradient(low = "pink", high = "skyblue")
# Gráfico de ancianos trans versus tiempo, coloreado por tasa de homicidio de adultos
ggplot(out_all, aes(x = time, y = ancianos_trans, group = Run.ID, colour = tasa_homicidio_adultos)) +
geom_line() +
scale_color_gradient(low = "pink", high = "skyblue")
En las gráficas con incertidumbres ambas tasas de suicidio llaman la atención como las más significantes.
¿Qué hace que dichas tasas de suicidio incrementen o decrementen? Para contestar esta pregunta, se realizó una regresión a partir de los datos recopilados en la ENDISEG. Lxs encuestados contestaron si han intentado suicidarse, y procedían a responder si se debió por problemas económicos, familiares o de pareja, de salud, en la escuela, en el trabajo, debido a su orientación sexual y/o identidad de género, u otros.
A partir de estos datos se hizo una regresión para determinar cuáles problemas son los más significativos para que alguien de la comunidad trans intente o no intente suicidarse.
Este código realiza un análisis detallado para entender las variables que influyen en los intentos de suicidio entre diferentes rangos de edad, utilizando técnicas avanzadas de manipulación y análisis de datos.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:MASS':
##
## select
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
# Leer el archivo CSV que contiene los datos
endiseg <- read.csv("/Users/abby/Documents/6to/Análisis de decisiones bajo incertidumbre/endiseg_2021_bd_csv/TSDEM.csv")
# Preprocesar y seleccionar las columnas relevantes del dataset
base <- endiseg %>%
select(EDAD, FILTRO_9_2, FILTRO_10_4, P10_4_1, P10_4_2, P10_4_3, P10_4_4, P10_4_5, P10_4_6, P10_4_7, P10_4_8, FACTOR) %>%
filter(EDAD >= 15 & EDAD <= 95) %>% # Filtrar por edades entre 15 y 95 años
filter(FILTRO_9_2 == 1) %>% # Filtrar registros donde FILTRO_9_2 es igual a 1
rename(
intento_suicidio = FILTRO_10_4,
problemas_economicos = P10_4_1,
problemas_familiares = P10_4_2,
problemas_salud = P10_4_3,
problemas_escuela = P10_4_4,
problemas_trabajo = P10_4_5,
problemas_orientacion = P10_4_6,
problemas_genero = P10_4_7,
problemas_otros = P10_4_8
) %>%
mutate(
# Re-codificar la variable de intento de suicidio
intento_suicidio = ifelse(intento_suicidio == 2, 1, 0),
# Re-codificar problemas para que sean binarios
problemas_economicos = ifelse(problemas_economicos == 1, 1, 0),
problemas_familiares = ifelse(problemas_familiares == 1, 1, 0),
problemas_salud = ifelse(problemas_salud == 1, 1, 0),
problemas_escuela = ifelse(problemas_escuela == 1, 1, 0),
problemas_trabajo = ifelse(problemas_trabajo == 1, 1, 0),
problemas_orientacion = ifelse(problemas_orientacion == 1, 1, 0),
problemas_genero = ifelse(problemas_genero == 1, 1, 0),
problemas_otros = ifelse(problemas_otros == 1, 1, 0)
) %>%
# Reemplazar los valores NA por 0 en las variables de problemas
replace_na(list(
problemas_economicos = 0,
problemas_familiares = 0,
problemas_salud = 0,
problemas_escuela = 0,
problemas_trabajo = 0,
problemas_orientacion = 0,
problemas_genero = 0,
problemas_otros = 0
)) %>%
# Convertir las variables de problemas a factores
mutate_at(vars(starts_with("problemas_")), as.factor)
# Clasificar edades en rangos
base <- base %>%
mutate(rango_edad = case_when(
EDAD >= 15 & EDAD <= 17 ~ "jovenes",
EDAD >= 18 & EDAD <= 54 ~ "adultos",
EDAD >= 55 ~ "ancianos",
TRUE ~ NA_character_
))
# Calcular promedios por rangos de edad
promedios_problemas <- base %>%
group_by(rango_edad) %>%
summarise_at(vars(starts_with("problemas_")), ~ mean(as.numeric(as.character(.)), na.rm = TRUE))
# Crear un data frame con los promedios
promedios_problemas <- data.frame(
rango_edad = c("adultos", "ancianos", "jovenes"),
problemas_economicos = c(0.05936073, 0.06593407, 0.00000000),
problemas_familiares = c(0.1689498, 0.1428571, 0.1250000),
problemas_salud = c(0.05936073, 0.04395604, 0.09375000),
problemas_escuela = c(0.03196347, 0.10989011, 0.09375000),
problemas_trabajo = c(0.01369863, 0.04395604, 0.03125000),
problemas_orientacion = c(0.05022831, 0.03296703, 0.09375000),
problemas_genero = c(0.04109589, 0.04395604, 0.00000000),
problemas_otros = c(0.03196347, 0.05494505, 0.03125000)
)
# Convertir intento de suicidio a factor
base$intento_suicidio <- as.factor(base$intento_suicidio)
# Cargar el paquete MASS para usar funciones de análisis discriminante
library(MASS)
# Expandir la base de datos utilizando el factor de expansión
base_expandida <- base[rep(seq_len(nrow(base)), base$FACTOR), ]
# Modelo LDA (Análisis Discriminante Lineal) para predecir intento de suicidio
modelo_lda <- lda(intento_suicidio ~ problemas_economicos + problemas_familiares + problemas_salud + problemas_escuela + problemas_trabajo + problemas_orientacion + problemas_genero + problemas_otros, data = base)
# Mostrar el modelo LDA
modelo_lda
## Call:
## lda(intento_suicidio ~ problemas_economicos + problemas_familiares +
## problemas_salud + problemas_escuela + problemas_trabajo +
## problemas_orientacion + problemas_genero + problemas_otros,
## data = base)
##
## Prior probabilities of groups:
## 0 1
## 0.6812865 0.3187135
##
## Group means:
## problemas_economicos1 problemas_familiares1 problemas_salud1
## 0 0.0000000 0.0000000 0.0000000
## 1 0.1743119 0.4954128 0.1834862
## problemas_escuela1 problemas_trabajo1 problemas_orientacion1
## 0 0.0000000 0.0000000 0.0000000
## 1 0.1834862 0.0733945 0.1559633
## problemas_genero1 problemas_otros1
## 0 0.0000000 0.0000000
## 1 0.1192661 0.1192661
##
## Coefficients of linear discriminants:
## LD1
## problemas_economicos1 1.5148157
## problemas_familiares1 3.0047786
## problemas_salud1 2.5281189
## problemas_escuela1 1.3300710
## problemas_trabajo1 1.1415393
## problemas_orientacion1 1.6380943
## problemas_genero1 0.8891899
## problemas_otros1 4.2064484
A partir de los coeficientes recuperados de la regresión, se reemplazaron los parámetros de las tasas de suicidio para los tres rangos de edad con los problemas que determinan la probabilidad que las personas trans intenten o no intenten suicidarse para calcular el intento de suicidio y finalmente, la cantidad de personas que intentan suicidarse bajo el porcentaje de problemas que presenta las comunidades por edad.
Los parámetros se conservan del primer modelo, excepto por las tasas de suicidio, que se eliminaron. Igualmente se añadieron otros para realizar los nuevos cálculos:
Todos los valores de las betas de los diferentes tipos de problemas se obtuvieron de la regresión.
Todos los valores de las probabilidades de los diferentes tipos de problemas se obtuvieron promediado las respuestas de los encuestados de la ENDISEG.
# Cargar librerías necesarias para la simulación y visualización
library("deSolve")
library(ggplot2)
# Definir las condiciones iniciales del modelo. Población trans por grupo de edad
initial.conditions <- c(
ninos = 31755284, # Población inicial de niños
jovenes = 10806690, # Población inicial de jóvenes
adultos = 62639330, # Población inicial de adultos
ancianos = 21128292, # Población inicial de ancianos
jovenes_trans = 154460, # Población trans inicial de jóvenes
adultos_trans = 705063, # Población trans inicial de adultos
ancianos_trans = 49428 # Población trans inicial de ancianos
)
# Definir el rango de tiempo para la simulación (en años)
times <- seq(1, 60, by = 1) # Años
# Definir los parámetros del modelo
parameters <- c(
# Tasas de natalidad por grupo de edad (nacimientos por 1000 personas)
tasa_natalidad_jovenes = (26.3 / 1000),
tasa_natalidad_adultos = (55.6 / 1000),
# Tasas de mortalidad por grupo de edad (muertes por 1000 personas)
tasa_mortalidad_ninos = (12 / 1000),
tasa_mortalidad_jovenes = (70.3 / 100000),
tasa_mortalidad_adultos = (12 / 1000), # Modificado, original de 9
tasa_mortalidad_ancianos = (654 / 100000),
# Duración de cada grupo de edad (en años)
duracion_ninos = 14,
duracion_jovenes = 4,
duracion_adultos = 36,
duracion_ancianos = 21,
esperanza_vida = 75,
# Población trans
tasa_poblacion_trans = 0.9 / 100, # Tasa de identificación como trans
tasa_suicidio_jovenes = (8.04) / 100,
tasa_suicidio_adultos = (28.61) / 100,
tasa_suicidio_mayores = (1.35) / 100,
tasa_homicidio_jovenes = (0.002) / 100,
tasa_homicidio_adultos = (0.004) / 100,
tasa_homicidio_mayores = (0.002) / 100,
proporcion_consumacion_suicidio = 5 / 100,
# Betas (coeficientes) para los problemas en jóvenes, adultos y ancianos
B_eco_jovenes = 14 / 100,
B_fam_jovenes = 56 / 100,
B_sal_jovenes = 43 / 100,
B_esc_jovenes = 9 / 100,
B_tra_jovenes = 4 / 100,
B_ori_jovenes = 18 / 100,
B_gen_jovenes = 0 / 100, # Negativo
B_otros_jovenes = 90 / 100,
B_eco_adultos = 51 / 100,
B_fam_adultos = 200 / 100,
B_sal_adultos = 150 / 100,
B_esc_adultos = 33 / 100,
B_tra_adultos = 14 / 100,
B_ori_adultos = 63 / 100,
B_gen_adultos = 0 / 100, # Negativo
B_otros_adultos = 321 / 100,
B_eco_ancianos = 2 / 100,
B_fam_ancianos = 9 / 100,
B_sal_ancianos = 8 / 100,
B_esc_ancianos = 2 / 100,
B_tra_ancianos = 1 / 100,
B_ori_ancianos = 3 / 100,
B_gen_ancianos = 0 / 100, # Negativo
B_otros_ancianos = 15 / 100,
# Problemas en jóvenes, adultos y ancianos (promedios obtenidos)
problemas_economicos_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_economicos"]),
problemas_familiares_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_familiares"]),
problemas_salud_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_salud"]),
problemas_escuela_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_escuela"]),
problemas_trabajo_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_trabajo"]),
problemas_orientacion_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_orientacion"]),
problemas_genero_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_genero"]),
problemas_otros_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_otros"]),
problemas_economicos_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_economicos"]),
problemas_familiares_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_familiares"]),
problemas_salud_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_salud"]),
problemas_escuela_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_escuela"]),
problemas_trabajo_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_trabajo"]),
problemas_orientacion_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_orientacion"]),
problemas_genero_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_genero"]),
problemas_otros_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_otros"]),
problemas_economicos_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_economicos"]),
problemas_familiares_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_familiares"]),
problemas_salud_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_salud"]),
problemas_escuela_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_escuela"]),
problemas_trabajo_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_trabajo"]),
problemas_orientacion_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_orientacion"]),
problemas_genero_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_genero"]),
problemas_otros_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_otros"])
)
# Definir la función del modelo
model_suicidios <- function(t, state, parameters) {
with(as.list(c(state, parameters)), {
# Variables endógenas (internas) del modelo
prob_intento_jovenes <- B_eco_jovenes * problemas_economicos_jovenes +
B_fam_jovenes * problemas_familiares_jovenes +
B_sal_jovenes * problemas_salud_jovenes +
B_esc_jovenes * problemas_escuela_jovenes +
B_tra_jovenes * problemas_trabajo_jovenes +
B_ori_jovenes * problemas_orientacion_jovenes +
B_gen_jovenes * problemas_genero_jovenes +
B_otros_jovenes * problemas_otros_jovenes
intento_suicidio_jovenes <- prob_intento_jovenes * jovenes_trans
suicidio_jovenes_trans <- intento_suicidio_jovenes * proporcion_consumacion_suicidio
prob_intento_adultos <- B_eco_adultos * problemas_economicos_adultos +
B_fam_adultos * problemas_familiares_adultos +
B_sal_adultos * problemas_salud_adultos +
B_esc_adultos * problemas_escuela_adultos +
B_tra_adultos * problemas_trabajo_adultos +
B_ori_adultos * problemas_orientacion_adultos +
B_gen_adultos * problemas_genero_adultos +
B_otros_adultos * problemas_otros_adultos
intento_suicidio_adultos <- prob_intento_adultos * adultos_trans
suicidio_adultos_trans <- intento_suicidio_adultos * proporcion_consumacion_suicidio
prob_intento_ancianos <- B_eco_ancianos * problemas_economicos_ancianos +
B_fam_ancianos * problemas_familiares_ancianos +
B_sal_ancianos * problemas_salud_ancianos +
B_esc_ancianos * problemas_escuela_ancianos +
B_tra_ancianos * problemas_trabajo_ancianos +
B_ori_ancianos * problemas_orientacion_ancianos +
B_gen_ancianos * problemas_genero_ancianos +
B_otros_ancianos * problemas_otros_ancianos
intento_suicidio_ancianos <- prob_intento_ancianos * ancianos_trans
suicidio_ancianos_trans <- intento_suicidio_ancianos * proporcion_consumacion_suicidio
homicidio_jovenes_trans <- jovenes_trans * tasa_homicidio_jovenes
homicidio_adultos_trans <- adultos_trans * tasa_homicidio_adultos
homicidio_ancianos_trans <- ancianos_trans * tasa_homicidio_mayores
poblacion <- ninos + jovenes + adultos + ancianos
poblacion_trans <- jovenes_trans + adultos_trans + ancianos_trans
# Variables de flujo (cambios en la población)
nacimientos <- (jovenes * tasa_natalidad_jovenes) + (adultos * tasa_natalidad_adultos)
adolescencia <- ninos / duracion_ninos
madurez <- jovenes / duracion_jovenes
envejecimiento <- adultos / duracion_adultos
muerte_ninos <- (ninos * tasa_mortalidad_ninos)
muerte_jovenes <- (jovenes * tasa_mortalidad_jovenes)
muerte_adultos <- (adultos * tasa_mortalidad_adultos)
muerte_anciano <- ancianos / (esperanza_vida - (duracion_ninos + duracion_jovenes + duracion_adultos))
# Población trans
autoidentificacion <- tasa_poblacion_trans * jovenes
madurez_trans <- jovenes_trans / duracion_jovenes
envejecimiento_trans <- adultos_trans / duracion_adultos
muerte_jovenes_trans <- (jovenes_trans * tasa_mortalidad_jovenes) + suicidio_jovenes_trans + homicidio_jovenes_trans
muerte_adultos_trans <- (adultos_trans * tasa_mortalidad_adultos) + suicidio_adultos_trans + homicidio_adultos_trans
muerte_anciano_trans <- ancianos_trans / (esperanza_vida - (duracion_ninos + duracion_jovenes + duracion_adultos)) + suicidio_ancianos_trans + homicidio_ancianos_trans
# Variables de estado (población en cada grupo)
dninos <- nacimientos - adolescencia - muerte_ninos
djovenes <- adolescencia - madurez - muerte_jovenes
dadultos <- madurez - envejecimiento - muerte_adultos
dancianos <- envejecimiento - muerte_anciano
djovenes_trans <- autoidentificacion - madurez_trans - muerte_jovenes_trans
dadultos_trans <- madurez_trans - envejecimiento_trans - muerte_adultos_trans
dancianos_trans <- envejecimiento_trans - muerte_anciano_trans
# Devuelve los resultados de la variable de estado
return(list(c(dninos, djovenes, dadultos, dancianos, djovenes_trans, dadultos_trans, dancianos_trans),
nacimientos = nacimientos,
muerte_anciano = muerte_anciano,
poblacion = poblacion,
poblacion_trans = poblacion_trans,
intento_suicidio_adultos = intento_suicidio_adultos,
intento_suicidio_jovenes = intento_suicidio_jovenes
))
})
}
# 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 = initial.conditions,
times = times,
func = model_suicidios,
parms = parameters,
method = intg.method
)
# Convertir los resultados de la simulación a un data frame
out <- as.data.frame(out)
# Graficar los resultados de la simulación
ggplot(out, aes(x = time, y = jovenes_trans)) + geom_line()
ggplot(out, aes(x = time, y = ancianos_trans)) + geom_line()
ggplot(out, aes(x = time, y = poblacion_trans)) + geom_line()
ggplot(out, aes(x = time, y = poblacion)) + geom_line()
Estas gráficas nos enseñan la proyección de la población trans, divididas en su respectivo rango de edades, en los próximos 60 años.
Para evaluar cuáles problemas tienen un impacto mayor en la probabilidad de que una persona trans se suicide, realizamos escenarios con incertidumbres en las probabilidades que las personas trans tengan problemas debido a su orientación sexual, familiares o de pareja, de salud y otros. Solamente se seleccionaron este tipo de problemas para realizar los escenarios de incertidumbres ya que fueron los que obtuvieron los valores más altos en la regresión, lo cual significa que el tener estos problemas hace más probable que alguien tome la decisión de intenar suicidarse.
El código realiza una simulación de dinámica de sistemas para modelar
la población trans en diferentes rangos de edad (jóvenes, adultos y
ancianos) considerando diversas variables de problemas socioeconómicos,
familiares, de salud, entre otros. Inicialmente, se generan todas las
combinaciones posibles de valores para estos problemas usando un grid.
Luego, para cada combinación, se definen parámetros específicos y se
ejecuta una simulación utilizando el método de integración de
Runge-Kutta de cuarto orden (rk4) con la función ode del
paquete deSolve. Los resultados de cada simulación se
almacenan y se combinan en un solo data frame. Finalmente, se visualizan
los resultados mediante gráficos que muestran la evolución de la
población trans anciana en función de varios problemas, usando el
paquete ggplot2.
# Crear secuencias desde 0 hasta 1 con un paso de 25/100 (para problemas)
x1 <- seq(0, 1, 50/100) # problemas
# Crear un data frame con todas las combinaciones posibles de los valores de problemas para jóvenes y adultos
Xs <- expand.grid(list(
problemas_orientacion_jovenes = x1,
problemas_familiares_jovenes = x1,
problemas_salud_jovenes = x1,
problemas_otros_jovenes = x1,
problemas_familiares_adultos = x1,
problemas_salud_adultos = x1,
problemas_otros_adultos = x1,
problemas_orientacion_adultos = x1
))
Xs$Run.ID <- 1:nrow(Xs) # Agregar una columna Run.ID con el identificador de cada combinación
# Inicializar una lista para almacenar los resultados de todas las simulaciones
out_all <- list()
# Establecer un loop para iterar sobre todas las combinaciones de problemas en Xs
for (i in 1:nrow(Xs)) {
# Definir los parámetros específicos para cada iteración
parameters.Xs <- c(
tasa_natalidad_jovenes = (26.3/1000),
tasa_natalidad_adultos = (55.6/1000),
tasa_mortalidad_ninos = (12/1000),
tasa_mortalidad_jovenes = (70.3/100000),
tasa_mortalidad_adultos = (12/1000), # Modificado, original era 9
tasa_mortalidad_ancianos = (654/100000),
duracion_ninos = 14,
duracion_jovenes = 4,
duracion_adultos = 36,
duracion_ancianos = 21,
esperanza_vida = 75,
# Población trans
tasa_poblacion_trans = 0.9/100,
tasa_suicidio_jovenes = (8.04)/100,
tasa_suicidio_adultos = (28.61)/100,
tasa_suicidio_mayores = (1.35)/100,
tasa_homicidio_jovenes = (0.002)/100,
tasa_homicidio_adultos = (0.004)/100,
tasa_homicidio_mayores = (0.002)/100,
proporcion_consumacion_suicidio = 5/100,
# Betas problemas jóvenes: obtenidos a partir de la regresión con regla de 3
B_eco_jovenes = 14/100,
B_fam_jovenes = 56/100,
B_sal_jovenes = 43/100,
B_esc_jovenes = 9/100,
B_tra_jovenes = 4/100,
B_ori_jovenes = 18/100,
B_gen_jovenes = 0/100, # Negativo
B_otros_jovenes = 90/100,
# Betas problemas adultos: obtenidos con la regresión
B_eco_adultos = 51/100,
B_fam_adultos = 200/100,
B_sal_adultos = 150/100,
B_esc_adultos = 33/100,
B_tra_adultos = 14/100,
B_ori_adultos = 63/100,
B_gen_adultos = 0/100, # Negativo
B_otros_adultos = 321/100,
# Betas problemas ancianos: obtenidos a partir de la regresión con regla de 3
B_eco_ancianos = 2/100,
B_fam_ancianos = 9/100,
B_sal_ancianos = 8/100,
B_esc_ancianos = 2/100,
B_tra_ancianos = 1/100,
B_ori_ancianos = 3/100,
B_gen_ancianos = 0/100, # Negativo
B_otros_ancianos = 15/100,
# Problemas jóvenes
problemas_economicos_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_economicos"]),
problemas_familiares_jovenes = Xs$problemas_familiares_jovenes[i],
problemas_salud_jovenes = Xs$problemas_salud_jovenes[i],
problemas_escuela_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_escuela"]),
problemas_trabajo_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_trabajo"]),
problemas_orientacion_jovenes = Xs$problemas_orientacion_jovenes[i],
problemas_genero_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_genero"]),
problemas_otros_jovenes = Xs$problemas_otros_jovenes[i],
# Problemas adultos
problemas_economicos_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_economicos"]),
problemas_familiares_adultos = Xs$problemas_familiares_adultos[i],
problemas_salud_adultos = Xs$problemas_salud_adultos[i],
problemas_escuela_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_escuela"]),
problemas_trabajo_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_trabajo"]),
problemas_orientacion_adultos = Xs$problemas_orientacion_adultos[i],
problemas_genero_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_genero"]),
problemas_otros_adultos = Xs$problemas_otros_adultos[i],
# Problemas ancianos
problemas_economicos_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_economicos"]),
problemas_familiares_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_familiares"]),
problemas_salud_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_salud"]),
problemas_escuela_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_escuela"]),
problemas_trabajo_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_trabajo"]),
problemas_orientacion_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_orientacion"]),
problemas_genero_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_genero"]),
problemas_otros_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_otros"])
)
# 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 = initial.conditions, # Condiciones iniciales
times = times, # Tiempo de simulación
func = model_suicidios, # Función del modelo
parms = parameters.Xs, # Parámetros para esta iteración
method = intg.method # Método de integración
)
out <- as.data.frame(out) # Convertir los resultados de la simulación a un data frame
# Agregar una columna Run.ID al data frame resultante
out$Run.ID <- Xs$Run.ID[i]
# 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.
#print(Xs$Run.ID[i])
}
# Combinar todos los data frames de la lista out_all en uno solo
out_all <- do.call("rbind", out_all)
# Mostrar las dimensiones del data frame combinado
dim(out_all)
## [1] 393660 15
# Unir el data frame combinado con Xs utilizando la columna Run.ID
out_all <- merge(out_all, Xs, by="Run.ID")
# Mostrar las dimensiones del data frame final
dim(out_all)
## [1] 393660 23
# Varios plots para visualizar los resultados de las simulaciones
ggplot(out_all, aes(x=time, y=ancianos_trans, group=Run.ID, colour=problemas_familiares_adultos)) +
geom_line() +
scale_color_gradient(low = "pink", high = "skyblue")
ggplot(out_all, aes(x=time, y=ancianos_trans, group=Run.ID, colour=problemas_salud_adultos)) +
geom_line() +
scale_color_gradient(low = "pink", high = "skyblue")
ggplot(out_all, aes(x=time, y=ancianos_trans, group=Run.ID, colour=problemas_otros_adultos)) +
geom_line() +
scale_color_gradient(low = "pink", high = "skyblue")
ggplot(out_all, aes(x=time, y=ancianos_trans, group=Run.ID, colour=problemas_orientacion_adultos)) +
geom_line() +
scale_color_gradient(low = "pink", high = "skyblue")
ggplot(out_all, aes(x=time, y=ancianos_trans, group=Run.ID, colour=problemas_familiares_jovenes)) +
geom_line() +
scale_color_gradient(low = "pink", high = "skyblue")
ggplot(out_all, aes(x=time, y=ancianos_trans, group=Run.ID, colour=problemas_salud_jovenes)) +
geom_line() +
scale_color_gradient(low = "pink", high = "skyblue")
ggplot(out_all, aes(x=time, y=ancianos_trans, group=Run.ID, colour=problemas_otros_jovenes)) +
geom_line() +
scale_color_gradient(low = "pink", high = "skyblue")
ggplot(out_all, aes(x=time, y=ancianos_trans, group=Run.ID, colour=problemas_orientacion_jovenes)) +
geom_line() +
scale_color_gradient(low = "pink", high = "skyblue")
Las gráficas de las incertidumbres indican que los problemas familiares de los adultos trans son los más determinantes de la cantidad de población trans que llegará a la vejez en los próximos 60 años, seguido por otros problemas y de problemas de salud en este mismo grupo poblacional.
Tomando en cuenta que los problemas más significativos que aumentan la probabilidad de suicidio en las personas trans son familiares o de pareja, de salud y otros problemas; proponemos tres políticas para contrarrestar estos y finalmente, aumentar la cantidad de población trans que llegan a la vejez.
Problemas familiares o de pareja
Esta propuesta consiste en establecer centros de apoyo familiar en el 10% de los Centros del DIF en México, enfocados en educar y sensibilizar a las familias de personas trans. Estos centros ofrecerán talleres educativos impartidos por expertos en diversidad de género y salud mental, campañas de concientización, distribución de materiales informativos y grupos de apoyo para padres y familiares.
El objetivo es mejorar la aceptación y apoyo hacia las personas trans dentro del núcleo familiar y reducir la transfobia en la comunidad.
Problemas de salud
Esta propuesta se basa en implementar un programa de capacitación semestral en el 50% de los centros de salud públicos. Este programa incluirá formación sobre identidad de género, necesidades de salud de las personas trans y prácticas inclusivas, dirigido a médicos, enfermeras, personal administrativo y otros profesionales de la salud. La capacitación será impartida por expertos en salud trans y defensores de los derechos humanos.
El objetivo es mejorar la calidad y sensibilidad de la atención médica, erradicar la discriminación y fomentar la confianza en el sistema de salud pública.
Otros problemas
Esta propuesta se basa en establecer una línea telefónica de ayuda y apoyo disponible las 24 horas del día, los 7 días de la semana, específicamente dirigida a personas trans que estén en crisis o que necesiten apoyo emocional. Esta línea sería atendida por operadores capacitados en cuestiones de identidad de género y salud mental.
El objetivo es apoyar a los individuos que ya se encuentran en crisis.
Tomando en cuenta el nuevo diagrama que incorpora la incidencia de las políticas en la población trans que llegan a la vejez, hacemos el modelo con el porcentaje de implementación de cada política como escenarios de incertidumbre con el objetivo de concluir el impacto que las diversas políticas podrían llegar a tener en la población de ser implementadas.
library("deSolve")
library(ggplot2)
#Condiciones iniciales del modelo. Poblacion trans por grupo de edad
initial.conditions <- c(
ninos = 31755284,
jovenes = 10806690,
adultos = 62639330,
ancianos = 21128292,
jovenes_trans = 154460,
adultos_trans = 705063,
ancianos_trans = 49428 )
times <- seq(1,60, by = 1) #años
# VALORES DE INCERTIDUMBRE.
# POLITICAS
# Crear secuencias desde 0 hasta 1 con un paso de 25/100
x1 <- seq(0, 100/100, 25/100) # % de politicas
#ASIGNACION DE VARIABLES A VALORES
Xs<-expand.grid(list(politica_salud = x1,
politica_familiar = x1,
politica_prevencion = x1))
Xs$Run.ID <- 1:nrow(Xs)
out_all <- list()
#Establecemos el loop
for (i in 1:nrow(Xs))
{
parameters.Xs <- c(
tasa_natalidad_jovenes = (26.3/1000),
tasa_natalidad_adultos = (55.6/1000),
tasa_mortalidad_ninos = (12/1000),
tasa_mortalidad_jovenes = (70.3/100000),
tasa_mortalidad_adultos = (12/1000), #modificado, orginial de 9
tasa_mortalidad_ancianos = (654/100000),
duracion_ninos = 14,
duracion_jovenes = 4,
duracion_adultos = 36,
duracion_ancianos = 21,
esperanza_vida = 75,
#poblaicion trans
tasa_poblacion_trans = 0.9/100,
tasa_suicidio_jovenes = (8.04)/100,
tasa_suicidio_adultos = (28.61)/100,
tasa_suicidio_mayores = (1.35)/100,
tasa_homicidio_jovenes = (0.002)/100,
tasa_homicidio_adultos = (0.004)/100,
tasa_homicidio_mayores = (0.002)/100,
proporcion_consumacion_suicidio = 5/100,
#Betas problemas jovenes: obtenidos A PARTIR DE la regresión con regla de 3
B_eco_jovenes = 14/100,
B_fam_jovenes = 56/100,
B_sal_jovenes = 43/100,
B_esc_jovenes = 9/100,
B_tra_jovenes = 4/100,
B_ori_jovenes = 18/100,
B_gen_jovenes = 0/100, #negativo
B_otros_jovenes = 90/100,
#Betas problemas adultos: obtenidos con la regresión
B_eco_adultos = 51/100, #1.5148157
B_fam_adultos = 200/100, #3.0047786
B_sal_adultos = 150/100, #2.5281189
B_esc_adultos = 33/100,#1.3300710
B_tra_adultos = 14/100,#1.1415393
B_ori_adultos = 63/100,#1.6380943
B_gen_adultos = 0/100, #0.8891899 -1 = negativo
B_otros_adultos = 321/100, #4.2064484
#Betas problemas ancianos: obtenidos A PARTIR DE la regresión con regla de 3
B_eco_ancianos = 2/100,
B_fam_ancianos = 9/100,
B_sal_ancianos = 8/100,
B_esc_ancianos = 2/100,
B_tra_ancianos = 1/100,
B_ori_ancianos = 3/100,
B_gen_ancianos = 0/100, #negativo
B_otros_ancianos = 15/100,
# Problemas jovenes
problemas_economicos_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_economicos"]),
problemas_familiares_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_familiares"]),
problemas_salud_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_salud"]),
problemas_escuela_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_escuela"]),
problemas_trabajo_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_trabajo"]),
problemas_orientacion_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_orientacion"]),
problemas_genero_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_genero"]),
problemas_otros_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_otros"]),
# Problemas adultos
problemas_economicos_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_economicos"]),
problemas_familiares_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_familiares"]),
problemas_salud_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_salud"]),
problemas_escuela_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_escuela"]),
problemas_trabajo_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_trabajo"]),
problemas_orientacion_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_orientacion"]),
problemas_genero_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_genero"]),
problemas_otros_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_otros"]),
# Problemas ancianos
problemas_economicos_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_economicos"]),
problemas_familiares_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_familiares"]),
problemas_salud_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_salud"]),
problemas_escuela_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_escuela"]),
problemas_trabajo_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_trabajo"]),
problemas_orientacion_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_orientacion"]),
problemas_genero_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_genero"]),
problemas_otros_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_otros"]),
politica_familiar = Xs$politica_familiar[i],
politica_salud = Xs$politica_salud[i],
politica_prevencion = Xs$politica_prevencion[i]
)
#Se llena de abajo hacia arriba (primero variable de estado)
# Definir la función del modelo
model_suicidios_politicas <-function(t, state, parameters){
with(as.list(c(state, parameters)),{
#VARIABLES ENDOGENAS
efecto_politica_salud <- approx(
c(0, 25/100, 50/100, 75/100, 100/100), # x = politica_salud
c(0, 0.05, 0.1, 0.15, 0.2), # y = efecto_politica_salud
xout = politica_salud)$y # placeholder for xout
efecto_politica_familiar <- approx(
c(0, 25/100, 50/100, 75/100, 100/100), # x = politica_familiar
c(0, 0.05, 0.1, 0.15, 0.2), # y = efecto_politica_familiar
xout = politica_familiar)$y # placeholder for xout
efecto_politica_prevencion <- approx(
c(0, 25/100, 50/100, 75/100, 100/100), # x = politica_prevencion
c(0, 0.1, 0.2, 0.3, 0.4), # y = efecto_politica_prevencion
xout = politica_prevencion)$y # placeholder for xout
# Problemas jovenes
problemas_familiares_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_familiares"]) * (1-efecto_politica_familiar)
problemas_salud_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_salud"]) - efecto_politica_salud
problemas_orientacion_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_orientacion"]) * (1-efecto_politica_familiar)
problemas_genero_jovenes = unlist(promedios_problemas[promedios_problemas$rango_edad == "jovenes", "problemas_genero"])* (efecto_politica_familiar)* (1-efecto_politica_salud)
# Problemas adultos
problemas_salud_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_salud"]) * (1-efecto_politica_salud)
problemas_genero_adultos = unlist(promedios_problemas[promedios_problemas$rango_edad == "adultos", "problemas_genero"]) * (1-efecto_politica_salud)
# Problemas ancianos
problemas_salud_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_salud"]) *(1-efecto_politica_salud)
problemas_genero_ancianos = unlist(promedios_problemas[promedios_problemas$rango_edad == "ancianos", "problemas_genero"]) * (1-efecto_politica_salud)
prob_intento_jovenes <- (B_eco_jovenes*problemas_economicos_jovenes +
B_fam_jovenes*problemas_familiares_jovenes +
B_sal_jovenes*problemas_salud_jovenes +
B_esc_jovenes * problemas_escuela_jovenes +
B_tra_jovenes * problemas_trabajo_jovenes +
B_ori_jovenes * problemas_orientacion_jovenes +
B_gen_jovenes * problemas_genero_jovenes +
B_otros_jovenes * problemas_otros_jovenes) * (1-efecto_politica_prevencion)
intento_suicidio_jovenes <- prob_intento_jovenes * jovenes_trans
suicidio_jovenes_trans <- intento_suicidio_jovenes * proporcion_consumacion_suicidio
prob_intento_adultos <- B_eco_adultos*problemas_economicos_adultos +
B_fam_adultos*problemas_familiares_adultos +
B_sal_adultos*problemas_salud_adultos +
B_esc_adultos * problemas_escuela_adultos +
B_tra_adultos * problemas_trabajo_adultos +
B_ori_adultos * problemas_orientacion_adultos +
B_gen_adultos * problemas_genero_adultos +
B_otros_adultos * problemas_otros_adultos * (1-efecto_politica_prevencion)
intento_suicidio_adultos <- prob_intento_adultos * adultos_trans
suicidio_adultos_trans <- intento_suicidio_adultos * proporcion_consumacion_suicidio
prob_intento_ancianos <- B_eco_ancianos*problemas_economicos_ancianos +
B_fam_ancianos*problemas_familiares_ancianos +
B_sal_ancianos*problemas_salud_ancianos +
B_esc_ancianos * problemas_escuela_ancianos +
B_tra_ancianos * problemas_trabajo_ancianos +
B_ori_ancianos * problemas_orientacion_ancianos +
B_gen_ancianos * problemas_genero_ancianos +
B_otros_ancianos * problemas_otros_ancianos * (1-efecto_politica_prevencion)
intento_suicidio_ancianos <- prob_intento_ancianos * ancianos_trans
suicidio_ancianos_trans <- intento_suicidio_ancianos * proporcion_consumacion_suicidio
homicidio_jovenes_trans = jovenes_trans * tasa_homicidio_jovenes
homicidio_adultos_trans = adultos_trans * tasa_homicidio_adultos
homicidio_ancianos_trans = ancianos_trans * tasa_homicidio_mayores
poblacion = ninos + jovenes + adultos + ancianos
poblacion_trans = jovenes_trans + adultos_trans + ancianos_trans
#VARIABLES FLUJO
nacimientos = (jovenes * tasa_natalidad_jovenes ) + (adultos * tasa_natalidad_adultos)
adolescencia = ninos / duracion_ninos
madurez = jovenes / duracion_jovenes
envejecimiento = adultos / duracion_adultos
muerte_ninos = (ninos * tasa_mortalidad_ninos)
muerte_jovenes = (jovenes * tasa_mortalidad_jovenes)
muerte_adultos = (adultos * tasa_mortalidad_adultos)
muerte_anciano = ancianos / (esperanza_vida - (duracion_ninos + duracion_jovenes + duracion_adultos))
#poblacion trans
autoidentificacion = tasa_poblacion_trans * jovenes
madurez_trans = jovenes_trans / duracion_jovenes
envejecimiento_trans = adultos_trans / duracion_adultos
muerte_jovenes_trans = (jovenes_trans * tasa_mortalidad_jovenes) + suicidio_jovenes_trans + homicidio_jovenes_trans
muerte_adultos_trans = (adultos_trans * tasa_mortalidad_adultos) + suicidio_adultos_trans + homicidio_adultos_trans
muerte_anciano_trans = ancianos_trans / (esperanza_vida - (duracion_ninos + duracion_jovenes + duracion_adultos)) + suicidio_ancianos_trans + homicidio_ancianos_trans
#VARIABLES ESTADO
dninos = nacimientos - adolescencia - muerte_ninos
djovenes = adolescencia - madurez - muerte_jovenes
dadultos = madurez - envejecimiento - muerte_adultos
dancianos = envejecimiento - muerte_anciano
djovenes_trans = autoidentificacion - madurez_trans - muerte_jovenes_trans
dadultos_trans = madurez_trans - envejecimiento_trans - muerte_adultos_trans
dancianos_trans = envejecimiento_trans - muerte_anciano_trans
#Devuelve los resultados de la variable de estado
return(list(c( dninos, djovenes, dadultos, dancianos, djovenes_trans, dadultos_trans, dancianos_trans),
nacimientos = nacimientos,
muerte_anciano = muerte_anciano,
poblacion = poblacion,
poblacion_trans = poblacion_trans
))
})
}
# 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 = initial.conditions, #condiciones iniciales
times = times, #tiempo de simulación
func = model_suicidios_politicas, #función del modelo
parms = parameters.Xs,
method = intg.method
)
out <- as.data.frame(out)
#agregar columna al dataframe
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])
}
out_all <- do.call("rbind", out_all)
dim(out_all)
## [1] 7500 13
out_all <- merge(out_all, Xs, by="Run.ID")
dim(out_all)
## [1] 7500 16
#Resultados
ggplot(out_all,aes(x=time,y=ancianos_trans,group=Run.ID, colour=politica_salud))+
geom_line()+
scale_color_gradient(low = "pink", high = "skyblue")
ggplot(out_all,aes(x=time,y=ancianos_trans,group=Run.ID, colour=politica_prevencion))+
geom_line()+
scale_color_gradient(low = "pink", high = "skyblue")
ggplot(out_all,aes(x=time,y=ancianos_trans,group=Run.ID, colour=politica_familiar))+
geom_line()+
scale_color_gradient(low = "pink", high = "skyblue")
Los resultados indican que la política que tiene un impacto más significativo en la cantidad de personas trans que llegan a la vejez es la política de prevención de suicidio y la política de salud. La política familiar no tiene mucho impacto en la población trans que llega a la vejez