#install.packages("remotes")
#install.packages("rstan", repos = c("https://mc-stan.org/r-packages/", getOption("repos")))
#remotes::install_github("timriffe/DemoTools")
library("remotes")
library("DemoToolsData")
library("dplyr")
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
El estudio titulado “Proyecciones de Población: Análisis de los efectos de cambios en los valores iniciales y supuestos en los indicadores de Fecundidad, Mortalidad y Migraciones” busca examinar cómo las variaciones en los principales determinantes demográficos afectan las proyecciones de población. Las proyecciones poblacionales son herramientas fundamentales en la planificación de políticas públicas, pues permiten anticipar necesidades futuras en áreas como educación, salud y servicios básicos. Sin embargo, la precisión de estas proyecciones depende en gran medida de los valores y supuestos que se establecen al inicio del proceso. Este estudio se centra en el análisis de tres indicadores clave: fecundidad, mortalidad y migraciones. Estos factores constituyen los pilares de la dinámica poblacional y están sujetos a variaciones derivadas de cambios en las políticas sociales, condiciones económicas, y otros eventos que influyen en el comportamiento demográfico. A través del uso de herramientas como Excel, se analizarán los efectos de realizar ajustes en los valores iniciales y supuestos relacionados con estos indicadores, permitiendo así explorar diferentes escenarios y evaluar su impacto en la población futura.
El objetivo del estudio es demostrar la importancia del análisis de sensibilidad en las proyecciones de población, y cómo pequeños cambios en los valores iniciales pueden llevar a resultados significativamente distintos. Esto tiene implicaciones para la formulación de políticas, destacando la necesidad de considerar múltiples escenarios para garantizar una mejor planificación y toma de decisiones a nivel nacional o local.
La metodología utilizada en este estudio se basa en una adaptación del modelo genérico de la OIT para proyecciones de población, conocido como ILO-POP. Este modelo ha sido ajustado y trasladado a una hoja de cálculo en Excel, aprovechando las funcionalidades que ofrece esta herramienta para la vinculación de hojas y la incorporación de controles interactivos que facilitan el manejo de valores y parámetros.
La adaptación del modelo ILO-POP a Excel permite una mayor flexibilidad en el ajuste de los parámetros iniciales y supuestos, facilitando el análisis de diferentes escenarios de fecundidad, mortalidad y migraciones. Las hojas de cálculo se han configurado de manera que los usuarios puedan modificar de forma intuitiva los valores iniciales a través de botones de control, que permiten ajustar los parámetros y observar de inmediato los efectos en las proyecciones.
Además, la vinculación entre las distintas hojas de cálculo facilita el flujo de datos entre los diferentes componentes del modelo, garantizando la consistencia de la información y permitiendo realizar análisis dinámicos. Esta metodología no solo facilita la comprensión del impacto de los cambios en los parámetros, sino que también permite a los usuarios experimentar con diferentes combinaciones de supuestos para evaluar su impacto en las proyecciones poblacionales.
# Limpiar el entorno de trabajo
rm(list = ls()) # Eliminar todos los objetos del entorno
library(ggplot2)
# Limpiar la consola
cat("\014") # Limpiar la consola
# Cerrar todos los dispositivos gráficos
if (dev.cur() != 1) {
graphics.off()
}
# Establecer un nuevo directorio de trabajo si es necesario
# setwd("ruta/a/tu/directorio") # Descomenta y ajusta si es necesario
# Cargar librerías necesarias
library(dplyr)
# Establecer el número de observaciones
num_obs <- 3535
# Crear el data frame correctamente
data <- data.frame(
year = rep(seq(0, 100, length.out = 101), each = 35),
edad = rep(15:49, times = 101),
reftend = rep(seq(0, 100, length.out = 101), each = 35)
)
# Calcular la tasa global de fecundidad inicial y final
tgfi <- 3.1 # Tasa global de fecundidad inicial para 2020
tgff <- 1.96 # Tasa global de fecundidad final (depende de la tendencia)
# Añadir las columnas para las tasas de fecundidad al data frame
data <- data %>%
mutate(
tgfi = tgfi, # Tasa global de fecundidad inicial
tgff = tgff # Tasa global de fecundidad final
)
# Ordenar por edad
data <- data %>%
arrange(edad)
head(data)
## year edad reftend tgfi tgff
## 1 0 15 0 3.1 1.96
## 2 1 15 1 3.1 1.96
## 3 2 15 2 3.1 1.96
## 4 3 15 3 3.1 1.96
## 5 4 15 4 3.1 1.96
## 6 5 15 5 3.1 1.96
# Cargar librerías necesarias
library(dplyr)
# Establecer el número de observaciones
num_obs <- 3535
# Crear el data frame correctamente
data <- data.frame(
year = rep(seq(0, 100, length.out = 101), each = 35),
edad = rep(15:49, times = 101),
reftend = rep(seq(0, 100, length.out = 101), each = 35)
)
# Calcular la tasa global de fecundidad inicial y final
tgfi <- 3.1 # Tasa global de fecundidad inicial para 2020
tgff <- 1.96 # Tasa global de fecundidad final (depende de la tendencia)
# Añadir las columnas para las tasas de fecundidad al data frame
data <- data %>%
mutate(
tgfi = tgfi, # Tasa global de fecundidad inicial
tgff = tgff, # Tasa global de fecundidad final
tendencia = 2, # Definir la tendencia (1 - lineal, 2 - logístico, 3 - rápido, 4 - lento)
yearfinvar = 47 # Año objetivo menos año base
)
# Construcción de los factores para la tendencia
data <- data %>%
mutate(
factortend = case_when(
tendencia == 1 ~ pmin(year, yearfinvar) / yearfinvar,
tendencia == 2 ~ 0.5 * (1 - cos(pi * pmin(reftend, yearfinvar) / yearfinvar)),
tendencia == 3 ~ sin(pi * pmin(reftend, yearfinvar) / yearfinvar / 2),
tendencia == 4 ~ 1 - cos(pi * pmin(reftend, yearfinvar) / yearfinvar / 2),
TRUE ~ NA_real_
)
)
# Calculo de las TGF para los años siguientes
data <- data %>%
arrange(edad, year) %>%
group_by(edad) %>%
mutate(
tgf = (1 - factortend) * tgfi + tgff * factortend
) %>%
ungroup()
# Imprimir las primeras filas
data
## # A tibble: 3,535 × 9
## year edad reftend tgfi tgff tendencia yearfinvar factortend tgf
## <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0 15 0 3.1 1.96 2 47 0 3.1
## 2 1 15 1 3.1 1.96 2 47 0.00112 3.10
## 3 2 15 2 3.1 1.96 2 47 0.00446 3.09
## 4 3 15 3 3.1 1.96 2 47 0.0100 3.09
## 5 4 15 4 3.1 1.96 2 47 0.0178 3.08
## 6 5 15 5 3.1 1.96 2 47 0.0277 3.07
## 7 6 15 6 3.1 1.96 2 47 0.0397 3.05
## 8 7 15 7 3.1 1.96 2 47 0.0537 3.04
## 9 8 15 8 3.1 1.96 2 47 0.0698 3.02
## 10 9 15 9 3.1 1.96 2 47 0.0878 3.00
## # ℹ 3,525 more rows
# Definir la forma de la curva para la edad de procreación
edadreproc <- 2 # 1-tardío, 2-intermedio, 3-temprano
# Inicializar la columna tasareproc
data <- data %>%
mutate(tasareproc = case_when(
edadreproc == 1 & edad >= 15 & edad <= 19 ~ 0.07,
edadreproc == 1 & edad >= 20 & edad <= 24 ~ 0.17,
edadreproc == 1 & edad >= 25 & edad <= 29 ~ 0.26,
edadreproc == 1 & edad >= 30 & edad <= 34 ~ 0.25,
edadreproc == 1 & edad >= 35 & edad <= 39 ~ 0.20,
edadreproc == 1 & edad >= 40 & edad <= 44 ~ 0.05,
edadreproc == 1 & edad >= 45 & edad <= 49 ~ 0,
edadreproc == 2 & edad >= 15 & edad <= 19 ~ 0.12,
edadreproc == 2 & edad >= 20 & edad <= 24 ~ 0.31,
edadreproc == 2 & edad >= 25 & edad <= 29 ~ 0.31,
edadreproc == 2 & edad >= 30 & edad <= 34 ~ 0.16,
edadreproc == 2 & edad >= 35 & edad <= 39 ~ 0.08,
edadreproc == 2 & edad >= 40 & edad <= 44 ~ 0.02,
edadreproc == 2 & edad >= 45 & edad <= 49 ~ 0,
edadreproc == 3 & edad >= 15 & edad <= 19 ~ 0.20,
edadreproc == 3 & edad >= 20 & edad <= 24 ~ 0.40,
edadreproc == 3 & edad >= 25 & edad <= 29 ~ 0.25,
edadreproc == 3 & edad >= 30 & edad <= 34 ~ 0.10,
edadreproc == 3 & edad >= 35 & edad <= 39 ~ 0.04,
edadreproc == 3 & edad >= 40 & edad <= 44 ~ 0.01,
edadreproc == 3 & edad >= 45 & edad <= 49 ~ 0
))
# Imprimir las primeras filas
data
## # A tibble: 3,535 × 10
## year edad reftend tgfi tgff tendencia yearfinvar factortend tgf
## <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0 15 0 3.1 1.96 2 47 0 3.1
## 2 1 15 1 3.1 1.96 2 47 0.00112 3.10
## 3 2 15 2 3.1 1.96 2 47 0.00446 3.09
## 4 3 15 3 3.1 1.96 2 47 0.0100 3.09
## 5 4 15 4 3.1 1.96 2 47 0.0178 3.08
## 6 5 15 5 3.1 1.96 2 47 0.0277 3.07
## 7 6 15 6 3.1 1.96 2 47 0.0397 3.05
## 8 7 15 7 3.1 1.96 2 47 0.0537 3.04
## 9 8 15 8 3.1 1.96 2 47 0.0698 3.02
## 10 9 15 9 3.1 1.96 2 47 0.0878 3.00
## # ℹ 3,525 more rows
## # ℹ 1 more variable: tasareproc <dbl>
# Agrupación de las edades en tramos quinquenales
data <- data %>%
mutate(gq = case_when(
edad >= 0 & edad <= 4 ~ 0,
edad >= 5 & edad <= 9 ~ 1,
edad >= 10 & edad <= 14 ~ 2,
edad >= 15 & edad <= 19 ~ 3,
edad >= 20 & edad <= 24 ~ 4,
edad >= 25 & edad <= 29 ~ 5,
edad >= 30 & edad <= 34 ~ 6,
edad >= 35 & edad <= 39 ~ 7,
edad >= 40 & edad <= 44 ~ 8,
edad >= 45 & edad <= 49 ~ 9,
edad >= 50 & edad <= 54 ~ 10,
edad >= 55 & edad <= 59 ~ 11,
edad >= 60 & edad <= 64 ~ 12,
edad >= 65 & edad <= 69 ~ 13,
edad >= 70 & edad <= 74 ~ 14,
edad >= 75 & edad <= 79 ~ 15,
edad >= 80 & edad <= 84 ~ 16,
edad >= 85 ~ 17
))
# Etiquetar la variable gq
data <- data %>%
mutate(gq = factor(gq,
levels = 0:17,
labels = c("0 a 4", "5 a 9", "10 a 14", "15 a 19",
"20 a 24", "25 a 29", "30 a 34",
"35 a 39", "40 a 44", "45 a 49",
"50 a 54", "55 a 59", "60 a 64",
"65 a 69", "70 a 74", "75 a 79",
"80 a 84", "85 y más")))
# Imprimir las primeras filas
print(head(data))
## # A tibble: 6 × 11
## year edad reftend tgfi tgff tendencia yearfinvar factortend tgf
## <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0 15 0 3.1 1.96 2 47 0 3.1
## 2 1 15 1 3.1 1.96 2 47 0.00112 3.10
## 3 2 15 2 3.1 1.96 2 47 0.00446 3.09
## 4 3 15 3 3.1 1.96 2 47 0.0100 3.09
## 5 4 15 4 3.1 1.96 2 47 0.0178 3.08
## 6 5 15 5 3.1 1.96 2 47 0.0277 3.07
## # ℹ 2 more variables: tasareproc <dbl>, gq <fct>
# Crear gq_cod a partir de gq, asignando códigos numéricos
data <- data %>%
mutate(gq_cod = case_when(
gq == "0 a 4" ~ 0,
gq == "5 a 9" ~ 1,
gq == "10 a 14" ~ 2,
gq == "15 a 19" ~ 3,
gq == "20 a 24" ~ 4,
gq == "25 a 29" ~ 5,
gq == "30 a 34" ~ 6,
gq == "35 a 39" ~ 7,
gq == "40 a 44" ~ 8,
gq == "45 a 49" ~ 9,
gq == "50 a 54" ~ 10,
gq == "55 a 59" ~ 11,
gq == "60 a 64" ~ 12,
gq == "65 a 69" ~ 13,
gq == "70 a 74" ~ 14,
gq == "75 a 79" ~ 15,
gq == "80 a 84" ~ 16,
gq == "85 y más" ~ 17,
TRUE ~ NA_real_ # Asigna NA si no coincide con ningún grupo
))
library(dplyr)
library(ggplot2)
# Asegurarse de que el data frame 'data' existe y contiene la columna 'year'
if (!exists("data") || !"year" %in% colnames(data)) {
stop("El data frame 'data' o la columna 'year' no existen.")
}
# Ordenar los datos y calcular 'tgfigq' y 'tgffgq'
data <- data %>%
arrange(year, edad) %>%
mutate(
tgfigq = case_when(
gq_cod %in% 3:9 ~ (tasareproc / 5) * tgfi,
TRUE ~ NA_real_
),
tgffgq = case_when(
gq_cod %in% 3:9 ~ (tasareproc / 5) * tgff,
TRUE ~ NA_real_
)
)
# Filtrar los datos para el año 0
data_year_zero <- subset(data, year == 0)
# Filtrar los datos para el año final (100)
data_year_final <- subset(data, year == 100)
# Verificar si hay valores válidos para tgfigq
max_tgfigq <- max(data_year_zero$tgfigq, na.rm = TRUE)
# Si max_tgfigq es NA, establecer un valor predeterminado para el eje y
if (is.na(max_tgfigq) || max_tgfigq == -Inf) {
max_tgfigq <- 1 # Valor predeterminado (ajusta según sea necesario)
}
# Gráfica para el año 0 con la tasa de fecundidad en el año final
tgfigq_plot <- ggplot() +
geom_point(data = data_year_zero, aes(x = edad, y = tgfigq, color = factor(gq)), size = 1) +
geom_point(data = data_year_final, aes(x = edad, y = tgffgq, fill = factor(gq)), stat = "identity", alpha = 0.5) +
scale_y_continuous(breaks = seq(0, max_tgfigq, 0.01), limits = c(0, max_tgfigq)) + # Limitar y ajustar los ticks
scale_x_continuous(breaks = seq(15, 49, 2)) +
labs(
title = "Tasa Global de Fecundidad por Edad (Año 0 y Año Final)",
x = "Edad",
y = "Tasa Global de Fecundidad",
color = "Grupos Quinquenales",
fill = "Grupos Quinquenales"
) +
theme_minimal() +
theme(legend.position = "bottom")
# Mostrar la gráfica
print(tgfigq_plot)
data
## # A tibble: 3,535 × 14
## year edad reftend tgfi tgff tendencia yearfinvar factortend tgf
## <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0 15 0 3.1 1.96 2 47 0 3.1
## 2 0 16 0 3.1 1.96 2 47 0 3.1
## 3 0 17 0 3.1 1.96 2 47 0 3.1
## 4 0 18 0 3.1 1.96 2 47 0 3.1
## 5 0 19 0 3.1 1.96 2 47 0 3.1
## 6 0 20 0 3.1 1.96 2 47 0 3.1
## 7 0 21 0 3.1 1.96 2 47 0 3.1
## 8 0 22 0 3.1 1.96 2 47 0 3.1
## 9 0 23 0 3.1 1.96 2 47 0 3.1
## 10 0 24 0 3.1 1.96 2 47 0 3.1
## # ℹ 3,525 more rows
## # ℹ 5 more variables: tasareproc <dbl>, gq <fct>, gq_cod <dbl>, tgfigq <dbl>,
## # tgffgq <dbl>
# Tasa de fertilidad por edades simples (SPRAGUES)
# Inicializar beta1
data <- data %>%
mutate(beta1 = NA_real_) %>%
mutate(beta1 = case_when(
edad == 15 ~ 0.3616,
edad == 16 ~ 0.264,
edad == 17 ~ 0.184,
edad == 18 ~ 0.12,
edad == 19 ~ 0.0704,
edad == 20 ~ 0.0336,
edad == 21 ~ 0.008,
edad == 22 ~ -0.008,
edad == 23 ~ -0.016,
edad == 24 ~ -0.0176,
edad == 25 ~ -0.0128,
edad == 26 ~ -0.0016,
edad == 27 ~ 0.0064,
edad == 28 ~ 0.0064,
edad == 29 ~ 0.0016,
edad == 30 ~ -0.0128,
edad == 31 ~ -0.0016,
edad == 32 ~ 0.0064,
edad == 33 ~ 0.0064,
edad == 34 ~ 0.0016,
edad == 35 ~ -0.0128,
edad == 36 ~ -0.0016,
edad == 37 ~ 0.0064,
edad == 38 ~ 0.0064,
edad == 39 ~ 0.0016,
edad == 40 ~ -0.0176,
edad == 41 ~ -0.016,
edad == 42 ~ -0.008,
edad == 43 ~ 0.008,
edad == 44 ~ 0.0336,
edad == 45 ~ 0.0704,
edad == 46 ~ 0.12,
edad == 47 ~ 0.184,
edad == 48 ~ 0.264,
edad == 49 ~ 0.3616,
TRUE ~ beta1 # Mantener NA para otras edades
))
# Inicializar beta2
data <- data %>%
mutate(beta2 = NA_real_) %>%
mutate(beta2 = case_when(
edad == 15 ~ -0.2768,
edad == 16 ~ -0.096,
edad == 17 ~ 0.04,
edad == 18 ~ 0.136,
edad == 19 ~ 0.1968,
edad == 20 ~ 0.2272,
edad == 21 ~ 0.232,
edad == 22 ~ 0.216,
edad == 23 ~ 0.184,
edad == 24 ~ 0.1408,
edad == 25 ~ 0.0848,
edad == 26 ~ 0.0144,
edad == 27 ~ -0.0336,
edad == 28 ~ -0.0416,
edad == 29 ~ -0.024,
edad == 30 ~ 0.0848,
edad == 31 ~ 0.0144,
edad == 32 ~ -0.0336,
edad == 33 ~ -0.0416,
edad == 34 ~ -0.024,
edad == 35 ~ 0.0848,
edad == 36 ~ 0.0144,
edad == 37 ~ -0.0336,
edad == 38 ~ -0.0416,
edad == 39 ~ -0.024,
edad == 40 ~ 0.1408,
edad == 41 ~ 0.184,
edad == 42 ~ 0.216,
edad == 43 ~ 0.232,
edad == 44 ~ 0.2272,
edad == 45 ~ 0.1968,
edad == 46 ~ 0.136,
edad == 47 ~ 0.04,
edad == 48 ~ -0.096,
edad == 49 ~ -0.2768,
TRUE ~ beta2 # Mantener NA para otras edades
))
# Inicializar beta3
data <- data %>%
mutate(beta3 = NA_real_) %>%
mutate(beta3 = case_when(
edad == 15 ~ 0.1488,
edad == 16 ~ 0.04,
edad == 17 ~ -0.032,
edad == 18 ~ -0.072,
edad == 19 ~ -0.0848,
edad == 20 ~ -0.0752,
edad == 21 ~ -0.048,
edad == 22 ~ -0.008,
edad == 23 ~ 0.04,
edad == 24 ~ 0.0912,
edad == 25 ~ 0.1504,
edad == 26 ~ 0.2224,
edad == 27 ~ 0.2544,
edad == 28 ~ 0.2224,
edad == 29 ~ 0.1504,
edad == 30 ~ 0.1504,
edad == 31 ~ 0.2224,
edad == 32 ~ 0.2544,
edad == 33 ~ 0.2224,
edad == 34 ~ 0.1504,
edad == 35 ~ 0.1504,
edad == 36 ~ 0.2224,
edad == 37 ~ 0.2544,
edad == 38 ~ 0.2224,
edad == 39 ~ 0.1504,
edad == 40 ~ 0.0912,
edad == 41 ~ 0.04,
edad == 42 ~ -0.008,
edad == 43 ~ -0.048,
edad == 44 ~ -0.0752,
edad == 45 ~ -0.0848,
edad == 46 ~ -0.072,
edad == 47 ~ -0.032,
edad == 48 ~ 0.04,
edad == 49 ~ 0.1488,
TRUE ~ beta3 # Mantener NA para otras edades
))
# Inicializar beta4
data <- data %>%
mutate(beta4 = NA_real_) %>%
mutate(beta4 = case_when(
edad == 15 ~ -0.0336,
edad == 16 ~ -0.008,
edad == 17 ~ 0.008,
edad == 18 ~ 0.016,
edad == 19 ~ 0.0176,
edad == 20 ~ 0.0144,
edad == 21 ~ 0.008,
edad == 22 ~ 0,
edad == 23 ~ -0.008,
edad == 24 ~ -0.0144,
edad == 25 ~ -0.024,
edad == 26 ~ -0.0416,
edad == 27 ~ -0.0336,
edad == 28 ~ 0.0144,
edad == 29 ~ 0.0848,
edad == 30 ~ -0.024,
edad == 31 ~ -0.0416,
edad == 32 ~ -0.0336,
edad == 33 ~ 0.0144,
edad == 34 ~ 0.0848,
edad == 35 ~ -0.024,
edad == 36 ~ -0.0416,
edad == 37 ~ -0.0336,
edad == 38 ~ 0.0144,
edad == 39 ~ 0.0848,
edad == 40 ~ -0.0144,
edad == 41 ~ -0.008,
edad == 42 ~ 0,
edad == 43 ~ 0.008,
edad == 44 ~ 0.0144,
edad == 45 ~ 0.0176,
edad == 46 ~ 0.016,
edad == 47 ~ 0.008,
edad == 48 ~ -0.008,
edad == 49 ~ -0.0336,
TRUE ~ beta4 # Mantener NA para otras edades
))
# Inicializar beta5
data <- data %>%
mutate(beta5 = NA_real_) %>%
mutate(beta5 = case_when(
edad == 15 ~ 0,
edad == 16 ~ 0,
edad == 17 ~ 0,
edad == 18 ~ 0,
edad == 19 ~ 0,
edad == 20 ~ 0,
edad == 21 ~ 0,
edad == 22 ~ 0,
edad == 23 ~ 0,
edad == 24 ~ 0,
edad == 25 ~ 0.0016,
edad == 26 ~ 0.0064,
edad == 27 ~ 0.0064,
edad == 28 ~ -0.0016,
edad == 29 ~ -0.0128,
edad == 30 ~ 0.0016,
edad == 31 ~ 0.0064,
edad == 32 ~ 0.0064,
edad == 33 ~ -0.0016,
edad == 34 ~ -0.0128,
edad == 35 ~ 0.0016,
edad == 36 ~ 0.0064,
edad == 37 ~ 0.0064,
edad == 38 ~ -0.0016,
edad == 39 ~ -0.0128,
edad == 40 ~ 0,
edad == 41 ~ 0,
edad == 42 ~ 0,
edad == 43 ~ 0,
edad == 44 ~ 0,
edad == 45 ~ 0,
edad == 46 ~ 0,
edad == 47 ~ 0,
edad == 48 ~ 0,
edad == 49 ~ 0,
TRUE ~ beta5 # Mantener NA para otras edades
))
# Ordenar por año y edad
data <- data %>%
arrange(year, edad)
# Calcular las tasas de fecundidad máxima por grupos quinquenales
tgfigq_summary <- data %>%
group_by(gq_cod) %>%
summarise(
tgfigq3 = max(tgfigq[gq_cod == 3], na.rm = TRUE),
tgfigq4 = max(tgfigq[gq_cod == 4], na.rm = TRUE),
tgfigq5 = max(tgfigq[gq_cod == 5], na.rm = TRUE),
tgfigq6 = max(tgfigq[gq_cod == 6], na.rm = TRUE),
tgfigq7 = max(tgfigq[gq_cod == 7], na.rm = TRUE),
tgfigq8 = max(tgfigq[gq_cod == 8], na.rm = TRUE),
tgfigq9 = max(tgfigq[gq_cod == 9], na.rm = TRUE),
.groups = 'drop'
)
## Warning: There were 42 warnings in `summarise()`.
## The first warning was:
## ℹ In argument: `tgfigq3 = max(tgfigq[gq_cod == 3], na.rm = TRUE)`.
## ℹ In group 2: `gq_cod = 4`.
## Caused by warning in `max()`:
## ! no non-missing arguments to max; returning -Inf
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 41 remaining warnings.
# Verificar la estructura del resumen
str(tgfigq_summary)
## tibble [7 × 8] (S3: tbl_df/tbl/data.frame)
## $ gq_cod : num [1:7] 3 4 5 6 7 8 9
## $ tgfigq3: num [1:7] 0.0744 -Inf -Inf -Inf -Inf ...
## $ tgfigq4: num [1:7] -Inf 0.192 -Inf -Inf -Inf ...
## $ tgfigq5: num [1:7] -Inf -Inf 0.192 -Inf -Inf ...
## $ tgfigq6: num [1:7] -Inf -Inf -Inf 0.0992 -Inf ...
## $ tgfigq7: num [1:7] -Inf -Inf -Inf -Inf 0.0496 ...
## $ tgfigq8: num [1:7] -Inf -Inf -Inf -Inf -Inf ...
## $ tgfigq9: num [1:7] -Inf -Inf -Inf -Inf -Inf ...
# Imprimir las primeras filas del resumen
print(head(tgfigq_summary))
## # A tibble: 6 × 8
## gq_cod tgfigq3 tgfigq4 tgfigq5 tgfigq6 tgfigq7 tgfigq8 tgfigq9
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 3 0.0744 -Inf -Inf -Inf -Inf -Inf -Inf
## 2 4 -Inf 0.192 -Inf -Inf -Inf -Inf -Inf
## 3 5 -Inf -Inf 0.192 -Inf -Inf -Inf -Inf
## 4 6 -Inf -Inf -Inf 0.0992 -Inf -Inf -Inf
## 5 7 -Inf -Inf -Inf -Inf 0.0496 -Inf -Inf
## 6 8 -Inf -Inf -Inf -Inf -Inf 0.0124 -Inf
# Agregar los valores máximos a data sin duplicar gq_cod
data <- data %>%
left_join(tgfigq_summary, by = "gq_cod") # Usar gq_cod como clave para la unión
# Agregar los valores máximos a data sin duplicar gq_cod
data
## # A tibble: 3,535 × 26
## year edad reftend tgfi tgff tendencia yearfinvar factortend tgf
## <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0 15 0 3.1 1.96 2 47 0 3.1
## 2 0 16 0 3.1 1.96 2 47 0 3.1
## 3 0 17 0 3.1 1.96 2 47 0 3.1
## 4 0 18 0 3.1 1.96 2 47 0 3.1
## 5 0 19 0 3.1 1.96 2 47 0 3.1
## 6 0 20 0 3.1 1.96 2 47 0 3.1
## 7 0 21 0 3.1 1.96 2 47 0 3.1
## 8 0 22 0 3.1 1.96 2 47 0 3.1
## 9 0 23 0 3.1 1.96 2 47 0 3.1
## 10 0 24 0 3.1 1.96 2 47 0 3.1
## # ℹ 3,525 more rows
## # ℹ 17 more variables: tasareproc <dbl>, gq <fct>, gq_cod <dbl>, tgfigq <dbl>,
## # tgffgq <dbl>, beta1 <dbl>, beta2 <dbl>, beta3 <dbl>, beta4 <dbl>,
## # beta5 <dbl>, tgfigq3 <dbl>, tgfigq4 <dbl>, tgfigq5 <dbl>, tgfigq6 <dbl>,
## # tgfigq7 <dbl>, tgfigq8 <dbl>, tgfigq9 <dbl>
# Calcular las tasas de fecundidad máxima final por grupos quinquenales
tgffgq_summary <- data %>%
group_by(gq_cod) %>%
summarise(
tgffgq3 = ifelse(any(gq_cod == 3), max(tgffgq[gq_cod == 3], na.rm = TRUE), NA_real_),
tgffgq4 = ifelse(any(gq_cod == 4), max(tgffgq[gq_cod == 4], na.rm = TRUE), NA_real_),
tgffgq5 = ifelse(any(gq_cod == 5), max(tgffgq[gq_cod == 5], na.rm = TRUE), NA_real_),
tgffgq6 = ifelse(any(gq_cod == 6), max(tgffgq[gq_cod == 6], na.rm = TRUE), NA_real_),
tgffgq7 = ifelse(any(gq_cod == 7), max(tgffgq[gq_cod == 7], na.rm = TRUE), NA_real_),
tgffgq8 = ifelse(any(gq_cod == 8), max(tgffgq[gq_cod == 8], na.rm = TRUE), NA_real_),
tgffgq9 = ifelse(any(gq_cod == 9), max(tgffgq[gq_cod == 9], na.rm = TRUE), NA_real_),
.groups = 'drop'
)
# Agregar los valores máximos a data sin duplicar gq_cod
data <- data %>%
left_join(tgffgq_summary, by = "gq_cod") # Usar gq_cod como clave para la unión
data
## # A tibble: 3,535 × 33
## year edad reftend tgfi tgff tendencia yearfinvar factortend tgf
## <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0 15 0 3.1 1.96 2 47 0 3.1
## 2 0 16 0 3.1 1.96 2 47 0 3.1
## 3 0 17 0 3.1 1.96 2 47 0 3.1
## 4 0 18 0 3.1 1.96 2 47 0 3.1
## 5 0 19 0 3.1 1.96 2 47 0 3.1
## 6 0 20 0 3.1 1.96 2 47 0 3.1
## 7 0 21 0 3.1 1.96 2 47 0 3.1
## 8 0 22 0 3.1 1.96 2 47 0 3.1
## 9 0 23 0 3.1 1.96 2 47 0 3.1
## 10 0 24 0 3.1 1.96 2 47 0 3.1
## # ℹ 3,525 more rows
## # ℹ 24 more variables: tasareproc <dbl>, gq <fct>, gq_cod <dbl>, tgfigq <dbl>,
## # tgffgq <dbl>, beta1 <dbl>, beta2 <dbl>, beta3 <dbl>, beta4 <dbl>,
## # beta5 <dbl>, tgfigq3 <dbl>, tgfigq4 <dbl>, tgfigq5 <dbl>, tgfigq6 <dbl>,
## # tgfigq7 <dbl>, tgfigq8 <dbl>, tgfigq9 <dbl>, tgffgq3 <dbl>, tgffgq4 <dbl>,
## # tgffgq5 <dbl>, tgffgq6 <dbl>, tgffgq7 <dbl>, tgffgq8 <dbl>, tgffgq9 <dbl>
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ lubridate 1.9.3 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.1
## ✔ readr 2.1.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dplyr)
# Paso 1: Asignar beta1 a beta5 basado en 'edad'
data <- data %>%
mutate(
beta1 = case_when(
edad == 15 ~ 0.3616,
edad == 16 ~ 0.264,
edad == 17 ~ 0.184,
edad == 18 ~ 0.12,
edad == 19 ~ 0.0704,
edad == 20 ~ 0.0336,
edad == 21 ~ 0.008,
edad == 22 ~ -0.008,
edad == 23 ~ -0.016,
edad == 24 ~ -0.0176,
edad == 25 ~ -0.0128,
edad == 26 ~ -0.0016,
edad == 27 ~ 0.0064,
edad == 28 ~ 0.0064,
edad == 29 ~ 0.0016,
edad == 30 ~ -0.0128,
edad == 31 ~ -0.0016,
edad == 32 ~ 0.0064,
edad == 33 ~ 0.0064,
edad == 34 ~ 0.0016,
edad == 35 ~ -0.0128,
edad == 36 ~ -0.0016,
edad == 37 ~ 0.0064,
edad == 38 ~ 0.0064,
edad == 39 ~ 0.0016,
edad == 40 ~ -0.0176,
edad == 41 ~ -0.016,
edad == 42 ~ -0.008,
edad == 43 ~ 0.008,
edad == 44 ~ 0.0336,
edad == 45 ~ 0.0704,
edad == 46 ~ 0.12,
edad == 47 ~ 0.184,
edad == 48 ~ 0.264,
edad == 49 ~ 0.3616,
TRUE ~ NA_real_
),
beta2 = case_when(
edad == 15 ~ -0.2768,
edad == 16 ~ -0.096,
edad == 17 ~ 0.04,
edad == 18 ~ 0.136,
edad == 19 ~ 0.1968,
edad == 20 ~ 0.2272,
edad == 21 ~ 0.232,
edad == 22 ~ 0.216,
edad == 23 ~ 0.184,
edad == 24 ~ 0.1408,
edad == 25 ~ 0.0848,
edad == 26 ~ 0.0144,
edad == 27 ~ -0.0336,
edad == 28 ~ -0.0416,
edad == 29 ~ -0.024,
edad == 30 ~ 0.0848,
edad == 31 ~ 0.0144,
edad == 32 ~ -0.0336,
edad == 33 ~ -0.0416,
edad == 34 ~ -0.024,
edad == 35 ~ 0.0848,
edad == 36 ~ 0.0144,
edad == 37 ~ -0.0336,
edad == 38 ~ -0.0416,
edad == 39 ~ -0.024,
edad == 40 ~ 0.1408,
edad == 41 ~ 0.184,
edad == 42 ~ 0.216,
edad == 43 ~ 0.232,
edad == 44 ~ 0.2272,
edad == 45 ~ 0.1968,
edad == 46 ~ 0.136,
edad == 47 ~ 0.04,
edad == 48 ~ -0.096,
edad == 49 ~ -0.2768,
TRUE ~ NA_real_
),
beta3 = case_when(
edad == 15 ~ 0.1488,
edad == 16 ~ 0.04,
edad == 17 ~ -0.032,
edad == 18 ~ -0.072,
edad == 19 ~ -0.0848,
edad == 20 ~ -0.0752,
edad == 21 ~ -0.048,
edad == 22 ~ -0.008,
edad == 23 ~ 0.04,
edad == 24 ~ 0.0912,
edad == 25 ~ 0.1504,
edad == 26 ~ 0.2224,
edad == 27 ~ 0.2544,
edad == 28 ~ 0.2224,
edad == 29 ~ 0.1504,
edad == 30 ~ 0.1504,
edad == 31 ~ 0.2224,
edad == 32 ~ 0.2544,
edad == 33 ~ 0.2224,
edad == 34 ~ 0.1504,
edad == 35 ~ 0.1504,
edad == 36 ~ 0.2224,
edad == 37 ~ 0.2544,
edad == 38 ~ 0.2224,
edad == 39 ~ 0.1504,
edad == 40 ~ 0.0912,
edad == 41 ~ 0.04,
edad == 42 ~ -0.008,
edad == 43 ~ -0.048,
edad == 44 ~ -0.0752,
edad == 45 ~ -0.0848,
edad == 46 ~ -0.072,
edad == 47 ~ -0.032,
edad == 48 ~ 0.04,
edad == 49 ~ 0.1488,
TRUE ~ NA_real_
),
beta4 = case_when(
edad == 15 ~ -0.0336,
edad == 16 ~ -0.008,
edad == 17 ~ 0.008,
edad == 18 ~ 0.016,
edad == 19 ~ 0.0176,
edad == 20 ~ 0.0144,
edad == 21 ~ 0.008,
edad == 22 ~ 0,
edad == 23 ~ -0.008,
edad == 24 ~ -0.0144,
edad == 25 ~ -0.024,
edad == 26 ~ -0.0416,
edad == 27 ~ -0.0336,
edad == 28 ~ 0.0144,
edad == 29 ~ 0.0848,
edad == 30 ~ -0.024,
edad == 31 ~ -0.0416,
edad == 32 ~ -0.0336,
edad == 33 ~ 0.0144,
edad == 34 ~ 0.0848,
edad == 35 ~ -0.024,
edad == 36 ~ -0.0416,
edad == 37 ~ -0.0336,
edad == 38 ~ 0.0144,
edad == 39 ~ 0.0848,
edad == 40 ~ -0.0144,
edad == 41 ~ -0.008,
edad == 42 ~ 0,
edad == 43 ~ 0.008,
edad == 44 ~ 0.0144,
edad == 45 ~ 0.0176,
edad == 46 ~ 0.016,
edad == 47 ~ 0.008,
edad == 48 ~ -0.008,
edad == 49 ~ -0.0336,
TRUE ~ NA_real_
),
beta5 = case_when(
edad >= 15 & edad <= 24 ~ 0,
edad == 25 ~ 0.0016,
edad == 26 ~ 0.0064,
edad == 27 ~ 0.0064,
edad == 28 ~ -0.0016,
edad == 29 ~ -0.0128,
edad == 30 ~ 0.0016,
edad == 31 ~ 0.0064,
edad == 32 ~ 0.0064,
edad == 33 ~ -0.0016,
edad == 34 ~ -0.0128,
edad == 35 ~ 0.0016,
edad == 36 ~ 0.0064,
edad == 37 ~ 0.0064,
edad == 38 ~ -0.0016,
edad == 39 ~ -0.0128,
edad >= 40 & edad <= 49 ~ 0,
TRUE ~ NA_real_
)
)
# Paso 2: Calcular los máximos de tgfigq y tgffgq por gq_cod (3 a 9)
# Asegúrate de que 'gq_cod', 'tgfigq' y 'tgffgq' existen en tu dataframe
# Calcular los máximos de tgfigq por gq_cod
tgfigq_summary <- data %>%
subset(gq_cod >= 3 & gq_cod <= 9) %>%
group_by(gq_cod) %>%
summarise(
tgfigqb = if(any(is.finite(tgfigq))) max(tgfigq, na.rm = TRUE) else NA_real_
) %>%
pivot_wider(
names_from = gq_cod,
values_from = tgfigqb,
names_prefix = "tgfigqb"
)
# Calcular los máximos de tgffgq por gq_cod
tgffgq_summary <- data %>%
subset(gq_cod >= 3 & gq_cod <= 9) %>%
group_by(gq_cod) %>%
summarise(
tgffgqb = if(any(is.finite(tgffgq))) max(tgffgq, na.rm = TRUE) else NA_real_
) %>%
pivot_wider(
names_from = gq_cod,
values_from = tgffgqb,
names_prefix = "tgffgqb"
)
# Paso 3: Asignar los máximos calculados al dataframe principal
data <- data %>%
mutate(
tgfigqb3 = tgfigq_summary$tgfigqb3[1],
tgfigqb4 = tgfigq_summary$tgfigqb4[1],
tgfigqb5 = tgfigq_summary$tgfigqb5[1],
tgfigqb6 = tgfigq_summary$tgfigqb6[1],
tgfigqb7 = tgfigq_summary$tgfigqb7[1],
tgfigqb8 = tgfigq_summary$tgfigqb8[1],
tgfigqb9 = tgfigq_summary$tgfigqb9[1],
tgffgqb3 = tgffgq_summary$tgffgqb3[1],
tgffgqb4 = tgffgq_summary$tgffgqb4[1],
tgffgqb5 = tgffgq_summary$tgffgqb5[1],
tgffgqb6 = tgffgq_summary$tgffgqb6[1],
tgffgqb7 = tgffgq_summary$tgffgqb7[1],
tgffgqb8 = tgffgq_summary$tgffgqb8[1],
tgffgqb9 = tgffgq_summary$tgffgqb9[1]
)
# Instalar y cargar los paquetes necesarios
# Si ya los tienes instalados, puedes omitir la instalación
library(dplyr)
library(tidyr)
# Verificar las columnas existentes
# print(names(data))
# Paso 1: Calcular spraguei basado en rangos de edad específicos
data <- data %>%
mutate(
spraguei = case_when(
edad >= 15 & edad <= 29 ~ beta1 * 5 * tgfigqb3 +
beta2 * 5 * tgfigqb4 +
beta3 * 5 * tgfigqb5 +
beta4 * 5 * tgfigqb6 +
beta5 * 5 * tgfigqb7,
edad >= 30 & edad <= 34 ~ beta1 * 5 * tgfigqb4 +
beta2 * 5 * tgfigqb5 +
beta3 * 5 * tgfigqb6 +
beta4 * 5 * tgfigqb7 +
beta5 * 5 * tgfigqb8,
edad >= 35 & edad <= 39 ~ beta1 * 5 * tgfigqb5 +
beta2 * 5 * tgfigqb6 +
beta3 * 5 * tgfigqb7 +
beta4 * 5 * tgfigqb8 +
beta5 * 5 * tgfigqb9,
edad >= 40 & edad <= 49 ~ beta1 * 5 * tgfigqb9 +
beta2 * 5 * tgfigqb8 +
beta3 * 5 * tgfigqb7 +
beta4 * 5 * tgfigqb6 +
beta5 * 5 * tgfigqb9,
TRUE ~ NA_real_
)
)
# Paso 2: Calcular spraguef basado en rangos de edad específicos
data <- data %>%
mutate(
spraguef = case_when(
edad >= 15 & edad <= 29 ~ beta1 * 5 * tgffgqb3 +
beta2 * 5 * tgffgqb4 +
beta3 * 5 * tgffgqb5 +
beta4 * 5 * tgffgqb6 +
beta5 * 5 * tgffgqb7,
edad >= 30 & edad <= 34 ~ beta1 * 5 * tgffgqb4 +
beta2 * 5 * tgffgqb5 +
beta3 * 5 * tgffgqb6 +
beta4 * 5 * tgffgqb7 +
beta5 * 5 * tgffgqb8,
edad >= 35 & edad <= 39 ~ beta1 * 5 * tgffgqb5 +
beta2 * 5 * tgffgqb6 +
beta3 * 5 * tgffgqb7 +
beta4 * 5 * tgffgqb8 +
beta5 * 5 * tgffgqb9,
edad >= 40 & edad <= 49 ~ beta1 * 5 * tgffgqb9 +
beta2 * 5 * tgffgqb8 +
beta3 * 5 * tgffgqb7 +
beta4 * 5 * tgffgqb6 +
beta5 * 5 * tgffgqb9,
TRUE ~ NA_real_
)
)
# Paso 3: Generar spragueipos y spraguefpos como máximos entre spraguei/spraguef y cero
data <- data %>%
mutate(
spragueipos = pmax(spraguei, 0, na.rm = TRUE),
spraguefpos = pmax(spraguef, 0, na.rm = TRUE)
)
# Paso 4: Calcular las sumas agrupadas por year y gq
# Suma de spraguei y spragueipos
data <- data %>%
group_by(year, gq) %>%
mutate(
sumtgfigq = sum(spraguei, na.rm = TRUE),
sumtgfigqb = sum(spragueipos, na.rm = TRUE)
) %>%
ungroup()
# Suma de spraguef y spraguefpos
data <- data %>%
group_by(year, gq) %>%
mutate(
sumtgffgq = sum(spraguef, na.rm = TRUE),
sumtgffgqb = sum(spraguefpos, na.rm = TRUE)
) %>%
ungroup()
# Paso 5: Calcular tfertesi y tfertesf
data <- data %>%
mutate(
tfertesi = ifelse(sumtgfigqb != 0, spragueipos / sumtgfigqb * sumtgfigq, NA_real_),
tfertesf = ifelse(sumtgffgqb != 0, spraguefpos / sumtgffgqb * sumtgffgq, NA_real_)
)
# Paso 6: Calcular los pesos pesotgfies y pesotgffes
data <- data %>%
mutate(
pesotgfies = tfertesi / tgfi,
pesotgffes = tfertesf / tgff
)
# Paso 7: Calcular la tasa global de fecundidad tfertes
data <- data %>%
mutate(
tfertes = (1 - factortend) * pesotgfies +
factortend * pesotgffes * tgf
)
# Paso 8: Ajustar formato para evitar notación científica
options(scipen = 999) # Evitar notación científica
# Paso 9: Limpiar el dataframe eliminando columnas innecesarias
data <- data %>%
select(-starts_with("tgfigq"), -starts_with("tgffgq"), -starts_with("beta"))
# Paso 10: Generar variables adicionales similares al código Stata
# Concatenar year y edad para crear refyearedad y refañoedad
data <- data %>%
mutate(
refyearedad = paste(year, edad, sep = "-"),
año = 2017 + year,
refañoedad = paste(año, edad, sep = "-")
) %>%
select(año, year, everything()) # Ordenar colocando 'año' y 'year' al inicio
# Verificar el resultado final
glimpse(data)
## Rows: 3,535
## Columns: 28
## $ año <dbl> 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017…
## $ year <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ edad <int> 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29…
## $ reftend <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ tgfi <dbl> 3.1, 3.1, 3.1, 3.1, 3.1, 3.1, 3.1, 3.1, 3.1, 3.1, 3.1, 3.1…
## $ tgff <dbl> 1.96, 1.96, 1.96, 1.96, 1.96, 1.96, 1.96, 1.96, 1.96, 1.96…
## $ tendencia <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2…
## $ yearfinvar <dbl> 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47…
## $ factortend <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ tgf <dbl> 3.1, 3.1, 3.1, 3.1, 3.1, 3.1, 3.1, 3.1, 3.1, 3.1, 3.1, 3.1…
## $ tasareproc <dbl> 0.12, 0.12, 0.12, 0.12, 0.12, 0.31, 0.31, 0.31, 0.31, 0.31…
## $ gq <fct> 15 a 19, 15 a 19, 15 a 19, 15 a 19, 15 a 19, 20 a 24, 20 a…
## $ gq_cod <dbl> 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6…
## $ spraguei <dbl> -0.0051584, 0.0404240, 0.0801040, 0.1140800, 0.1425504, 0.…
## $ spraguef <dbl> -0.00326144, 0.02555840, 0.05064640, 0.07212800, 0.0901286…
## $ spragueipos <dbl> 0.0000000, 0.0404240, 0.0801040, 0.1140800, 0.1425504, 0.1…
## $ spraguefpos <dbl> 0.00000000, 0.02555840, 0.05064640, 0.07212800, 0.09012864…
## $ sumtgfigq <dbl> 0.372, 0.372, 0.372, 0.372, 0.372, 0.961, 0.961, 0.961, 0.…
## $ sumtgfigqb <dbl> 0.3771584, 0.3771584, 0.3771584, 0.3771584, 0.3771584, 0.9…
## $ sumtgffgq <dbl> 0.2352, 0.2352, 0.2352, 0.2352, 0.2352, 0.6076, 0.6076, 0.…
## $ sumtgffgqb <dbl> 0.2384614, 0.2384614, 0.2384614, 0.2384614, 0.2384614, 0.6…
## $ tfertesi <dbl> 0.00000000, 0.03987112, 0.07900842, 0.11251973, 0.14060074…
## $ tfertesf <dbl> 0.00000000, 0.02520884, 0.04995371, 0.07114150, 0.08889595…
## $ pesotgfies <dbl> 0.00000000, 0.01286165, 0.02548659, 0.03629669, 0.04535508…
## $ pesotgffes <dbl> 0.00000000, 0.01286165, 0.02548659, 0.03629669, 0.04535508…
## $ tfertes <dbl> 0.00000000, 0.01286165, 0.02548659, 0.03629669, 0.04535508…
## $ refyearedad <chr> "0-15", "0-16", "0-17", "0-18", "0-19", "0-20", "0-21", "0…
## $ refañoedad <chr> "2017-15", "2017-16", "2017-17", "2017-18", "2017-19", "20…
library(dplyr)
library(ggplot2)
# Supongamos que el dataframe original se llama 'data'
# Primero, asegurémonos de que 'data' contenga las columnas necesarias
# Crear la tasa de reemplazo
data <- data %>%
mutate(tasareemplazo = 2.1)
# Gráfica 1: Tasa Global de Fecundidad
tgf_plot <- ggplot(data, aes(x = year)) +
geom_line(aes(y = tgf, color = "Tasa Global de Fecundidad"), size = 1) +
geom_line(aes(y = tasareemplazo, color = "Tasa de Reemplazo"), size = 1) +
scale_y_continuous(breaks = seq(0, 3, 0.5), limits = c(0, 3)) +
scale_x_continuous(breaks = seq(0, 100, 10)) +
labs(
title = "Tasa Global de Fecundidad",
x = "Años",
y = "Tasa Global de Fecundidad"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 0))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
tgf_plot
## Warning: Removed 315 rows containing missing values or values outside the scale range
## (`geom_line()`).
# Gráfica 2: Tasa Global de Fecundidad por Edad
# Filtrar los datos para los años específicos
age_data <- data %>%
subset(year == 0 | year==100)
# Gráfica por edad
tfertes_plot <- ggplot(age_data, aes(x = edad, y = tfertes, color = factor(year))) +
geom_line(size = 1) +
scale_y_continuous(breaks = seq(0, 0.3, 0.05)) +
scale_x_continuous(breaks = seq(15, 49, 1)) +
labs(
title = "Tasa Global de Fecundidad por Edad",
x = "Edades",
y = "Tasa Global de Fecundidad"
) +
scale_color_manual(
values = c("blue", "red"),
labels = c("TGF - Año 0", "TGF - Año 100")
) +
theme_minimal() +
theme(legend.position = "bottom")
tfertes_plot
# Limpiar el entorno de trabajo
rm(list = ls()) # Eliminar todos los objetos del entorno
# Limpiar la consola
cat("\014") # Limpiar la consola
# Cerrar todos los dispositivos gráficos
if (dev.cur() != 1) {
graphics.off()
}
# Establecer un nuevo directorio de trabajo si es necesario
# setwd("ruta/a/tu/directorio") # Descomenta y ajusta si es necesario
# Instalar y cargar los paquetes necesarios
#install.packages(c("dplyr", "tibble", "ggplot2"))
# Instalar y cargar los paquetes necesarios
library(dplyr)
library(tibble)
library(ggplot2)
# Definir funciones vectorizadas para asignar tasainch y tasaincm
get_tasainch <- Vectorize(function(ev0h_prev, velocidad) {
if (is.na(ev0h_prev) | is.na(velocidad)) {
return(NA_real_)
}
if (velocidad == 1) {
if (ev0h_prev > 55 & ev0h_prev <= 57.5) {
return(2.5)
} else if (ev0h_prev > 57.5 & ev0h_prev <= 60) {
return(2.5)
} else if (ev0h_prev > 60 & ev0h_prev <= 62.5) {
return(2.5)
} else if (ev0h_prev > 62.5 & ev0h_prev <= 65) {
return(2.3)
} else if (ev0h_prev > 65 & ev0h_prev <= 67.5) {
return(2.0)
} else if (ev0h_prev > 67.5 & ev0h_prev <= 70) {
return(1.5)
} else if (ev0h_prev > 70 & ev0h_prev <= 72.5) {
return(1.2)
} else if (ev0h_prev > 72.5 & ev0h_prev <= 75) {
return(1.0)
} else if (ev0h_prev > 75 & ev0h_prev <= 77.5) {
return(0.8)
} else if (ev0h_prev > 77.5 & ev0h_prev <= 80) {
return(0.5)
} else if (ev0h_prev > 80 & ev0h_prev <= 82.5) {
return(0.5)
} else if (ev0h_prev > 82.5 & ev0h_prev <= 85) {
return(0.0)
} else if (ev0h_prev > 85 & ev0h_prev <= 87.5) {
return(0.0)
} else {
return(0.0)
}
} else if (velocidad == 2) {
if (ev0h_prev > 55 & ev0h_prev <= 57.5) {
return(2.5)
} else if (ev0h_prev > 57.5 & ev0h_prev <= 60) {
return(2.5)
} else if (ev0h_prev > 60 & ev0h_prev <= 62.5) {
return(2.3)
} else if (ev0h_prev > 62.5 & ev0h_prev <= 65) {
return(2.0)
} else if (ev0h_prev > 65 & ev0h_prev <= 67.5) {
return(1.5)
} else if (ev0h_prev > 67.5 & ev0h_prev <= 70) {
return(1.2)
} else if (ev0h_prev > 70 & ev0h_prev <= 72.5) {
return(1.0)
} else if (ev0h_prev > 72.5 & ev0h_prev <= 75) {
return(0.8)
} else if (ev0h_prev > 75 & ev0h_prev <= 77.5) {
return(0.5)
} else if (ev0h_prev > 77.5 & ev0h_prev <= 80) {
return(0.4)
} else if (ev0h_prev > 80 & ev0h_prev <= 82.5) {
return(0.4)
} else if (ev0h_prev > 82.5 & ev0h_prev <= 85) {
return(0.0)
} else if (ev0h_prev > 85 & ev0h_prev <= 87.5) {
return(0.0)
} else {
return(0.0)
}
} else if (velocidad == 3) {
if (ev0h_prev > 55 & ev0h_prev <= 57.5) {
return(2.0)
} else if (ev0h_prev > 57.5 & ev0h_prev <= 60) {
return(2.0)
} else if (ev0h_prev > 60 & ev0h_prev <= 62.5) {
return(2.0)
} else if (ev0h_prev > 62.5 & ev0h_prev <= 65) {
return(2.0)
} else if (ev0h_prev > 65 & ev0h_prev <= 67.5) {
return(1.5)
} else if (ev0h_prev > 67.5 & ev0h_prev <= 70) {
return(1.0)
} else if (ev0h_prev > 70 & ev0h_prev <= 72.5) {
return(0.8)
} else if (ev0h_prev > 72.5 & ev0h_prev <= 75) {
return(0.5)
} else if (ev0h_prev > 75 & ev0h_prev <= 77.5) {
return(0.3)
} else if (ev0h_prev > 77.5 & ev0h_prev <= 80) {
return(0.3)
} else if (ev0h_prev > 80 & ev0h_prev <= 82.5) {
return(0.3)
} else if (ev0h_prev > 82.5 & ev0h_prev <= 85) {
return(0.0)
} else if (ev0h_prev > 85 & ev0h_prev <= 87.5) {
return(0.0)
} else {
return(0.0)
}
} else {
return(0.0)
}
})
get_tasaincm <- Vectorize(function(ev0m_prev, velocidad) {
if (is.na(ev0m_prev) | is.na(velocidad)) {
return(NA_real_)
}
if (velocidad == 1) {
if (ev0m_prev > 55 & ev0m_prev <= 57.5) {
return(2.5)
} else if (ev0m_prev > 57.5 & ev0m_prev <= 60) {
return(2.5)
} else if (ev0m_prev > 60 & ev0m_prev <= 62.5) {
return(2.5)
} else if (ev0m_prev > 62.5 & ev0m_prev <= 65) {
return(2.5)
} else if (ev0m_prev > 65 & ev0m_prev <= 67.5) {
return(2.5)
} else if (ev0m_prev > 67.5 & ev0m_prev <= 70) {
return(2.3)
} else if (ev0m_prev > 70 & ev0m_prev <= 72.5) {
return(2.0)
} else if (ev0m_prev > 72.5 & ev0m_prev <= 75) {
return(1.5)
} else if (ev0m_prev > 75 & ev0m_prev <= 77.5) {
return(1.2)
} else if (ev0m_prev > 77.5 & ev0m_prev <= 80) {
return(1.0)
} else if (ev0m_prev > 80 & ev0m_prev <= 82.5) {
return(0.8)
} else if (ev0m_prev > 82.5 & ev0m_prev <= 85) {
return(0.5)
} else if (ev0m_prev > 85 & ev0m_prev <= 87.5) {
return(0.5)
} else {
return(0.0)
}
} else if (velocidad == 2) {
if (ev0m_prev > 55 & ev0m_prev <= 57.5) {
return(2.5)
} else if (ev0m_prev > 57.5 & ev0m_prev <= 60) {
return(2.5)
} else if (ev0m_prev > 60 & ev0m_prev <= 62.5) {
return(2.5)
} else if (ev0m_prev > 62.5 & ev0m_prev <= 65) {
return(2.5)
} else if (ev0m_prev > 65 & ev0m_prev <= 67.5) {
return(2.3)
} else if (ev0m_prev > 67.5 & ev0m_prev <= 70) {
return(2.0)
} else if (ev0m_prev > 70 & ev0m_prev <= 72.5) {
return(1.5)
} else if (ev0m_prev > 72.5 & ev0m_prev <= 75) {
return(1.2)
} else if (ev0m_prev > 75 & ev0m_prev <= 77.5) {
return(1.0)
} else if (ev0m_prev > 77.5 & ev0m_prev <= 80) {
return(0.8)
} else if (ev0m_prev > 80 & ev0m_prev <= 82.5) {
return(0.5)
} else if (ev0m_prev > 82.5 & ev0m_prev <= 85) {
return(0.4)
} else if (ev0m_prev > 85 & ev0m_prev <= 87.5) {
return(0.4)
} else {
return(0.0)
}
} else if (velocidad == 3) {
if (ev0m_prev > 55 & ev0m_prev <= 57.5) {
return(2.0)
} else if (ev0m_prev > 57.5 & ev0m_prev <= 60) {
return(2.0)
} else if (ev0m_prev > 60 & ev0m_prev <= 62.5) {
return(2.0)
} else if (ev0m_prev > 62.5 & ev0m_prev <= 65) {
return(2.0)
} else if (ev0m_prev > 65 & ev0m_prev <= 67.5) {
return(2.0)
} else if (ev0m_prev > 67.5 & ev0m_prev <= 70) {
return(1.5)
} else if (ev0m_prev > 70 & ev0m_prev <= 72.5) {
return(1.2)
} else if (ev0m_prev > 72.5 & ev0m_prev <= 75) {
return(1.0)
} else if (ev0m_prev > 75 & ev0m_prev <= 77.5) {
return(0.8)
} else if (ev0m_prev > 77.5 & ev0m_prev <= 80) {
return(0.5)
} else if (ev0m_prev > 80 & ev0m_prev <= 82.5) {
return(0.3)
} else if (ev0m_prev > 82.5 & ev0m_prev <= 85) {
return(0.3)
} else if (ev0m_prev > 85 & ev0m_prev <= 87.5) {
return(0.3)
} else {
return(0.0)
}
} else {
return(0.0)
}
})
# Crear el dataframe con 21 observaciones
projection_data <- tibble(
year = seq(0, 100, by = 5), # 0,5,10,...100
edad = 0, # Inicialmente 0
velocidad = 3, # Asignar velocidad =3 (rápida 1, media 2, lenta 3)
ev0h = if_else(year == 0, 71.77, NA_real_), # Asignar ev0h solo para year == 0
ev0m = if_else(year == 0, 77.69, NA_real_), # Asignar ev0m solo para year == 0
tasainch = NA_real_, # Inicializar tasainch como NA
tasaincm = NA_real_ # Inicializar tasaincm como NA
)
# Asignar tasainch y tasaincm para year == 0
projection_data <- projection_data %>%
mutate(
tasainch = if_else(year == 0, get_tasainch(ev0h, velocidad), tasainch),
tasaincm = if_else(year == 0, get_tasaincm(ev0m, velocidad), tasaincm)
)
# Verificar la asignación para year == 0
print(projection_data %>%
subset(year == 0))
## # A tibble: 1 × 7
## year edad velocidad ev0h ev0m tasainch tasaincm
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0 0 3 71.8 77.7 0.8 0.5
# Número total de quinquenios
n <- nrow(projection_data)
# Implementar el bucle para asignar tasainch y ev0h
for (i in 2:n) {
# Obtener el valor de ev0h del quinquenio anterior
ev0h_prev <- projection_data$ev0h[i - 1]
# Obtener la velocidad actual
velocidad_current <- projection_data$velocidad[i]
# Asignar tasainch basado en ev0h_prev y velocidad_current
tasainch_current <- get_tasainch(ev0h_prev, velocidad_current)
# Actualizar tasainch en la fila actual
projection_data$tasainch[i] <- tasainch_current
# Actualizar ev0h en la fila actual
projection_data$ev0h[i] <- ev0h_prev + tasainch_current
}
# Implementar el bucle para asignar tasaincm y ev0m
for (i in 2:n) {
# Obtener el valor de ev0m del quinquenio anterior
ev0m_prev <- projection_data$ev0m[i - 1]
# Obtener la velocidad actual
velocidad_current <- projection_data$velocidad[i]
# Asignar tasaincm basado en ev0m_prev y velocidad_current
tasaincm_current <- get_tasaincm(ev0m_prev, velocidad_current)
# Actualizar tasaincm en la fila actual
projection_data$tasaincm[i] <- tasaincm_current
# Actualizar ev0m en la fila actual
projection_data$ev0m[i] <- ev0m_prev + tasaincm_current
}
# Verificar las asignaciones de tasainch, tasaincm, ev0h y ev0m
print(projection_data)
## # A tibble: 21 × 7
## year edad velocidad ev0h ev0m tasainch tasaincm
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0 0 3 71.8 77.7 0.8 0.5
## 2 5 0 3 72.6 78.2 0.8 0.5
## 3 10 0 3 73.1 78.7 0.5 0.5
## 4 15 0 3 73.6 79.2 0.5 0.5
## 5 20 0 3 74.1 79.7 0.5 0.5
## 6 25 0 3 74.6 80.2 0.5 0.5
## 7 30 0 3 75.1 80.5 0.5 0.3
## 8 35 0 3 75.4 80.8 0.3 0.3
## 9 40 0 3 75.7 81.1 0.3 0.3
## 10 45 0 3 76.0 81.4 0.3 0.3
## # ℹ 11 more rows
# Asignar cotas inferiores para hombres
projection_data <- projection_data %>%
mutate(
cotainfh = case_when(
ev0h < 75 ~ floor(ev0h),
ev0h >= 75 & ev0h < 76.19 ~ 75.0,
ev0h >= 76.19 & ev0h < 78.98 ~ 76.19,
ev0h >= 78.98 & ev0h < 82.5 ~ 78.98,
ev0h >= 82.5 ~ 82.5,
TRUE ~ NA_real_
)
)
# Asignar cotas superiores para hombres
projection_data <- projection_data %>%
mutate(
cotasuph = case_when(
cotainfh < 75 ~ cotainfh + 1,
cotainfh >= 75 & cotainfh < 76.19 ~ 76.19,
cotainfh >= 76.19 & cotainfh < 78.98 ~ 78.98,
cotainfh >= 78.98 ~ 82.5,
TRUE ~ NA_real_
)
)
# Calcular Th para hombres
projection_data <- projection_data %>%
mutate(
Th = if_else(
cotasuph == cotainfh,
0,
(ev0h - cotainfh) / (cotasuph - cotainfh)
)
)
# Asignar cotas inferiores para mujeres
projection_data <- projection_data %>%
mutate(
cotainfm = case_when(
ev0m < 75 ~ floor(ev0m),
ev0m >= 75 & ev0m < 77.5 ~ 75.0,
ev0m >= 77.5 & ev0m < 80 ~ 77.5,
ev0m >= 80 & ev0m < 82.5 ~ 80.0,
ev0m >= 82.5 & ev0m < 85 ~ 82.5,
ev0m >= 85 & ev0m < 87.5 ~ 85.0,
ev0m >= 87.5 ~ 87.5,
TRUE ~ NA_real_
)
)
# Asignar cotas superiores para mujeres
projection_data <- projection_data %>%
mutate(
cotasupm = case_when(
cotainfm < 75 ~ cotainfm + 1,
cotainfm >= 75 & cotainfm < 77.5 ~ 77.5,
cotainfm >= 77.5 & cotainfm < 80 ~ 80.0,
cotainfm >= 80 & cotainfm < 82.5 ~ 82.5,
cotainfm >= 82.5 & cotainfm < 85 ~ 85.0,
cotainfm >= 85 & cotainfm < 87.5 ~ 87.5,
cotainfm >= 87.5 ~ 87.5,
TRUE ~ NA_real_
)
)
# Calcular Tm para mujeres
projection_data <- projection_data %>%
mutate(
Tm = if_else(
cotasupm == cotainfm,
0,
(ev0m - cotainfm) / (cotasupm - cotainfm)
)
)
# Verificar las cotas y variables T
print(projection_data)
## # A tibble: 21 × 13
## year edad velocidad ev0h ev0m tasainch tasaincm cotainfh cotasuph Th
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0 0 3 71.8 77.7 0.8 0.5 71 72 0.770
## 2 5 0 3 72.6 78.2 0.8 0.5 72 73 0.570
## 3 10 0 3 73.1 78.7 0.5 0.5 73 74 0.0700
## 4 15 0 3 73.6 79.2 0.5 0.5 73 74 0.570
## 5 20 0 3 74.1 79.7 0.5 0.5 74 75 0.0700
## 6 25 0 3 74.6 80.2 0.5 0.5 74 75 0.570
## 7 30 0 3 75.1 80.5 0.5 0.3 75 76.2 0.0588
## 8 35 0 3 75.4 80.8 0.3 0.3 75 76.2 0.311
## 9 40 0 3 75.7 81.1 0.3 0.3 75 76.2 0.563
## 10 45 0 3 76.0 81.4 0.3 0.3 75 76.2 0.815
## # ℹ 11 more rows
## # ℹ 3 more variables: cotainfm <dbl>, cotasupm <dbl>, Tm <dbl>
# Crear un gráfico de la evolución de ev0h y ev0m a lo largo de los años
ggplot(projection_data, aes(x = year)) +
geom_line(aes(y = ev0h, color = "ev0h"), size = 1) +
geom_point(aes(y = ev0h, color = "ev0h"), size = 2) +
geom_line(aes(y = ev0m, color = "ev0m"), size = 1) +
geom_point(aes(y = ev0m, color = "ev0m"), size = 2) +
labs(title = "Proyección de la Esperanza de Vida al Nacimiento",
x = "Año",
y = "Esperanza de Vida al Nacimiento",
color = "Variable") +
theme_minimal()
# Guardar el dataframe final en un archivo RData
save(projection_data, file = "/cloud/project/ev_gq.RData")
# Para cargarlo posteriormente
# load("ev_gq.RData")
library(readr)
# guardar projection_data como "D:/proypob/ev_gq.csv"
# 5. Definir la ruta completa del archivo CSV
ruta_directorio <- "/cloud/project"
ruta_archivo <- file.path(ruta_directorio, "ev_gq.csv")
# 6. Guardar el DataFrame como CSV usando 'write_csv()'
write_csv(projection_data, ruta_archivo)
library(dplyr)
library(tidyr)
# Expandir la tabla a todas las combinaciones de años y edades de 0 a 100
projection_data_expanded <- projection_data %>%
complete(year = 0:100, edad = 0:100) %>% # Añadir todas las combinaciones de año y edad de 0 a 100
arrange(year, edad) %>% # Ordenar por año y edad
group_by(group_year = floor(year / 5) * 5) %>% # Crear grupos de años (0-4, 5-9, etc.)
fill(everything(), .direction = "downup") %>% # Rellenar valores en cada grupo de años
ungroup() %>%
select(-group_year) # Eliminar columna de agrupación temporal
# Mostrar los datos expandidos
projection_data_expanded
## # A tibble: 10,201 × 13
## year edad velocidad ev0h ev0m tasainch tasaincm cotainfh cotasuph Th
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0 0 3 71.8 77.7 0.8 0.5 71 72 0.770
## 2 0 1 3 71.8 77.7 0.8 0.5 71 72 0.770
## 3 0 2 3 71.8 77.7 0.8 0.5 71 72 0.770
## 4 0 3 3 71.8 77.7 0.8 0.5 71 72 0.770
## 5 0 4 3 71.8 77.7 0.8 0.5 71 72 0.770
## 6 0 5 3 71.8 77.7 0.8 0.5 71 72 0.770
## 7 0 6 3 71.8 77.7 0.8 0.5 71 72 0.770
## 8 0 7 3 71.8 77.7 0.8 0.5 71 72 0.770
## 9 0 8 3 71.8 77.7 0.8 0.5 71 72 0.770
## 10 0 9 3 71.8 77.7 0.8 0.5 71 72 0.770
## # ℹ 10,191 more rows
## # ℹ 3 more variables: cotainfm <dbl>, cotasupm <dbl>, Tm <dbl>
library(dplyr)
library(readr)
# Definir las rutas a los archivos
ruta_archivom <- "/cloud/project/desagregarqxm.csv"
ruta_archivoh <- "/cloud/project/desagregarqxh.csv"
# Cargar los archivos desagregarqxm y desagregarqxh
desagregarqxm <- read_csv(ruta_archivom)
## Rows: 4646 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): refqxm
## dbl (3): edad, ev0, qxm
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
desagregarqxh <- read_csv(ruta_archivoh)
## Rows: 4444 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): refqxh
## dbl (3): edad, ev0, qxh
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
desagregarqxm
## # A tibble: 4,646 × 4
## edad ev0 qxm refqxm
## <dbl> <dbl> <dbl> <chr>
## 1 0 35 0.219 35-0
## 2 0 36 0.213 36-0
## 3 0 37 0.208 37-0
## 4 0 38 0.203 38-0
## 5 0 39 0.197 39-0
## 6 0 40 0.192 40-0
## 7 0 41 0.187 41-0
## 8 0 42 0.182 42-0
## 9 0 43 0.177 43-0
## 10 0 44 0.172 44-0
## # ℹ 4,636 more rows
# Asegurarse de que las columnas clave existen y tienen el mismo tipo de dato en projection_data_expanded
projection_data_expanded <- projection_data_expanded %>%
mutate(
cotainfh = round(as.numeric(cotainfh)),
cotainfm = round(as.numeric(cotainfm)),
edad = as.integer(edad)
)
# Crear una clave compuesta para facilitar la unión
projection_data_expanded <- projection_data_expanded %>%
mutate(
refqxm = paste0(cotainfm, "-", edad),
refqxh = paste0(cotainfh, "-", edad)
)
# Realizar la unión con desagregarqxh usando la clave compuesta 'refqxh' y seleccionar solo la columna 'qxh'
# Realizar la unión con desagregarqxm usando la clave compuesta 'refqxm' y seleccionar solo la columna 'qxm'
projection_data_expanded <- projection_data_expanded %>%
left_join(desagregarqxm %>% select(refqxm, qxm), by = "refqxm")
projection_data_expanded <- projection_data_expanded %>%
left_join(desagregarqxh %>% select(refqxh, qxh), by = "refqxh")
# Resultado
projection_data_expanded
## # A tibble: 10,201 × 17
## year edad velocidad ev0h ev0m tasainch tasaincm cotainfh cotasuph Th
## <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0 0 3 71.8 77.7 0.8 0.5 71 72 0.770
## 2 0 1 3 71.8 77.7 0.8 0.5 71 72 0.770
## 3 0 2 3 71.8 77.7 0.8 0.5 71 72 0.770
## 4 0 3 3 71.8 77.7 0.8 0.5 71 72 0.770
## 5 0 4 3 71.8 77.7 0.8 0.5 71 72 0.770
## 6 0 5 3 71.8 77.7 0.8 0.5 71 72 0.770
## 7 0 6 3 71.8 77.7 0.8 0.5 71 72 0.770
## 8 0 7 3 71.8 77.7 0.8 0.5 71 72 0.770
## 9 0 8 3 71.8 77.7 0.8 0.5 71 72 0.770
## 10 0 9 3 71.8 77.7 0.8 0.5 71 72 0.770
## # ℹ 10,191 more rows
## # ℹ 7 more variables: cotainfm <dbl>, cotasupm <dbl>, Tm <dbl>, refqxm <chr>,
## # refqxh <chr>, qxm <dbl>, qxh <dbl>
library(dplyr)
# Renombrar qxm y qxh a qxmcotasup y qxhcotasup
projection_data_expanded <- projection_data_expanded %>%
rename(
qxmcotainf = qxm,
qxhcotainf = qxh
)
# Eliminar las columnas refqxh y refqxm
projection_data_expanded <- projection_data_expanded %>%
select(-refqxh, -refqxm)
# Crear una clave compuesta para facilitar la unión
projection_data_expanded <- projection_data_expanded %>%
mutate(
refqxm = paste0(cotasupm, "-", edad),
refqxh = paste0(cotasuph, "-", edad)
)
# Realizar la unión con desagregarqxm usando la clave compuesta 'refqxm' y seleccionar solo la columna 'qxm'
projection_data_expanded <- projection_data_expanded %>%
left_join(desagregarqxm %>% select(refqxm, qxm), by = "refqxm")
projection_data_expanded <- projection_data_expanded %>%
left_join(desagregarqxh %>% select(refqxh, qxh), by = "refqxh")
projection_data_expanded <- projection_data_expanded %>%
rename(
qxmcotasup = qxm,
qxhcotasup = qxh
)
# Generar qxh y qxm usando las fórmulas dadas
projection_data_expanded <- projection_data_expanded %>%
mutate(
qxh = (1 - Th) * qxhcotainf + Th * qxhcotasup,
qxm = (1 - Tm) * qxmcotainf + Tm * qxmcotasup
)
# Crear la columna refyearedad concatenando year y edad con un guion
projection_data_expanded <- projection_data_expanded %>%
mutate(refyearedad = paste(year, edad, sep = "-"))
# Ordenar los datos por year y edad
projection_data_expanded <- projection_data_expanded %>%
arrange(year, edad)
# Resultado final
projection_data_expanded
## # A tibble: 10,201 × 22
## year edad velocidad ev0h ev0m tasainch tasaincm cotainfh cotasuph Th
## <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0 0 3 71.8 77.7 0.8 0.5 71 72 0.770
## 2 0 1 3 71.8 77.7 0.8 0.5 71 72 0.770
## 3 0 2 3 71.8 77.7 0.8 0.5 71 72 0.770
## 4 0 3 3 71.8 77.7 0.8 0.5 71 72 0.770
## 5 0 4 3 71.8 77.7 0.8 0.5 71 72 0.770
## 6 0 5 3 71.8 77.7 0.8 0.5 71 72 0.770
## 7 0 6 3 71.8 77.7 0.8 0.5 71 72 0.770
## 8 0 7 3 71.8 77.7 0.8 0.5 71 72 0.770
## 9 0 8 3 71.8 77.7 0.8 0.5 71 72 0.770
## 10 0 9 3 71.8 77.7 0.8 0.5 71 72 0.770
## # ℹ 10,191 more rows
## # ℹ 12 more variables: cotainfm <dbl>, cotasupm <dbl>, Tm <dbl>,
## # qxmcotainf <dbl>, qxhcotainf <dbl>, refqxm <chr>, refqxh <chr>,
## # qxmcotasup <dbl>, qxhcotasup <dbl>, qxh <dbl>, qxm <dbl>, refyearedad <chr>
# Guardar el DataFrame como un archivo CSV
write.csv(projection_data_expanded, "/cloud/project/MORTquinquenios.csv", row.names = FALSE)
library(dplyr)
library(openxlsx)
# Cargar el archivo "MORTquinquenios.csv"
data <- read.csv("/cloud/project/MORTquinquenios.csv")
# Crear un archivo Excel
wb <- createWorkbook()
# Tabla para "max ev0h" agrupado por año
table_ev0h <- data %>%
group_by(year) %>%
summarise(max_ev0h = max(ev0h, na.rm = TRUE)) %>%
mutate(max_ev0h = sprintf("%.2f", max_ev0h))
# Exportar tabla de ev0h a la primera hoja
addWorksheet(wb, "Sheet1")
writeData(wb, "Sheet1", table_ev0h)
# Tabla para "max ev0m" agrupado por año
table_ev0m <- data %>%
group_by(year) %>%
summarise(max_ev0m = max(ev0m, na.rm = TRUE)) %>%
mutate(max_ev0m = sprintf("%.2f", max_ev0m))
# Exportar tabla de ev0m a la segunda hoja
addWorksheet(wb, "Sheet2")
writeData(wb, "Sheet2", table_ev0m)
# Tabla para "max qxh" agrupado por edad, cuando year == 0
table_qxh <- data %>%
subset(year == 0) %>%
group_by(edad) %>%
summarise(max_qxh = max(qxh, na.rm = TRUE)) %>%
mutate(max_qxh = sprintf("%.2f", max_qxh))
# Exportar tabla de qxh a la tercera hoja
addWorksheet(wb, "Sheet3")
writeData(wb, "Sheet3", table_qxh)
# Guardar el archivo Excel
saveWorkbook(wb, "/cloud/project/tablas.xlsx", overwrite = TRUE)
library(dplyr)
library(ggplot2)
# Cargar el archivo "MORTquinquenios.csv"
data <- read.csv("/cloud/project/MORTquinquenios.csv")
# Filtrar solo las columnas necesarias y eliminar duplicados en `year`
data_filtered <- data %>%
select(year, ev0h, ev0m) %>%
distinct(year, .keep_all = TRUE)
# Crear el gráfico de líneas
plot <- ggplot(data_filtered, aes(x = year)) +
geom_line(aes(y = ev0h, color = "ev0h"), size = 1) +
geom_line(aes(y = ev0m, color = "ev0m"), size = 1) +
scale_y_continuous("Esperanza de Vida al Nacimiento", limits = c(50, 100), breaks = seq(50, 100, 5)) +
scale_x_continuous("Años", limits = c(0, 100), breaks = seq(0, 100, 5)) +
labs(color = "Sexo") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 0, hjust = 0.5))
plot
# Guardar el gráfico en formato EPS
ggsave("/cloud/project/ev0bysexyear.eps", plot = plot, device = "eps", width = 8, height = 5)
library(dplyr)
library(conflicted)
conflicts_prefer(stats::lag)
## [conflicted] Will prefer stats::lag over any other package.
# Crear un DataFrame vacío con todas las combinaciones de edades (0-100) y años de proyección (0-100)
num_years <- 101 # Años de proyección
num_ages <- 101 # Edades
# Crear todas las combinaciones de edades y años de proyección
projection_data_interpolated <- expand.grid(
edad = seq(0, num_ages - 1),
year = seq(0, num_years - 1)
)
# Crear la clave `refyearedad` concatenando `year` y `edad` con un guion
projection_data_interpolated <- projection_data_interpolated %>%
mutate(refyearedad = paste(year, edad, sep = "-"))
# Cargar los datos de `MORTquinquenios.csv` y añadir las columnas `qxh` y `qxm` a la base de proyección
mort_data <- read.csv("/cloud/project/MORTquinquenios.csv")
# Crear la clave `refyearedad` en `mort_data` para el merge
mort_data <- mort_data %>%
mutate(refyearedad = paste(year, edad, sep = "-"))
# Realizar el merge (equivalente a `merge 1:1 ref` en Stata) usando la clave `refyearedad`
projection_data_interpolated <- projection_data_interpolated %>%
left_join(mort_data %>% select(refyearedad, qxh, qxm), by = "refyearedad")
# Ordenar los datos por edad y año (equivalente a `sort edad year`)
projection_data_interpolated <- projection_data_interpolated %>%
arrange(edad, year)
# Eliminar la columna `refyearedad` para dejar el DataFrame limpio
projection_data_interpolated <- projection_data_interpolated %>%
select(-refyearedad)
# Resultado final
head(projection_data_interpolated) # Visualizar las primeras filas
## edad year qxh qxm
## 1 0 0 0.0343211 NA
## 2 0 1 0.0343211 NA
## 3 0 2 0.0343211 NA
## 4 0 3 0.0343211 NA
## 5 0 4 0.0343211 NA
## 6 0 5 0.0315164 NA
library(dplyr)
# Generar referencia del año en la columna 'refy'
projection_data_interpolated <- projection_data_interpolated %>%
mutate(refy = year)
# Definir los años específicos para aplicar las fórmulas de interpolación
projection_years <- seq(1, 96, by = 5)
# Interpolación para qxh (hombres)
projection_data_interpolated <- projection_data_interpolated %>%
mutate(
qxh = case_when(
year %in% projection_years ~ exp((4 * log(lag(qxh, 1)) + 1 * log(lead(qxh, 4))) / 5),
year %in% (projection_years + 1) ~ exp((3 * log(lag(qxh, 2)) + 2 * log(lead(qxh, 3))) / 5),
year %in% (projection_years + 2) ~ exp((2 * log(lag(qxh, 3)) + 3 * log(lead(qxh, 2))) / 5),
year %in% (projection_years + 3) ~ exp((4 * log(lag(qxh, 4)) + 1 * log(lead(qxh, 1))) / 5),
TRUE ~ qxh
)
)
# Interpolación para qxm (mujeres)
projection_data_interpolated <- projection_data_interpolated %>%
mutate(
qxm = case_when(
year %in% projection_years ~ exp((4 * log(lag(qxm, 1)) + 1 * log(lead(qxm, 4))) / 5),
year %in% (projection_years + 1) ~ exp((3 * log(lag(qxm, 2)) + 2 * log(lead(qxm, 3))) / 5),
year %in% (projection_years + 2) ~ exp((2 * log(lag(qxm, 3)) + 3 * log(lead(qxm, 2))) / 5),
year %in% (projection_years + 3) ~ exp((4 * log(lag(qxm, 4)) + 1 * log(lead(qxm, 1))) / 5),
TRUE ~ qxm
)
)
# Ordenar por edad y año
projection_data_interpolated <- projection_data_interpolated %>%
arrange(edad, year)
# Resultado final
head(projection_data_interpolated) # Visualizar las primeras filas
## edad year qxh qxm refy
## 1 0 0 0.03432110 NA 0
## 2 0 1 0.03374087 NA 1
## 3 0 2 0.03317045 NA 2
## 4 0 3 0.03260967 NA 3
## 5 0 4 0.03374087 NA 4
## 6 0 5 0.03151640 NA 5
library(ggplot2)
library(dplyr)
# Filtrar los datos para year == 0 y year == 100
data_year_0 <- projection_data_interpolated %>% subset(year == 0)
data_year_100 <- projection_data_interpolated %>% subset(year == 100)
# Crear el gráfico para year == 0
plot_year_0 <- ggplot(data_year_0, aes(x = edad)) +
geom_line(aes(y = qxh, color = "Hombres (qxh)"), size = 1) +
geom_line(aes(y = qxm, color = "Mujeres (qxm)"), size = 1) +
labs(
title = "Tasas de Mortalidad por Edad (Año 0)",
x = "Edad",
y = "Tasas de Mortalidad (qxh y qxm)"
) +
scale_color_manual(values = c("Hombres (qxh)" = "blue", "Mujeres (qxm)" = "red")) +
theme_minimal()
# Crear el gráfico para year == 100
plot_year_100 <- ggplot(data_year_100, aes(x = edad)) +
geom_line(aes(y = qxh, color = "Hombres (qxh)"), size = 1) +
geom_line(aes(y = qxm, color = "Mujeres (qxm)"), size = 1) +
labs(
title = "Tasas de Mortalidad por Edad (Año 100)",
x = "Edad",
y = "Tasas de Mortalidad (qxh y qxm)"
) +
scale_color_manual(values = c("Hombres (qxh)" = "blue", "Mujeres (qxm)" = "red")) +
theme_minimal()
# Mostrar las gráficas
print(plot_year_0)
## Warning: Removed 101 rows containing missing values or values outside the scale range
## (`geom_line()`).
print(plot_year_100)
## Warning: Removed 101 rows containing missing values or values outside the scale range
## (`geom_line()`).
library(dplyr)
# Ordenar por year y edad
projection_data_interpolated <- projection_data_interpolated %>%
arrange(year, edad)
# Cálculo de lx y Lx para hombres
projection_data_interpolated$lxh=0
projection_data_interpolated$Lxh=0
projection_data_interpolated$lxm=0
projection_data_interpolated$Lxm=0
projection_data_interpolated <- projection_data_interpolated %>%
group_by(year) %>%
mutate(
lxh = ifelse(edad == 0, 100000, (1 - lag(qxh)) * lag(lxh)),
Lxh = ifelse(edad < max(edad), (lxh + lead(lxh)) / 2, 0)
) %>%
ungroup()
# Cálculo de lx y Lx para mujeres
projection_data_interpolated <- projection_data_interpolated %>%
group_by(year) %>%
mutate(
lxm = ifelse(edad == 0, 100000, (1 - lag(qxm)) * lag(lxm)),
Lxm = ifelse(edad < max(edad), (lxm + lead(lxm)) / 2, 0)
) %>%
ungroup()
# Cálculo de Tx para hombres (ordenando de mayor a menor edad)
projection_data_interpolated <- projection_data_interpolated %>%
arrange(year, desc(edad)) %>%
group_by(year) %>%
mutate(Txh = cumsum(Lxh)) %>%
ungroup()
# Cálculo de Tx para mujeres (ordenando de mayor a menor edad)
projection_data_interpolated <- projection_data_interpolated %>%
arrange(year, desc(edad)) %>%
group_by(year) %>%
mutate(Txm = cumsum(Lxm)) %>%
ungroup()
# Calcular e(x) para hombres
projection_data_interpolated <- projection_data_interpolated %>%
mutate(
exh = ifelse(lxh > 0, Txh / lxh, 0)
)
# Calcular e(x) para mujeres
projection_data_interpolated <- projection_data_interpolated %>%
mutate(
exm = ifelse(lxm > 0, Txm / lxm, 0)
)
# Generar columna de año y referencia
projection_data_interpolated <- projection_data_interpolated %>%
mutate(
año = 2017 + year,
refañoedad = paste(año, edad, sep = "-")
) %>%
select(año, year, everything())
# Guardar el resultado final en un archivo
write.csv(projection_data_interpolated, "/cloud/project/MORTañosimples.csv", row.names = FALSE)
library(dplyr)
library(ggplot2)
# Cargar el archivo "MORTañosimples.csv"
data <- read.csv("/cloud/project/MORTañosimples.csv")
# Filtrar los datos para year == 0 y year == 100
data_filtered <- data %>%
subset(year == 0 | year == 100) %>%
mutate(
qx1 = qxh,
qx2 = qxm
) %>%
select(edad, year, qx1, qx2) %>%
pivot_longer(cols = starts_with("qx"), names_to = "sexo", values_to = "qx") %>%
mutate(sexo = recode(sexo, "qx1" = "Hombres", "qx2" = "Mujeres"))
data_filtered
## # A tibble: 404 × 4
## edad year sexo qx
## <int> <int> <chr> <dbl>
## 1 100 0 Hombres 1
## 2 100 0 Mujeres NA
## 3 99 0 Hombres 1
## 4 99 0 Mujeres NA
## 5 98 0 Hombres 0.330
## 6 98 0 Mujeres NA
## 7 97 0 Hombres 0.309
## 8 97 0 Mujeres NA
## 9 96 0 Hombres 0.290
## 10 96 0 Mujeres NA
## # ℹ 394 more rows
# Crear el gráfico
plot <- ggplot(data_filtered, aes(x = edad, y = qx, color = factor(year), linetype = factor(year))) +
geom_line(size = 1) +
facet_wrap(~ sexo, scales = "free_y") +
labs(
title = "Probabilidad de fallecimiento (qx) por Edad y Año",
x = "Edad",
y = "Probabilidad de fallecimiento (qx)",
color = "",
linetype = ""
) +
scale_color_manual(values = c("blue", "red"), labels = c("qx - Año 0", "qx - Año 100")) +
scale_linetype_manual(values = c("solid", "dashed"), labels = c("qx - Año 0", "qx - Año 100")) +
scale_x_continuous(breaks = seq(0, 100, by = 10)) +
scale_y_continuous(breaks = seq(0, 1, by = 0.1), limits = c(0, 1)) +
theme_minimal() +
theme(legend.position = "top")
plot
## Warning: Removed 202 rows containing missing values or values outside the scale range
## (`geom_line()`).
# Guardar el gráfico en formato EPS
ggsave("/cloud/project/qxbyageyear.eps", plot = plot, device = "eps", width = 10, height = 6)
## Warning: Removed 202 rows containing missing values or values outside the scale range
## (`geom_line()`).
library(dplyr)
# Establecer el tipo de datos double y el número de observaciones (101 años * 101 edades)
num_years <- 101
num_ages <- 101
# Crear un DataFrame con todas las combinaciones de edades y años
migration_data <- expand.grid(
edad = seq(0, num_ages - 1),
year = seq(0, num_years - 1)
)
library(dplyr)
library(tidyr)
# Definir el número de inmigrantes y emigrantes iniciales
inmig0 <- 24372 # Número de inmigrantes en el año 0
emig0 <- 32496 # Número de emigrantes en el año 0
mignet0 <- inmig0 - emig0 # Migración neta inicial
# Año de estabilización de la migración neta y valor de estabilización
yearestabmig <- 18 # Año en que la migración neta se estabiliza (2035)
mignetestab <- -340 # Valor de la migración neta en el año de estabilización
# Crear la tabla de migración con todas las combinaciones de `year` y `edad`
migration_data <- migration_data %>%
mutate(
inmig0 = inmig0, # Valor constante en todas las filas
emig0 = emig0, # Valor constante en todas las filas
mignet0 = mignet0, # Valor constante en todas las filas
mignet = ifelse(year == 0, mignet0, NA)
)
# Asignar el valor de estabilización en el año de estabilización
migration_data <- migration_data %>%
mutate(
mignet = ifelse(year == yearestabmig, mignetestab, mignet)
)
# Rellenar los valores de `mignet` entre los años
migration_data <- migration_data %>%
arrange(year, edad) %>%
fill(mignet, .direction = "downup") # Rellenar mignet hacia abajo y arriba
# Visualización de los primeros datos
head(migration_data)
## edad year inmig0 emig0 mignet0 mignet
## 1 0 0 24372 32496 -8124 -8124
## 2 1 0 24372 32496 -8124 -8124
## 3 2 0 24372 32496 -8124 -8124
## 4 3 0 24372 32496 -8124 -8124
## 5 4 0 24372 32496 -8124 -8124
## 6 5 0 24372 32496 -8124 -8124
# Calcular la tasa de variación interanual
tvmignet <- (mignetestab - migration_data$mignet0[1]) / (yearestabmig - 0)
# Proyectar la migración neta para todos los años hasta la estabilización
migration_data <- migration_data %>%
arrange(year, edad) %>%
group_by(edad) %>%
mutate(
mignet = ifelse(year > 0 & is.na(mignet), pmin(lag(mignet) + tvmignet, mignetestab), mignet)
) %>%
ungroup()
# Dividir migración neta en hombres y mujeres
migration_data <- migration_data %>%
mutate(
migneth = mignet * 0.5,
mignetm = mignet * 0.5
)
# Visualizar las primeras filas para verificar
head(migration_data)
## # A tibble: 6 × 8
## edad year inmig0 emig0 mignet0 mignet migneth mignetm
## <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0 0 24372 32496 -8124 -8124 -4062 -4062
## 2 1 0 24372 32496 -8124 -8124 -4062 -4062
## 3 2 0 24372 32496 -8124 -8124 -4062 -4062
## 4 3 0 24372 32496 -8124 -8124 -4062 -4062
## 5 4 0 24372 32496 -8124 -8124 -4062 -4062
## 6 5 0 24372 32496 -8124 -8124 -4062 -4062
# Opcional: Graficar migración neta para hombres y mujeres en función del año
library(ggplot2)
plot_mig <- ggplot(migration_data %>% subset(edad == 0), aes(x = year)) +
geom_line(aes(y = migneth, color = "Migración neta hombres"), size = 1) +
geom_line(aes(y = mignetm, color = "Migración neta mujeres"), size = 1) +
labs(
title = "Proyección de Migración Neta",
x = "Años",
y = "Migración Neta",
color = ""
) +
scale_color_manual(values = c("Migración neta hombres" = "blue", "Migración neta mujeres" = "red")) +
theme_minimal()
# Mostrar la gráfica
migration_data
## # A tibble: 10,201 × 8
## edad year inmig0 emig0 mignet0 mignet migneth mignetm
## <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0 0 24372 32496 -8124 -8124 -4062 -4062
## 2 1 0 24372 32496 -8124 -8124 -4062 -4062
## 3 2 0 24372 32496 -8124 -8124 -4062 -4062
## 4 3 0 24372 32496 -8124 -8124 -4062 -4062
## 5 4 0 24372 32496 -8124 -8124 -4062 -4062
## 6 5 0 24372 32496 -8124 -8124 -4062 -4062
## 7 6 0 24372 32496 -8124 -8124 -4062 -4062
## 8 7 0 24372 32496 -8124 -8124 -4062 -4062
## 9 8 0 24372 32496 -8124 -8124 -4062 -4062
## 10 9 0 24372 32496 -8124 -8124 -4062 -4062
## # ℹ 10,191 more rows
library(dplyr)
# Crear parámetros iniciales de migración
emaxmig <- 84
emedemigadulh <- 35
emedemigadulm <- 31
emedemigniñh <- 7
emedemigniñm <- 7
emedinmigadulh <- 32
emedinmigadulm <- 30
emedinmigniñh <- 6
emedinmigniñm <- 6
inmig0 <- 24372 # Número de inmigrantes en el año 0
emig0 <- 32496 # Número de emigrantes en el año 0
# Aplicar valores iniciales a migration_data
migration_data <- migration_data %>%
arrange(year, edad) %>%
mutate(
# Niños hombres inmigrantes
IMhniñx = ifelse(edad < emaxmig, (1 / emedinmigniñh) * exp(-edad / emedinmigniñh), 0),
# Niños hombres emigrantes
EMhniñx = ifelse(edad < emaxmig, (1 / emedemigniñh) * exp(-edad / emedemigniñh), 0),
# Adultos hombres inmigrantes
IMhadulx = ifelse(edad < emaxmig, (1 / (emedinmigadulh - 23)) * exp(-(edad - 23) / (emedinmigadulh - 23) - exp(-0.2 * (edad - 23))), 0),
# Adultos hombres emigrantes
EMhadulx = ifelse(edad < emaxmig, (1 / (emedemigadulh - 23)) * exp(-(edad - 23) / (emedemigadulh - 23) - exp(-0.2 * (edad - 23))), 0),
# Niñas mujeres inmigrantes
IMmniñx = ifelse(edad < emaxmig, (1 / emedinmigniñm) * exp(-edad / emedinmigniñm), 0),
# Niñas mujeres emigrantes
EMmniñx = ifelse(edad < emaxmig, (1 / emedemigniñm) * exp(-edad / emedemigniñm), 0),
# Adultos mujeres inmigrantes
IMmadulx = ifelse(edad < emaxmig, (1 / (emedinmigadulm - 23)) * exp(-(edad - 23) / (emedinmigadulm - 23) - exp(-0.2 * (edad - 23))), 0),
# Adultos mujeres emigrantes
EMmadulx = ifelse(edad < emaxmig, (1 / (emedemigadulm - 23)) * exp(-(edad - 23) / (emedemigadulm - 23) - exp(-0.2 * (edad - 23))), 0)
) %>%
group_by(year) %>%
mutate(
sumIMhniñx = sum(IMhniñx),
sumEMhniñx = sum(EMhniñx),
sumIMhadulx = sum(IMhadulx),
sumEMhadulx = sum(EMhadulx),
sumIMmniñx = sum(IMmniñx),
sumEMmniñx = sum(EMmniñx),
sumIMmadulx = sum(IMmadulx),
sumEMmadulx = sum(EMmadulx)
) %>%
ungroup()
# Definir parámetros adicionales
RSemigadu <- 1
RSinmigadu <- 1
RSemigniñ <- 1
RSinmigniñ <- 1
Wemigm <- 0.1
Winmigm <- 0.1
Wemigh <- (Wemigm * RSemigniñ) / (Wemigm * RSemigniñ + (1 - Wemigm) * RSemigadu)
Winmigh <- (Winmigm * RSinmigniñ) / (Winmigm * RSinmigniñ + (1 - Winmigm) * RSinmigadu)
SRemig <- (1 - Wemigm) / (1 - Wemigh) * RSemigadu
SRinmig <- (1 - Winmigm) / (1 - Winmigh)
Im <- inmig0 / (1 + SRinmig)
Em <- emig0 / (1 + SRemig)
Nm <- Im - Em
Km <- Im / Em
Ih <- inmig0 - Im
Eh <- emig0 - Em
Nh <- Ih - Eh
Kh <- Ih / Eh
# Números de inmigrantes por edades simples en el año cero para hombres y mujeres
migration_data <- migration_data %>%
mutate(
nroinmighx0 = Nh * Kh / (Kh - 1) * (Winmigh * IMhniñx / sumIMhniñx + (1 - Winmigh) * IMhadulx / sumIMhadulx),
nroemighx0 = Nh * 1 / (Kh - 1) * (Wemigh * EMhniñx / sumEMhniñx + (1 - Wemigh) * EMhadulx / sumEMhadulx),
saldomighx0 = nroinmighx0 - nroemighx0,
nroinmigmx0 = Nm * Km / (Km - 1) * (Winmigm * IMmniñx / sumIMmniñx + (1 - Winmigm) * IMmadulx / sumIMmadulx),
nroemigmx0 = Nm * 1 / (Km - 1) * (Wemigm * EMmniñx / sumEMmniñx + (1 - Wemigm) * EMmadulx / sumEMmadulx),
saldomigmx0 = nroinmigmx0 - nroemigmx0
) %>%
group_by(year) %>%
mutate(
Tsaldomighx0 = sum(saldomighx0),
Tsaldomigmx0 = sum(saldomigmx0)
) %>%
ungroup()
# Proyecciones del saldo neto migratorio para los cien años y por edades simples
migration_data <- migration_data %>%
mutate(
saldomighx = (saldomighx0 / Tsaldomighx0) * migneth,
saldomigmx = (saldomigmx0 / Tsaldomigmx0) * mignetm,
refyearedad = paste(year, edad, sep = "-"),
refañoedad = paste(year, edad, sep = "-")
)
# Guardar el resultado final
write.csv(migration_data, "/cloud/project/MIGañosimples.csv", row.names = FALSE)
library(dplyr)
library(ggplot2)
# Cargar el archivo "MIGañosimples.csv"
migration_data <- read.csv("/cloud/project/MIGañosimples.csv")
# Filtrar los datos para `year == 0` y `year == 100` y seleccionar las columnas necesarias
migration_data_filtered <- migration_data %>%
subset(year == 0 | year == 100) %>%
select(edad, year, saldomighx, saldomigmx, mignet) %>%
rename(
saldomig1 = saldomighx,
saldomig2 = saldomigmx
) %>%
pivot_longer(cols = starts_with("saldomig"), names_to = "sexo", values_to = "saldomig") %>%
mutate(
sexo = recode(sexo, "saldomig1" = "Hombres", "saldomig2" = "Mujeres"),
year = recode(year, "0" = "Año 0", "100" = "Año 100")
)
# Crear el gráfico
plot <- ggplot(migration_data_filtered, aes(x = edad, y = saldomig, color = sexo)) +
geom_line(size = 1) +
facet_wrap(~ year, scales = "free_y", labeller = as_labeller(c("Año 0" = "Año 0", "Año 100" = "Año 100"))) +
labs(
title = "Saldo neto migratorio por Edad y Sexo",
x = "Edad",
y = "Saldo neto migratorio",
color = ""
) +
scale_color_manual(values = c("Hombres" = "blue", "Mujeres" = "red")) +
scale_x_continuous(breaks = seq(0, 100, by = 10)) +
scale_y_continuous(breaks = seq(-200, 100, by = 20), limits = c(-200, 100)) +
theme_minimal() +
theme(legend.position = "top")
plot
# Guardar el gráfico en formato EPS
ggsave("/cloud/project/saldonetomigbyagesexo.eps", plot = plot, device = "eps", width = 10, height = 6)
library(dplyr)
library(ggplot2)
# Cargar el archivo "MIGañosimples.csv"
migration_data <- read.csv("/cloud/project/MIGañosimples.csv")
# Filtrar las columnas necesarias y eliminar duplicados en `year`
migration_data_filtered <- migration_data %>%
select(year, mignet) %>%
distinct(year, .keep_all = TRUE)
# Crear el gráfico
plot <- ggplot(migration_data_filtered, aes(x = year, y = mignet)) +
geom_line(color = "blue", size = 1) +
labs(
title = "Saldo neto migratorio",
x = "Años",
y = "Saldo neto migratorio"
) +
scale_x_continuous(breaks = seq(0, 100, by = 10)) +
scale_y_continuous(breaks = seq(-10000, 0, by = 1000), limits = c(-10000, 0)) +
theme_minimal()
plot
# Guardar el gráfico en formato EPS
ggsave("/cloud/project/saldonetomigbyyear.eps", plot = plot, device = "eps", width = 10, height = 6)
# Cargar las librerías necesarias
library(dplyr)
library(purrr)
library(tidyr)
# Paso 1: Crear la tabla de edades y asignar grupos de edad
population_data <- data.frame(edad = 0:100)
# Asignar grupos de edad (gq)
population_data <- population_data %>%
mutate(
gq = case_when(
edad >= 0 & edad <= 4 ~ 0,
edad >= 5 & edad <= 9 ~ 1,
edad >= 10 & edad <= 14 ~ 2,
edad >= 15 & edad <= 19 ~ 3,
edad >= 20 & edad <= 24 ~ 4,
edad >= 25 & edad <= 29 ~ 5,
edad >= 30 & edad <= 34 ~ 6,
edad >= 35 & edad <= 39 ~ 7,
edad >= 40 & edad <= 44 ~ 8,
edad >= 45 & edad <= 49 ~ 9,
edad >= 50 & edad <= 54 ~ 10,
edad >= 55 & edad <= 59 ~ 11,
edad >= 60 & edad <= 64 ~ 12,
edad >= 65 & edad <= 69 ~ 13,
edad >= 70 & edad <= 74 ~ 14,
edad >= 75 & edad <= 79 ~ 15,
edad >= 80 & edad <= 84 ~ 16,
edad >= 85 & edad <= 89 ~ 17,
edad >= 90 & edad <= 94 ~ 18,
edad >= 95 & edad <= 100 ~ 19
)
)
# Paso 2: Crear la población inicial para hombres y mujeres por grupo de edad
poblacion_inicial <- data.frame(
gq = 0:19,
gqh = c(239129, 279818, 268403, 262270, 255428, 260214, 249383, 225660, 204444, 159044,
152208, 134208, 120525, 96450, 64914, 42739, 25009, 11721, 4734, 1373),
gqm = c(226542, 262484, 252654, 252880, 258170, 269525, 254748, 226796, 202897, 159490,
152717, 135487, 121119, 98110, 68805, 49345, 32478, 16907, 8264, 2811),
stringsAsFactors = FALSE
)
# Paso 3: Unir datos de población inicial a los grupos de edad en population_data
population_data <- population_data %>%
left_join(poblacion_inicial, by = "gq")
# Paso 4: Visualizar la distribución inicial de la población para hombres y mujeres
ggplot(population_data, aes(x = gq)) +
geom_line(aes(y = gqh, color = "Hombres")) +
geom_line(aes(y = gqm, color = "Mujeres")) +
labs(x = "Grupo de Edad", y = "Población",
title = "Distribución Inicial de la Población por Grupo de Edad para Hombres y Mujeres") +
scale_x_continuous(breaks = 0:19, labels = c("0-4", "5-9", "10-14", "15-19", "20-24",
"25-29", "30-34", "35-39", "40-44", "45-49",
"50-54", "55-59", "60-64", "65-69", "70-74",
"75-79", "80-84", "85-89", "90-94", "95+")) +
scale_color_manual(values = c("Hombres" = "blue", "Mujeres" = "red")) +
theme_minimal()
# Paso 3: Unir la población inicial al DataFrame principal
population_data <- population_data %>%
left_join(poblacion_inicial, by = "gq")
# Paso 4: Pivotar la población inicial para obtener columnas por grupo de edad y sexo
poblacion_inicial_pivot <- poblacion_inicial %>%
pivot_longer(cols = c(gqh, gqm), names_to = "sexo", values_to = "poblacion") %>%
pivot_wider(names_from = c(sexo, gq), values_from = poblacion, names_sep = "") %>%
mutate(across(everything(), as.numeric))
# Paso 5: Añadir estas columnas al DataFrame principal
population_data <- bind_cols(population_data, poblacion_inicial_pivot[rep(1, nrow(population_data)), -1])
# Paso 6: Asegurarse de que las columnas de población son numéricas
cols_poblacion <- grep("^(gqh|gqm)\\d+$", names(population_data), value = TRUE)
population_data[cols_poblacion] <- lapply(population_data[cols_poblacion], as.numeric)
# Paso 7: Definir los coeficientes para cada edad (reemplaza con tus coeficientes reales)
num_ages <- 101
coeficientes_h <- list()
coeficientes_m <- list()
coeficientes_h <- list(
c(0.2224, -0.024, 0.0016, 0, 0),
c(0.2352, -0.0416, 0.0064, 0, 0),
c(0.2272, -0.0336, 0.0064, 0, 0),
c(0.1872, 0.0144, -0.0016, 0, 0),
c(0.128, 0.0848, -0.0128, 0, 0),
c(0.072, 0.1504, -0.024, 0.0016, 0),
c(0.0128, 0.2224, -0.0416, 0.0064, 0),
c(-0.0272, 0.2544, -0.0336, 0.0064, 0),
c(-0.0352, 0.2224, 0.0144, -0.0016, 0),
c(-0.0224, 0.1504, 0.0848, -0.0128, 0),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0224, 0.1504, 0.0848, -0.0128, 0),
c(-0.0352, 0.2224, 0.0144, -0.0016, 0),
c(-0.0272, 0.2544, -0.0336, 0.0064, 0),
c(0.0128, 0.2224, -0.0416, 0.0064, 0),
c(0.072, 0.1504, -0.024, 0.0016, 0),
c(0.128, 0.0848, -0.0128, 0, 0),
c(0.1872, 0.0144, -0.0016, 0, 0),
c(0.2272, -0.0336, 0.0064, 0, 0),
c(0.2352, -0.0416, 0.0064, 0, 0),
c(0.2224, -0.024, 0.0016, 0, 0),
c(0, 0, 0, 0, 0),
c(0, 0, 0, 0, 0),
c(0, 0, 0, 0, 0)
)
# Define los coeficientes para cada edad completa en pesM
coeficientes_m <- list(
c(0.2224, -0.024, 0.0016, 0, 0),
c(0.2352, -0.0416, 0.0064, 0, 0),
c(0.2272, -0.0336, 0.0064, 0, 0),
c(0.1872, 0.0144, -0.0016, 0, 0),
c(0.128, 0.0848, -0.0128, 0, 0),
c(0.072, 0.1504, -0.024, 0.0016, 0),
c(0.0128, 0.2224, -0.0416, 0.0064, 0),
c(-0.0272, 0.2544, -0.0336, 0.0064, 0),
c(-0.0352, 0.2224, 0.0144, -0.0016, 0),
c(-0.0224, 0.1504, 0.0848, -0.0128, 0),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0128, 0.0848, 0.1504, -0.024, 0.0016),
c(-0.0016, 0.0144, 0.2224, -0.0416, 0.0064),
c(0.0064, -0.0336, 0.2544, -0.0336, 0.0064),
c(0.0064, -0.0416, 0.2224, 0.0144, -0.0016),
c(0.0016, -0.024, 0.1504, 0.0848, -0.0128),
c(-0.0224, 0.1504, 0.0848, -0.0128, 0),
c(-0.0352, 0.2224, 0.0144, -0.0016, 0),
c(-0.0272, 0.2544, -0.0336, 0.0064, 0),
c(0.0128, 0.2224, -0.0416, 0.0064, 0),
c(0.072, 0.1504, -0.024, 0.0016, 0),
c(0.128, 0.0848, -0.0128, 0, 0),
c(0.1872, 0.0144, -0.0016, 0, 0),
c(0.2272, -0.0336, 0.0064, 0, 0),
c(0.2352, -0.0416, 0.0064, 0, 0),
c(0.2224, -0.024, 0.0016, 0, 0),
c(0, 0, 0, 0, 0),
c(0, 0, 0, 0, 0)
)
library("splines")
# Desagregar por edades simples
# clear
# set obs 101 /*101 años de proy* 101 edades*/
# Interpolación spline para Hombres
edad <- 0:100 # rango completo de edades
data <- data.frame(edad = edad)
# sort edad (already sorted)
# sort edad (already sorted)
# lab var edad "Edades" # In R, variable labels are not standard, but we can proceed
# Agrupacion de las edades
data$gq <- NA
data$gq[data$edad >= 0 & data$edad <= 4] <- 0
data$gq[data$edad >= 5 & data$edad <= 9] <- 1
data$gq[data$edad >= 10 & data$edad <= 14] <- 2
data$gq[data$edad >= 15 & data$edad <= 19] <- 3
data$gq[data$edad >= 20 & data$edad <= 24] <- 4
data$gq[data$edad >= 25 & data$edad <= 29] <- 5
data$gq[data$edad >= 30 & data$edad <= 34] <- 6
data$gq[data$edad >= 35 & data$edad <= 39] <- 7
data$gq[data$edad >= 40 & data$edad <= 44] <- 8
data$gq[data$edad >= 45 & data$edad <= 49] <- 9
data$gq[data$edad >= 50 & data$edad <= 54] <- 10
data$gq[data$edad >= 55 & data$edad <= 59] <- 11
data$gq[data$edad >= 60 & data$edad <= 64] <- 12
data$gq[data$edad >= 65 & data$edad <= 69] <- 13
data$gq[data$edad >= 70 & data$edad <= 74] <- 14
data$gq[data$edad >= 75 & data$edad <= 79] <- 15
data$gq[data$edad >= 80 & data$edad <= 84] <- 16
data$gq[data$edad >= 85 & data$edad <= 89] <- 17
data$gq[data$edad >= 90 & data$edad <= 94] <- 18
data$gq[data$edad >= 95 & data$edad <= 200] <- 19
# DATOS DE LA POBLACION INICIAL
data$gqh <- NA
data$gqm <- NA
# Valores de gqh para hombres y gqm para mujeres según los datos proporcionados
gqh_values <- c(239129, 279818, 268403, 262270, 255428, 260214, 249383, 225660, 204444, 159044,
152208, 134208, 120525, 96450, 64914, 42739, 25009, 11721, 4734, 1373)
gqm_values <- c(226542, 262484, 252654, 252880, 258170, 269525, 254748, 226796, 202897, 159490,
152717, 135487, 121119, 98110, 68805, 49345, 32478, 16907, 8264, 2811)
# Asignar los valores de gqh y gqm a los grupos de edad en la columna `data$gq`
for (i in 0:19) {
data$gqh[data$gq == i] <- gqh_values[i + 1]
data$gqm[data$gq == i] <- gqm_values[i + 1]
}
# PONDERADORES
gqh_values <- tapply(data$gqh, data$gq, unique)
names(gqh_values) <- paste0('gqh', 0:19)
gqm_values <- tapply(data$gqm, data$gq, unique)
names(gqm_values) <- paste0('gqm', 0:19)
# Install and load the 'DemoTools' package
# install.packages("DemoTools") # Uncomment if not installed
# #remotes::install_github("timriffe/DemoTools")
#install.packages("remotes")
library("DemoToolsData")
# Prepare grouped data for Sprague interpolation
ages_grouped <- seq(0, 95, 5)
pop_gqh <- as.numeric(gqh_values)
pop_gqm <- as.numeric(gqm_values)
pesH <- spline(ages_grouped, pop_gqh, xout = edad)$y
# Interpolación spline para Mujeres
pesM <- spline(ages_grouped, pop_gqm, xout = edad)$y
data$pesH <- pesH[1:101]
# Apply Sprague interpolation for Mujeres
# Interpolación spline para Mujeres
pesM <- spline(ages_grouped, pop_gqm, xout = edad)$y
pesM <- as.numeric(pesM)
data$pesM <- pesM[1:101]
# Total populations
pobtotalH <- sum(data$pesH, na.rm = TRUE)
pobtotalM <- sum(data$pesM, na.rm = TRUE)
pobtot <- pobtotalH + pobtotalM
# Keep only certain variables
data <- data[, c('pesH', 'pesM', 'edad', 'gqh', 'gqm')]
# Generate cero=0
data$cero <- 0
# Generate refyearedad=concat(cero edad), punct("-")
data$refyearedad <- paste0(data$cero, "-", data$edad)
# Rename pesH to pesHy0 and pesM to pesMy0
names(data)[names(data) == 'pesH'] <- 'pesHy0'
names(data)[names(data) == 'pesM'] <- 'pesMy0'
# Generate ref
selected_ages <- c(2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57, 62, 67, 72, 77, 82, 87, 92, 97)
data$ref <- ifelse(data$edad %in% selected_ages, data$edad, NA)
# Replace gqh and gqm with NA where ref is NA
data$gqh[is.na(data$ref)] <- NA
data$gqm[is.na(data$ref)] <- NA
dataes <- data
# Plotting Hombres
library(ggplot2)
ggplot(data, aes(x = edad)) +
geom_line(aes(y = pesHy0), color = "blue") +
geom_point(aes(y = gqh), color = "red") +
scale_y_continuous(breaks = seq(0, 400000, 50000), limits = range(c(data$pesHy0, data$gqh), na.rm = TRUE)) +
scale_x_continuous(breaks = seq(0, 100, 10)) +
labs(x = "Edades", y = "Población",
title = "Hombres - Total Ajustado por edades simples y Total observado por grupo") +
theme_minimal()
## Warning: Removed 81 rows containing missing values or values outside the scale range
## (`geom_point()`).
# Plotting Mujeres
ggplot(data, aes(x = edad)) +
geom_line(aes(y = pesMy0), color = "blue") +
geom_point(aes(y = gqm), color = "red") +
scale_y_continuous(breaks = seq(0, 400000, 50000), limits = c(0, 400000)) +
scale_x_continuous(breaks = seq(0, 100, 10)) +
labs(x = "Edades", y = "Población",
title = "Mujeres - Total Ajustado por edades simples y Total observado por grupo") +
theme_minimal()
## Warning: Removed 3 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Removed 81 rows containing missing values or values outside the scale range
## (`geom_point()`).
# Save the data
save(data, file = "/cloud/project/pobdesag0a100.RData")
str(dataes)
## 'data.frame': 101 obs. of 8 variables:
## $ pesHy0 : num 239129 254514 265816 273495 278009 ...
## $ pesMy0 : num 226542 240369 250430 257172 261041 ...
## $ edad : int 0 1 2 3 4 5 6 7 8 9 ...
## $ gqh : num NA NA 239129 NA NA ...
## $ gqm : num NA NA 226542 NA NA ...
## $ cero : num 0 0 0 0 0 0 0 0 0 0 ...
## $ refyearedad: chr "0-0" "0-1" "0-2" "0-3" ...
## $ ref : int NA NA 2 NA NA NA NA 7 NA NA ...
# Load necessary libraries
library(dplyr)
library(tidyr)
library(ggplot2)
# Create a data frame with ages from 0 to 100 and years from 0 to 100
ages <- 0:100
years <- 0:100
# Create a data frame with all combinations of year and age
data <- expand.grid(year = years, edad = ages)
# Sort by age and year
data <- data[order(data$edad, data$year), ]
# Create refyearedad as a combination of year and edad
data$refyearedad <- paste(data$year, data$edad, sep = "-")
# -------------------------------------INICIO DATOS AÑO 0--------------------------------------------#
# Load initial population data for year 0
# Since we don't have the actual data, we'll create sample data
# Let's assume initial population counts for males and females
# Merge initial population data with the main data frame
#data <- merge(data, initial_pop, by = "edad", all.x = TRUE)
head(data)
## year edad refyearedad
## 1 0 0 0-0
## 2 1 0 1-0
## 3 2 0 2-0
## 4 3 0 3-0
## 5 4 0 4-0
## 6 5 0 5-0
# Merge fertility rates into the main data frame
data <- merge(data, dataes[, c("refyearedad", "pesHy0", "pesMy0")], by = "refyearedad", all.x = TRUE)
# Ordenar de nuevo por edad y año para aplicar la función `fill`
data <- data %>%
arrange(edad, year) %>% # Ordenar por edad y año
group_by(edad) %>% # Agrupar por edad
fill(pesHy0, pesMy0, .direction = "downup") %>% # Rellenar valores de arriba hacia abajo y de abajo hacia arriba
ungroup() # Desagrupar para volver a un data frame plano
# Revisar el resultado
head(data)
## # A tibble: 6 × 5
## refyearedad year edad pesHy0 pesMy0
## <chr> <int> <int> <dbl> <dbl>
## 1 0-0 0 0 239129 226542
## 2 1-0 1 0 239129 226542
## 3 2-0 2 0 239129 226542
## 4 3-0 3 0 239129 226542
## 5 4-0 4 0 239129 226542
## 6 5-0 5 0 239129 226542
tail(data)
## # A tibble: 6 × 5
## refyearedad year edad pesHy0 pesMy0
## <chr> <int> <int> <dbl> <dbl>
## 1 95-100 95 100 -1277. -3774.
## 2 96-100 96 100 -1277. -3774.
## 3 97-100 97 100 -1277. -3774.
## 4 98-100 98 100 -1277. -3774.
## 5 99-100 99 100 -1277. -3774.
## 6 100-100 100 100 -1277. -3774.
# Replace pesHy0 and pesMy0 with NA for years > 0
#data$pesHy0[data$year > 0] <- NA
#data$pesMy0[data$year > 0] <- NA
# Load fertility rates (tfertes)
# We'll create sample fertility rates
fertility_data <- expand.grid(
year = years,
edad = ages
)
fertility_data$tfertes <- ifelse(fertility_data$edad >= 15 & fertility_data$edad <= 49,
runif(nrow(fertility_data), 0.01, 0.05), 0)
fertility_data$refyearedad <- paste(fertility_data$year, fertility_data$edad, sep = "-")
# Merge fertility rates into the main data frame
data <- merge(data, fertility_data[, c("refyearedad", "tfertes")], by = "refyearedad", all.x = TRUE)
# Set sex ratio at birth (tasamascy0)
data$tasamascy0 <- 1.0170673350506
# Sex ratio remains constant over the years
data$tasamasc <- data$tasamascy0
# Load net migration values (saldomighx, saldomigmx)
migration_data <- expand.grid(
year = years,
edad = ages
)
migration_data$saldomighx <- runif(nrow(migration_data), -100, 100)
migration_data$saldomigmx <- runif(nrow(migration_data), -100, 100)
migration_data$refyearedad <- paste(migration_data$year, migration_data$edad, sep = "-")
# Merge migration data into the main data frame
data <- merge(data, migration_data[, c("refyearedad", "saldomighx", "saldomigmx")], by = "refyearedad", all.x = TRUE)
# Load mortality rates (qxh, qxm)
mortality_data <- expand.grid(
year = years,
edad = ages
)
mortality_data$qxh <- pmin(1, mortality_data$edad / 1000)
mortality_data$qxm <- pmin(1, mortality_data$edad / 1000)
mortality_data$refyearedad <- paste(mortality_data$year, mortality_data$edad, sep = "-")
# Merge mortality rates into the main data frame
data <- merge(data, mortality_data[, c("refyearedad", "qxh", "qxm")], by = "refyearedad", all.x = TRUE)
# Initialize pesH and pesM for year 0
data$pesH <- ifelse(data$year == 0, data$pesHy0, 0)
data$pesM <- ifelse(data$year == 0, data$pesMy0, 0)
# Calculate recnac (number of births) for year 0 and age 0
data$recnac <- ifelse(data$year == 0 & data$edad == 0, data$pesH + data$pesM, 0)
data$recnach <- ifelse(data$year == 0 & data$edad == 0, data$pesH, 0)
data$recnacm <- ifelse(data$year == 0 & data$edad == 0, data$pesM, 0)
# -------------------------------------FIN DATOS AÑO 0--------------------------------------------#
# -------------------------------------INICIO PROYECCIÓN--------------------------------------------#
# Función corregida para calcular las proyecciones de población
project_population <- function(data, years_to_project) {
for (current_year in 1:years_to_project) {
previous_year <- current_year - 1
# Datos del año previo, ajustando la edad
data_prev <- data %>%
filter(year == previous_year) %>%
arrange(edad) %>%
mutate(
edad = edad + 1 # Incrementar la edad en 1 para el desplazamiento correcto
) %>%
select(edad, pesH_prev = pesH, pesM_prev = pesM, qxh_prev = qxh, qxm_prev = qxm)
# Unir datos del año previo con el actual, uniendo por 'edad'
data <- data %>%
left_join(data_prev, by = "edad")
# Actualizar población para edades mayores o iguales a 1 y menores o iguales a 100
data <- data %>%
mutate(
pesH = ifelse(
year == current_year & edad >= 1 & edad <= 100,
pesH_prev * (1 - qxh_prev) + saldomighx,
pesH
),
pesM = ifelse(
year == current_year & edad >= 1 & edad <= 100,
pesM_prev * (1 - qxm_prev) + saldomigmx,
pesM
)
)
# Manejar la población de edad 100 (límite superior)
data <- data %>%
mutate(
pesH = ifelse(
year == current_year & edad == 100,
pesH[year == current_year & edad == 100] + pesH_prev[edad == 100] * qxh_prev[edad == 100],
pesH
),
pesM = ifelse(
year == current_year & edad == 100,
pesM[year == current_year & edad == 100] + pesM_prev[edad == 100] * qxm_prev[edad == 100],
pesM
)
)
# Eliminar variables temporales
data <- data %>% select(-pesH_prev, -pesM_prev, -qxh_prev, -qxm_prev)
# Calcular nacimientos para el año actual
data_previous_year <- data %>% filter(year == previous_year)
nacimientos <- data_previous_year %>%
filter(edad >= 15 & edad <= 49) %>%
mutate(nacimientos = pesM * tfertes) %>%
summarize(total_nacimientos = sum(nacimientos, na.rm = TRUE)) %>%
pull(total_nacimientos)
# Distribuir nacimientos por sexo
tasamasc_current <- data$tasamasc[data$year == current_year & data$edad == 0][1]
recnach_current <- nacimientos * tasamasc_current / (1 + tasamasc_current)
recnacm_current <- nacimientos - recnach_current
# Actualizar población para edad 0
data <- data %>%
mutate(
pesH = ifelse(
year == current_year & edad == 0,
recnach_current * (1 - 0.5 * qxh) + saldomighx,
pesH
),
pesM = ifelse(
year == current_year & edad == 0,
recnacm_current * (1 - 0.5 * qxm) + saldomigmx,
pesM
)
)
}
return(data)
}
# -------------------------------------FIN PROYECCIÓN--------------------------------------------#
# Cargar las librerías necesarias
library(dplyr)
library(ggplot2)
library(tidyr)
# Suponiendo que 'data' es tu DataFrame con las proyecciones de población
# Filtrar los datos para los años 0 y 100
population_pyramid_data <- data %>%
subset(year %in% c(0, 100)) %>%
select(year, edad, pesH, pesM)
# Preparar los datos para la gráfica
# Para la pirámide poblacional, se suelen representar los hombres con valores negativos
population_pyramid_data <- population_pyramid_data %>%
mutate(
pesH = -pesH # Convertir la población masculina a negativa
)
# Convertir los datos a formato largo
population_pyramid_long <- population_pyramid_data %>%
gather(key = "sexo", value = "poblacion", pesH, pesM)
# Ajustar la variable 'sexo' y crear una variable combinada de 'sexo' y 'year' para el color
population_pyramid_long <- population_pyramid_long %>%
mutate(
sexo = ifelse(sexo == "pesH", "Hombres", "Mujeres"),
year = factor(year, levels = c(0, 100), labels = c("Año 0", "Año 100")),
grupo = interaction(sexo, year)
)
population_pyramid_long
## year edad sexo poblacion grupo
## 1 Año 0 0 Hombres -239129.0000 Hombres.Año 0
## 2 Año 0 1 Hombres -254513.7054 Hombres.Año 0
## 3 Año 0 10 Hombres -268403.0000 Hombres.Año 0
## 4 Año 0 100 Hombres 1276.8661 Hombres.Año 0
## 5 Año 0 11 Hombres -266408.1520 Hombres.Año 0
## 6 Año 0 12 Hombres -265116.0778 Hombres.Año 0
## 7 Año 0 13 Hombres -264208.1275 Hombres.Año 0
## 8 Año 0 14 Hombres -263365.6515 Hombres.Año 0
## 9 Año 0 15 Hombres -262270.0000 Hombres.Año 0
## 10 Año 0 16 Hombres -260711.2163 Hombres.Año 0
## 11 Año 0 17 Hombres -258914.1159 Hombres.Año 0
## 12 Año 0 18 Hombres -257212.2073 Hombres.Año 0
## 13 Año 0 19 Hombres -255938.9992 Hombres.Año 0
## 14 Año 0 2 Hombres -265815.8701 Hombres.Año 0
## 15 Año 0 20 Hombres -255428.0000 Hombres.Año 0
## 16 Año 0 21 Hombres -255886.5988 Hombres.Año 0
## 17 Año 0 22 Hombres -257017.7067 Hombres.Año 0
## 18 Año 0 23 Hombres -258398.1151 Hombres.Año 0
## 19 Año 0 24 Hombres -259604.6157 Hombres.Año 0
## 20 Año 0 25 Hombres -260214.0000 Hombres.Año 0
## 21 Año 0 26 Hombres -259882.1885 Hombres.Año 0
## 22 Año 0 27 Hombres -258581.6175 Hombres.Año 0
## 23 Año 0 28 Hombres -256363.8522 Hombres.Año 0
## 24 Año 0 29 Hombres -253280.4580 Hombres.Año 0
## 25 Año 0 3 Hombres -273494.5821 Hombres.Año 0
## 26 Año 0 30 Hombres -249383.0000 Hombres.Año 0
## 27 Año 0 31 Hombres -244772.4073 Hombres.Año 0
## 28 Año 0 32 Hombres -239747.0635 Hombres.Año 0
## 29 Año 0 33 Hombres -234654.7161 Hombres.Año 0
## 30 Año 0 34 Hombres -229843.1125 Hombres.Año 0
## 31 Año 0 35 Hombres -225660.0000 Hombres.Año 0
## 32 Año 0 36 Hombres -222277.9344 Hombres.Año 0
## 33 Año 0 37 Hombres -219168.7045 Hombres.Año 0
## 34 Año 0 38 Hombres -215628.9074 Hombres.Año 0
## 35 Año 0 39 Hombres -210955.1402 Hombres.Año 0
## 36 Año 0 4 Hombres -278008.9294 Hombres.Año 0
## 37 Año 0 40 Hombres -204444.0000 Hombres.Año 0
## 38 Año 0 41 Hombres -195706.7672 Hombres.Año 0
## 39 Año 0 42 Hombres -185613.4546 Hombres.Año 0
## 40 Año 0 43 Hombres -175348.7585 Hombres.Año 0
## 41 Año 0 44 Hombres -166097.3749 Hombres.Año 0
## 42 Año 0 45 Hombres -159044.0000 Hombres.Año 0
## 43 Año 0 46 Hombres -155005.3010 Hombres.Año 0
## 44 Año 0 47 Hombres -153325.8292 Hombres.Año 0
## 45 Año 0 48 Hombres -152982.1068 Hombres.Año 0
## 46 Año 0 49 Hombres -152950.6563 Hombres.Año 0
## 47 Año 0 5 Hombres -279818.0000 Hombres.Año 0
## 48 Año 0 50 Hombres -152208.0000 Hombres.Año 0
## 49 Año 0 51 Hombres -149988.2849 Hombres.Año 0
## 50 Año 0 52 Hombres -146556.1568 Hombres.Año 0
## 51 Año 0 53 Hombres -142433.8862 Hombres.Año 0
## 52 Año 0 54 Hombres -138143.7438 Hombres.Año 0
## 53 Año 0 55 Hombres -134208.0000 Hombres.Año 0
## 54 Año 0 56 Hombres -131008.1275 Hombres.Año 0
## 55 Año 0 57 Hombres -128362.4078 Hombres.Año 0
## 56 Año 0 58 Hombres -125948.3242 Hombres.Año 0
## 57 Año 0 59 Hombres -123443.3605 Hombres.Año 0
## 58 Año 0 6 Hombres -279413.2876 Hombres.Año 0
## 59 Año 0 60 Hombres -120525.0000 Hombres.Año 0
## 60 Año 0 61 Hombres -116934.7730 Hombres.Año 0
## 61 Año 0 62 Hombres -112670.3962 Hombres.Año 0
## 62 Año 0 63 Hombres -107793.6328 Hombres.Año 0
## 63 Año 0 64 Hombres -102366.2463 Hombres.Año 0
## 64 Año 0 65 Hombres -96450.0000 Hombres.Año 0
## 65 Año 0 66 Hombres -90132.3885 Hombres.Año 0
## 66 Año 0 67 Hombres -83603.8315 Hombres.Año 0
## 67 Año 0 68 Hombres -77080.4804 Hombres.Año 0
## 68 Año 0 69 Hombres -70778.4862 Hombres.Año 0
## 69 Año 0 7 Hombres -277415.9090 Hombres.Año 0
## 70 Año 0 70 Hombres -64914.0000 Hombres.Año 0
## 71 Año 0 71 Hombres -59647.3292 Hombres.Año 0
## 72 Año 0 72 Hombres -54915.4056 Hombres.Año 0
## 73 Año 0 73 Hombres -50599.3175 Hombres.Año 0
## 74 Año 0 74 Hombres -46580.1529 Hombres.Año 0
## 75 Año 0 75 Hombres -42739.0000 Hombres.Año 0
## 76 Año 0 76 Hombres -38980.6869 Hombres.Año 0
## 77 Año 0 77 Hombres -35305.0019 Hombres.Año 0
## 78 Año 0 78 Hombres -31735.4735 Hombres.Año 0
## 79 Año 0 79 Hombres -28295.6301 Hombres.Año 0
## 80 Año 0 8 Hombres -274479.3866 Hombres.Año 0
## 81 Año 0 80 Hombres -25009.0000 Hombres.Año 0
## 82 Año 0 81 Hombres -21899.2993 Hombres.Año 0
## 83 Año 0 82 Hombres -18990.9947 Hombres.Año 0
## 84 Año 0 83 Hombres -16308.7404 Hombres.Año 0
## 85 Año 0 84 Hombres -13877.1907 Hombres.Año 0
## 86 Año 0 85 Hombres -11721.0000 Hombres.Año 0
## 87 Año 0 86 Hombres -9855.2278 Hombres.Año 0
## 88 Año 0 87 Hombres -8256.5553 Hombres.Año 0
## 89 Año 0 88 Hombres -6892.0689 Hombres.Año 0
## 90 Año 0 89 Hombres -5728.8550 Hombres.Año 0
## 91 Año 0 9 Hombres -271257.2428 Hombres.Año 0
## 92 Año 0 90 Hombres -4734.0000 Hombres.Año 0
## 93 Año 0 91 Hombres -3876.5093 Hombres.Año 0
## 94 Año 0 92 Hombres -3133.0639 Hombres.Año 0
## 95 Año 0 93 Hombres -2482.2639 Hombres.Año 0
## 96 Año 0 94 Hombres -1902.7093 Hombres.Año 0
## 97 Año 0 95 Hombres -1373.0000 Hombres.Año 0
## 98 Año 0 96 Hombres -871.7361 Hombres.Año 0
## 99 Año 0 97 Hombres -377.5175 Hombres.Año 0
## 100 Año 0 98 Hombres 131.0557 Hombres.Año 0
## 101 Año 0 99 Hombres 675.3836 Hombres.Año 0
## 102 Año 100 0 Hombres 0.0000 Hombres.Año 100
## 103 Año 100 1 Hombres 0.0000 Hombres.Año 100
## 104 Año 100 10 Hombres 0.0000 Hombres.Año 100
## 105 Año 100 100 Hombres 0.0000 Hombres.Año 100
## 106 Año 100 11 Hombres 0.0000 Hombres.Año 100
## 107 Año 100 12 Hombres 0.0000 Hombres.Año 100
## 108 Año 100 13 Hombres 0.0000 Hombres.Año 100
## 109 Año 100 14 Hombres 0.0000 Hombres.Año 100
## 110 Año 100 15 Hombres 0.0000 Hombres.Año 100
## 111 Año 100 16 Hombres 0.0000 Hombres.Año 100
## 112 Año 100 17 Hombres 0.0000 Hombres.Año 100
## 113 Año 100 18 Hombres 0.0000 Hombres.Año 100
## 114 Año 100 19 Hombres 0.0000 Hombres.Año 100
## 115 Año 100 2 Hombres 0.0000 Hombres.Año 100
## 116 Año 100 20 Hombres 0.0000 Hombres.Año 100
## 117 Año 100 21 Hombres 0.0000 Hombres.Año 100
## 118 Año 100 22 Hombres 0.0000 Hombres.Año 100
## 119 Año 100 23 Hombres 0.0000 Hombres.Año 100
## 120 Año 100 24 Hombres 0.0000 Hombres.Año 100
## 121 Año 100 25 Hombres 0.0000 Hombres.Año 100
## 122 Año 100 26 Hombres 0.0000 Hombres.Año 100
## 123 Año 100 27 Hombres 0.0000 Hombres.Año 100
## 124 Año 100 28 Hombres 0.0000 Hombres.Año 100
## 125 Año 100 29 Hombres 0.0000 Hombres.Año 100
## 126 Año 100 3 Hombres 0.0000 Hombres.Año 100
## 127 Año 100 30 Hombres 0.0000 Hombres.Año 100
## 128 Año 100 31 Hombres 0.0000 Hombres.Año 100
## 129 Año 100 32 Hombres 0.0000 Hombres.Año 100
## 130 Año 100 33 Hombres 0.0000 Hombres.Año 100
## 131 Año 100 34 Hombres 0.0000 Hombres.Año 100
## 132 Año 100 35 Hombres 0.0000 Hombres.Año 100
## 133 Año 100 36 Hombres 0.0000 Hombres.Año 100
## 134 Año 100 37 Hombres 0.0000 Hombres.Año 100
## 135 Año 100 38 Hombres 0.0000 Hombres.Año 100
## 136 Año 100 39 Hombres 0.0000 Hombres.Año 100
## 137 Año 100 4 Hombres 0.0000 Hombres.Año 100
## 138 Año 100 40 Hombres 0.0000 Hombres.Año 100
## 139 Año 100 41 Hombres 0.0000 Hombres.Año 100
## 140 Año 100 42 Hombres 0.0000 Hombres.Año 100
## 141 Año 100 43 Hombres 0.0000 Hombres.Año 100
## 142 Año 100 44 Hombres 0.0000 Hombres.Año 100
## 143 Año 100 45 Hombres 0.0000 Hombres.Año 100
## 144 Año 100 46 Hombres 0.0000 Hombres.Año 100
## 145 Año 100 47 Hombres 0.0000 Hombres.Año 100
## 146 Año 100 48 Hombres 0.0000 Hombres.Año 100
## 147 Año 100 49 Hombres 0.0000 Hombres.Año 100
## 148 Año 100 5 Hombres 0.0000 Hombres.Año 100
## 149 Año 100 50 Hombres 0.0000 Hombres.Año 100
## 150 Año 100 51 Hombres 0.0000 Hombres.Año 100
## 151 Año 100 52 Hombres 0.0000 Hombres.Año 100
## 152 Año 100 53 Hombres 0.0000 Hombres.Año 100
## 153 Año 100 54 Hombres 0.0000 Hombres.Año 100
## 154 Año 100 55 Hombres 0.0000 Hombres.Año 100
## 155 Año 100 56 Hombres 0.0000 Hombres.Año 100
## 156 Año 100 57 Hombres 0.0000 Hombres.Año 100
## 157 Año 100 58 Hombres 0.0000 Hombres.Año 100
## 158 Año 100 59 Hombres 0.0000 Hombres.Año 100
## 159 Año 100 6 Hombres 0.0000 Hombres.Año 100
## 160 Año 100 60 Hombres 0.0000 Hombres.Año 100
## 161 Año 100 61 Hombres 0.0000 Hombres.Año 100
## 162 Año 100 62 Hombres 0.0000 Hombres.Año 100
## 163 Año 100 63 Hombres 0.0000 Hombres.Año 100
## 164 Año 100 64 Hombres 0.0000 Hombres.Año 100
## 165 Año 100 65 Hombres 0.0000 Hombres.Año 100
## 166 Año 100 66 Hombres 0.0000 Hombres.Año 100
## 167 Año 100 67 Hombres 0.0000 Hombres.Año 100
## 168 Año 100 68 Hombres 0.0000 Hombres.Año 100
## 169 Año 100 69 Hombres 0.0000 Hombres.Año 100
## 170 Año 100 7 Hombres 0.0000 Hombres.Año 100
## 171 Año 100 70 Hombres 0.0000 Hombres.Año 100
## 172 Año 100 71 Hombres 0.0000 Hombres.Año 100
## 173 Año 100 72 Hombres 0.0000 Hombres.Año 100
## 174 Año 100 73 Hombres 0.0000 Hombres.Año 100
## 175 Año 100 74 Hombres 0.0000 Hombres.Año 100
## 176 Año 100 75 Hombres 0.0000 Hombres.Año 100
## 177 Año 100 76 Hombres 0.0000 Hombres.Año 100
## 178 Año 100 77 Hombres 0.0000 Hombres.Año 100
## 179 Año 100 78 Hombres 0.0000 Hombres.Año 100
## 180 Año 100 79 Hombres 0.0000 Hombres.Año 100
## 181 Año 100 8 Hombres 0.0000 Hombres.Año 100
## 182 Año 100 80 Hombres 0.0000 Hombres.Año 100
## 183 Año 100 81 Hombres 0.0000 Hombres.Año 100
## 184 Año 100 82 Hombres 0.0000 Hombres.Año 100
## 185 Año 100 83 Hombres 0.0000 Hombres.Año 100
## 186 Año 100 84 Hombres 0.0000 Hombres.Año 100
## 187 Año 100 85 Hombres 0.0000 Hombres.Año 100
## 188 Año 100 86 Hombres 0.0000 Hombres.Año 100
## 189 Año 100 87 Hombres 0.0000 Hombres.Año 100
## 190 Año 100 88 Hombres 0.0000 Hombres.Año 100
## 191 Año 100 89 Hombres 0.0000 Hombres.Año 100
## 192 Año 100 9 Hombres 0.0000 Hombres.Año 100
## 193 Año 100 90 Hombres 0.0000 Hombres.Año 100
## 194 Año 100 91 Hombres 0.0000 Hombres.Año 100
## 195 Año 100 92 Hombres 0.0000 Hombres.Año 100
## 196 Año 100 93 Hombres 0.0000 Hombres.Año 100
## 197 Año 100 94 Hombres 0.0000 Hombres.Año 100
## 198 Año 100 95 Hombres 0.0000 Hombres.Año 100
## 199 Año 100 96 Hombres 0.0000 Hombres.Año 100
## 200 Año 100 97 Hombres 0.0000 Hombres.Año 100
## 201 Año 100 98 Hombres 0.0000 Hombres.Año 100
## 202 Año 100 99 Hombres 0.0000 Hombres.Año 100
## 203 Año 0 0 Mujeres 226542.0000 Mujeres.Año 0
## 204 Año 0 1 Mujeres 240368.8787 Mujeres.Año 0
## 205 Año 0 10 Mujeres 252654.0000 Mujeres.Año 0
## 206 Año 0 100 Mujeres -3774.1145 Mujeres.Año 0
## 207 Año 0 11 Mujeres 251474.3076 Mujeres.Año 0
## 208 Año 0 12 Mujeres 251173.1767 Mujeres.Año 0
## 209 Año 0 13 Mujeres 251484.4920 Mujeres.Año 0
## 210 Año 0 14 Mujeres 252142.1382 Mujeres.Año 0
## 211 Año 0 15 Mujeres 252880.0000 Mujeres.Año 0
## 212 Año 0 16 Mujeres 253509.6541 Mujeres.Año 0
## 213 Año 0 17 Mujeres 254153.4448 Mujeres.Año 0
## 214 Año 0 18 Mujeres 255011.4084 Mujeres.Año 0
## 215 Año 0 19 Mujeres 256283.5814 Mujeres.Año 0
## 216 Año 0 2 Mujeres 250429.8941 Mujeres.Año 0
## 217 Año 0 20 Mujeres 258170.0000 Mujeres.Año 0
## 218 Año 0 21 Mujeres 260756.3641 Mujeres.Año 0
## 219 Año 0 22 Mujeres 263671.0282 Mujeres.Año 0
## 220 Año 0 23 Mujeres 266428.0102 Mujeres.Año 0
## 221 Año 0 24 Mujeres 268541.3281 Mujeres.Año 0
## 222 Año 0 25 Mujeres 269525.0000 Mujeres.Año 0
## 223 Año 0 26 Mujeres 269007.1134 Mujeres.Año 0
## 224 Año 0 27 Mujeres 267072.0344 Mujeres.Año 0
## 225 Año 0 28 Mujeres 263918.1988 Mujeres.Año 0
## 226 Año 0 29 Mujeres 259744.0421 Mujeres.Año 0
## 227 Año 0 3 Mujeres 257171.6701 Mujeres.Año 0
## 228 Año 0 30 Mujeres 254748.0000 Mujeres.Año 0
## 229 Año 0 31 Mujeres 249147.7982 Mujeres.Año 0
## 230 Año 0 32 Mujeres 243238.3221 Mujeres.Año 0
## 231 Año 0 33 Mujeres 237333.7468 Mujeres.Año 0
## 232 Año 0 34 Mujeres 231748.2477 Mujeres.Año 0
## 233 Año 0 35 Mujeres 226796.0000 Mujeres.Año 0
## 234 Año 0 36 Mujeres 222634.1177 Mujeres.Año 0
## 235 Año 0 37 Mujeres 218791.4694 Mujeres.Año 0
## 236 Año 0 38 Mujeres 214639.8621 Mujeres.Año 0
## 237 Año 0 39 Mujeres 209551.1033 Mujeres.Año 0
## 238 Año 0 4 Mujeres 261040.8307 Mujeres.Año 0
## 239 Año 0 40 Mujeres 202897.0000 Mujeres.Año 0
## 240 Año 0 41 Mujeres 194332.0029 Mujeres.Año 0
## 241 Año 0 42 Mujeres 184641.1365 Mujeres.Año 0
## 242 Año 0 43 Mujeres 174892.0686 Mujeres.Año 0
## 243 Año 0 44 Mujeres 166152.4672 Mujeres.Año 0
## 244 Año 0 45 Mujeres 159490.0000 Mujeres.Año 0
## 245 Año 0 46 Mujeres 155636.4466 Mujeres.Año 0
## 246 Año 0 47 Mujeres 153980.0326 Mujeres.Año 0
## 247 Año 0 48 Mujeres 153573.0953 Mujeres.Año 0
## 248 Año 0 49 Mujeres 153467.9720 Mujeres.Año 0
## 249 Año 0 5 Mujeres 262484.0000 Mujeres.Año 0
## 250 Año 0 50 Mujeres 152717.0000 Mujeres.Año 0
## 251 Año 0 51 Mujeres 150607.5628 Mujeres.Año 0
## 252 Año 0 52 Mujeres 147367.2292 Mujeres.Año 0
## 253 Año 0 53 Mujeres 143458.6142 Mujeres.Año 0
## 254 Año 0 54 Mujeres 139344.3328 Mujeres.Año 0
## 255 Año 0 55 Mujeres 135487.0000 Mujeres.Año 0
## 256 Año 0 56 Mujeres 132228.2142 Mujeres.Año 0
## 257 Año 0 57 Mujeres 129425.5066 Mujeres.Año 0
## 258 Año 0 58 Mujeres 126815.3920 Mujeres.Año 0
## 259 Año 0 59 Mujeres 124134.3849 Mujeres.Año 0
## 260 Año 0 6 Mujeres 261977.4994 Mujeres.Año 0
## 261 Año 0 60 Mujeres 121119.0000 Mujeres.Año 0
## 262 Año 0 61 Mujeres 117556.1965 Mujeres.Año 0
## 263 Año 0 62 Mujeres 113434.7123 Mujeres.Año 0
## 264 Año 0 63 Mujeres 108793.7298 Mujeres.Año 0
## 265 Año 0 64 Mujeres 103672.4315 Mujeres.Año 0
## 266 Año 0 65 Mujeres 98110.0000 Mujeres.Año 0
## 267 Año 0 66 Mujeres 92175.6398 Mujeres.Año 0
## 268 Año 0 67 Mujeres 86058.6443 Mujeres.Año 0
## 269 Año 0 68 Mujeres 79978.3289 Mujeres.Año 0
## 270 Año 0 69 Mujeres 74154.0089 Mujeres.Año 0
## 271 Año 0 7 Mujeres 260116.4403 Mujeres.Año 0
## 272 Año 0 70 Mujeres 68805.0000 Mujeres.Año 0
## 273 Año 0 71 Mujeres 64090.4522 Mujeres.Año 0
## 274 Año 0 72 Mujeres 59928.8545 Mujeres.Año 0
## 275 Año 0 73 Mujeres 56178.5308 Mujeres.Año 0
## 276 Año 0 74 Mujeres 52697.8047 Mujeres.Año 0
## 277 Año 0 75 Mujeres 49345.0000 Mujeres.Año 0
## 278 Año 0 76 Mujeres 46001.9354 Mujeres.Año 0
## 279 Año 0 77 Mujeres 42644.4096 Mujeres.Año 0
## 280 Año 0 78 Mujeres 39271.7160 Mujeres.Año 0
## 281 Año 0 79 Mujeres 35883.1483 Mujeres.Año 0
## 282 Año 0 8 Mujeres 257525.6315 Mujeres.Año 0
## 283 Año 0 80 Mujeres 32478.0000 Mujeres.Año 0
## 284 Año 0 81 Mujeres 29069.3901 Mujeres.Año 0
## 285 Año 0 82 Mujeres 25725.7392 Mujeres.Año 0
## 286 Año 0 83 Mujeres 22529.2932 Mujeres.Año 0
## 287 Año 0 84 Mujeres 19562.2981 Mujeres.Año 0
## 288 Año 0 85 Mujeres 16907.0000 Mujeres.Año 0
## 289 Año 0 86 Mujeres 14622.2802 Mujeres.Año 0
## 290 Año 0 87 Mujeres 12673.5618 Mujeres.Año 0
## 291 Año 0 88 Mujeres 11002.9033 Mujeres.Año 0
## 292 Año 0 89 Mujeres 9552.3632 Mujeres.Año 0
## 293 Año 0 9 Mujeres 254829.8818 Mujeres.Año 0
## 294 Año 0 90 Mujeres 8264.0000 Mujeres.Año 0
## 295 Año 0 91 Mujeres 7084.5452 Mujeres.Año 0
## 296 Año 0 92 Mujeres 5979.4217 Mujeres.Año 0
## 297 Año 0 93 Mujeres 4918.7257 Mujeres.Año 0
## 298 Año 0 94 Mujeres 3872.5532 Mujeres.Año 0
## 299 Año 0 95 Mujeres 2811.0000 Mujeres.Año 0
## 300 Año 0 96 Mujeres 1704.1623 Mujeres.Año 0
## 301 Año 0 97 Mujeres 522.1359 Mujeres.Año 0
## 302 Año 0 98 Mujeres -764.9830 Mujeres.Año 0
## 303 Año 0 99 Mujeres -2187.0984 Mujeres.Año 0
## 304 Año 100 0 Mujeres 0.0000 Mujeres.Año 100
## 305 Año 100 1 Mujeres 0.0000 Mujeres.Año 100
## 306 Año 100 10 Mujeres 0.0000 Mujeres.Año 100
## 307 Año 100 100 Mujeres 0.0000 Mujeres.Año 100
## 308 Año 100 11 Mujeres 0.0000 Mujeres.Año 100
## 309 Año 100 12 Mujeres 0.0000 Mujeres.Año 100
## 310 Año 100 13 Mujeres 0.0000 Mujeres.Año 100
## 311 Año 100 14 Mujeres 0.0000 Mujeres.Año 100
## 312 Año 100 15 Mujeres 0.0000 Mujeres.Año 100
## 313 Año 100 16 Mujeres 0.0000 Mujeres.Año 100
## 314 Año 100 17 Mujeres 0.0000 Mujeres.Año 100
## 315 Año 100 18 Mujeres 0.0000 Mujeres.Año 100
## 316 Año 100 19 Mujeres 0.0000 Mujeres.Año 100
## 317 Año 100 2 Mujeres 0.0000 Mujeres.Año 100
## 318 Año 100 20 Mujeres 0.0000 Mujeres.Año 100
## 319 Año 100 21 Mujeres 0.0000 Mujeres.Año 100
## 320 Año 100 22 Mujeres 0.0000 Mujeres.Año 100
## 321 Año 100 23 Mujeres 0.0000 Mujeres.Año 100
## 322 Año 100 24 Mujeres 0.0000 Mujeres.Año 100
## 323 Año 100 25 Mujeres 0.0000 Mujeres.Año 100
## 324 Año 100 26 Mujeres 0.0000 Mujeres.Año 100
## 325 Año 100 27 Mujeres 0.0000 Mujeres.Año 100
## 326 Año 100 28 Mujeres 0.0000 Mujeres.Año 100
## 327 Año 100 29 Mujeres 0.0000 Mujeres.Año 100
## 328 Año 100 3 Mujeres 0.0000 Mujeres.Año 100
## 329 Año 100 30 Mujeres 0.0000 Mujeres.Año 100
## 330 Año 100 31 Mujeres 0.0000 Mujeres.Año 100
## 331 Año 100 32 Mujeres 0.0000 Mujeres.Año 100
## 332 Año 100 33 Mujeres 0.0000 Mujeres.Año 100
## 333 Año 100 34 Mujeres 0.0000 Mujeres.Año 100
## 334 Año 100 35 Mujeres 0.0000 Mujeres.Año 100
## 335 Año 100 36 Mujeres 0.0000 Mujeres.Año 100
## 336 Año 100 37 Mujeres 0.0000 Mujeres.Año 100
## 337 Año 100 38 Mujeres 0.0000 Mujeres.Año 100
## 338 Año 100 39 Mujeres 0.0000 Mujeres.Año 100
## 339 Año 100 4 Mujeres 0.0000 Mujeres.Año 100
## 340 Año 100 40 Mujeres 0.0000 Mujeres.Año 100
## 341 Año 100 41 Mujeres 0.0000 Mujeres.Año 100
## 342 Año 100 42 Mujeres 0.0000 Mujeres.Año 100
## 343 Año 100 43 Mujeres 0.0000 Mujeres.Año 100
## 344 Año 100 44 Mujeres 0.0000 Mujeres.Año 100
## 345 Año 100 45 Mujeres 0.0000 Mujeres.Año 100
## 346 Año 100 46 Mujeres 0.0000 Mujeres.Año 100
## 347 Año 100 47 Mujeres 0.0000 Mujeres.Año 100
## 348 Año 100 48 Mujeres 0.0000 Mujeres.Año 100
## 349 Año 100 49 Mujeres 0.0000 Mujeres.Año 100
## 350 Año 100 5 Mujeres 0.0000 Mujeres.Año 100
## 351 Año 100 50 Mujeres 0.0000 Mujeres.Año 100
## 352 Año 100 51 Mujeres 0.0000 Mujeres.Año 100
## 353 Año 100 52 Mujeres 0.0000 Mujeres.Año 100
## 354 Año 100 53 Mujeres 0.0000 Mujeres.Año 100
## 355 Año 100 54 Mujeres 0.0000 Mujeres.Año 100
## 356 Año 100 55 Mujeres 0.0000 Mujeres.Año 100
## 357 Año 100 56 Mujeres 0.0000 Mujeres.Año 100
## 358 Año 100 57 Mujeres 0.0000 Mujeres.Año 100
## 359 Año 100 58 Mujeres 0.0000 Mujeres.Año 100
## 360 Año 100 59 Mujeres 0.0000 Mujeres.Año 100
## 361 Año 100 6 Mujeres 0.0000 Mujeres.Año 100
## 362 Año 100 60 Mujeres 0.0000 Mujeres.Año 100
## 363 Año 100 61 Mujeres 0.0000 Mujeres.Año 100
## 364 Año 100 62 Mujeres 0.0000 Mujeres.Año 100
## 365 Año 100 63 Mujeres 0.0000 Mujeres.Año 100
## 366 Año 100 64 Mujeres 0.0000 Mujeres.Año 100
## 367 Año 100 65 Mujeres 0.0000 Mujeres.Año 100
## 368 Año 100 66 Mujeres 0.0000 Mujeres.Año 100
## 369 Año 100 67 Mujeres 0.0000 Mujeres.Año 100
## 370 Año 100 68 Mujeres 0.0000 Mujeres.Año 100
## 371 Año 100 69 Mujeres 0.0000 Mujeres.Año 100
## 372 Año 100 7 Mujeres 0.0000 Mujeres.Año 100
## 373 Año 100 70 Mujeres 0.0000 Mujeres.Año 100
## 374 Año 100 71 Mujeres 0.0000 Mujeres.Año 100
## 375 Año 100 72 Mujeres 0.0000 Mujeres.Año 100
## 376 Año 100 73 Mujeres 0.0000 Mujeres.Año 100
## 377 Año 100 74 Mujeres 0.0000 Mujeres.Año 100
## 378 Año 100 75 Mujeres 0.0000 Mujeres.Año 100
## 379 Año 100 76 Mujeres 0.0000 Mujeres.Año 100
## 380 Año 100 77 Mujeres 0.0000 Mujeres.Año 100
## 381 Año 100 78 Mujeres 0.0000 Mujeres.Año 100
## 382 Año 100 79 Mujeres 0.0000 Mujeres.Año 100
## 383 Año 100 8 Mujeres 0.0000 Mujeres.Año 100
## 384 Año 100 80 Mujeres 0.0000 Mujeres.Año 100
## 385 Año 100 81 Mujeres 0.0000 Mujeres.Año 100
## 386 Año 100 82 Mujeres 0.0000 Mujeres.Año 100
## 387 Año 100 83 Mujeres 0.0000 Mujeres.Año 100
## 388 Año 100 84 Mujeres 0.0000 Mujeres.Año 100
## 389 Año 100 85 Mujeres 0.0000 Mujeres.Año 100
## 390 Año 100 86 Mujeres 0.0000 Mujeres.Año 100
## 391 Año 100 87 Mujeres 0.0000 Mujeres.Año 100
## 392 Año 100 88 Mujeres 0.0000 Mujeres.Año 100
## 393 Año 100 89 Mujeres 0.0000 Mujeres.Año 100
## 394 Año 100 9 Mujeres 0.0000 Mujeres.Año 100
## 395 Año 100 90 Mujeres 0.0000 Mujeres.Año 100
## 396 Año 100 91 Mujeres 0.0000 Mujeres.Año 100
## 397 Año 100 92 Mujeres 0.0000 Mujeres.Año 100
## 398 Año 100 93 Mujeres 0.0000 Mujeres.Año 100
## 399 Año 100 94 Mujeres 0.0000 Mujeres.Año 100
## 400 Año 100 95 Mujeres 0.0000 Mujeres.Año 100
## 401 Año 100 96 Mujeres 0.0000 Mujeres.Año 100
## 402 Año 100 97 Mujeres 0.0000 Mujeres.Año 100
## 403 Año 100 98 Mujeres 0.0000 Mujeres.Año 100
## 404 Año 100 99 Mujeres 0.0000 Mujeres.Año 100
# Crear la gráfica
ggplot(population_pyramid_long, aes(x = edad, y = poblacion, fill = grupo)) +
geom_bar(data = subset(population_pyramid_long, year == "Año 0"), stat = "identity", alpha = 0.5) +
geom_bar(data = subset(population_pyramid_long, year == "Año 100"), stat = "identity", alpha = 0.5) +
coord_flip() +
scale_y_continuous(labels = abs) +
labs(
title = "Comparación de Pirámides Poblacionales: Años 0 y 100",
x = "Edad",
y = "Población",
fill = "Sexo y Año"
) +
theme_minimal() +
scale_fill_manual(
values = c("Hombres.Año 0" = "blue", "Mujeres.Año 0" = "red", "Hombres.Año 100" = "lightblue", "Mujeres.Año 100" = "pink"),
labels = c("Hombres (Año 0)", "Mujeres (Año 0)", "Hombres (Año 100)", "Mujeres (Año 100)")
)
Los resultados preliminares del estudio muestran cómo los cambios en los valores iniciales de fecundidad, mortalidad y migraciones afectan significativamente las proyecciones de población. A continuación, se presentan algunos ejemplos de los efectos observados:
Fecundidad: Un aumento del 10% en la tasa de fecundidad inicial resultó en un crecimiento poblacional acelerado, con un aumento del 15% en la población proyectada para el año 2050. En contraste, una reducción del 10% en la fecundidad provocó una disminución del 12% en la población proyectada para el mismo período.
Mortalidad: Al reducir la tasa de mortalidad infantil en un 20%, se observó un incremento significativo en la población de niños menores de 5 años, lo cual impactó positivamente en la estructura de edades de la población proyectada. Sin embargo, un aumento en la tasa de mortalidad general redujo la esperanza de vida y disminuyó la población total proyectada en un 8% para el año 2050.
Migraciones: La incorporación de un escenario de migración neta positiva (aumento del 5% anual en el número de inmigrantes) mostró un impacto considerable en la estructura de la población, incrementando el número de adultos jóvenes y mejorando la relación de dependencia. En un escenario de migración negativa, la población proyectada disminuyó un 10% para el año 2050, afectando principalmente a la población en edad laboral.
Estos resultados subrayan la importancia del análisis de sensibilidad en las proyecciones de población, ya que permiten visualizar cómo pequeños ajustes en los parámetros pueden tener grandes repercusiones en la dinámica poblacional futura. Asimismo, destacan la necesidad de considerar múltiples escenarios para una planificación más robusta y adaptativa.
En conclusión, este estudio ha demostrado cómo los cambios en los valores iniciales y supuestos de fecundidad, mortalidad y migraciones pueden tener un impacto significativo en las proyecciones de población. La adaptación del modelo ILO-POP a Excel ha permitido explorar de manera intuitiva y accesible los efectos de diferentes escenarios, lo cual resulta fundamental para la formulación de políticas públicas eficientes y efectivas.
El análisis de sensibilidad ha revelado que pequeños cambios en los parámetros pueden llevar a variaciones considerables en la estructura y tamaño de la población proyectada. Esto subraya la importancia de contar con herramientas flexibles que permitan a los responsables de la planificación demográfica considerar múltiples escenarios y tomar decisiones bien fundamentadas.
Finalmente, el enfoque adoptado en este estudio enfatiza la necesidad de una planificación dinámica y adaptable, que incorpore continuamente nuevos datos y ajustes a los supuestos iniciales para enfrentar de manera efectiva los desafíos demográficos del futuro.