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?

Describiendo nuestro modelo

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:

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:

Modelo básico de homicidios y suicidios

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.

Parámetros

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.

Incertidumbres

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.

Regresión

¿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

Modelo con desglose de suicidios

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.

Parámetros

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.

Incertidumbres en los problemas que conducen al suicidio

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.

Impacto de políticas propuestas

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

“Centros de Apoyo Familiar”

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

Capacitación para Atención Respetuosa y Competente a la Comunidad Trans

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

Programa de ayuda 24/7

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