### ¿VIVIR MÁS O VIVIR MEJOR?
# Instalar y cargar librerías necesarias
library(pacman)
## Warning: package 'pacman' was built under R version 4.4.3
p_load(readxl,tidyverse,tidyr,naniar,ggplot2,dplyr,patchwork,skimr,knitr,visdat,reshape2,corrplot,ggcorrplot,caret,randomForest,quantreg,Matrix,qgam,car)
# Cargar y mostrar base de datos
proyecto <- read_excel("C:/Users/MIRZ/Downloads/Datos_proyecto_1.xlsx")
View(proyecto)
# Conocer el nombre de las columnas
names(proyecto)
## [1] "Pais" "Poblacion" "RPC" "EV" "TM" "TN"
## [7] "IF" "TD" "RP" "IDH" "IG" "GPS"
## [13] "GPS_PIB" "PM" "PH"
# Observar qué tipo de datos son
str(proyecto)
## tibble [168 × 15] (S3: tbl_df/tbl/data.frame)
## $ Pais : chr [1:168] "United States" "China" "Japan" "Germany" ...
## $ Poblacion: num [1:168] 3.25e+08 1.42e+09 1.28e+08 8.27e+07 1.34e+09 ...
## $ RPC : num [1:168] 59939 8612 38214 44680 1980 ...
## $ EV : num [1:168] 78.9 76.7 84.5 81.2 69.4 81.2 82.5 75.7 83.6 82.3 ...
## $ TM : num [1:168] 0.098 0.0737 0.129 0.123 0.0907 0.091 0.092 0.0814 0.112 0.086 ...
## $ TN : chr [1:168] "11" "6,77" "6,3" "8,3" ...
## $ IF : chr [1:168] "1,67" "1,18" "1,26" "1,39" ...
## $ TD : chr [1:168] "4,1" "5,1" "2,5" "3,5" ...
## $ RP : chr [1:168] "11,1" "0,0" "16,0" "15,5" ...
## $ IDH : num [1:168] 0.927 0.788 0.92 0.95 0.644 0.94 0.91 0.76 0.906 0.935 ...
## $ IG : chr [1:168] "41,3" "35,7" "32,9" "29,4" ...
## $ GPS : num [1:168] 0.833 0.549 0.859 0.859 0.391 ...
## $ GPS_PIB : num [1:168] 0.139 0.0952 0.0952 0.1014 0.0455 ...
## $ PM : num [1:168] 0.498 0.49 0.512 0.506 0.484 ...
## $ PH : num [1:168] 0.502 0.51 0.488 0.494 0.516 ...
# Cambiamos los datos chr a numerico
# Lista de columnas que contienen comas
cols <- c("TN", "IF", "TD", "RP", "IG")
# Transformación: reemplazar comas por puntos y convertir a numérico
proyecto[cols] <- lapply(proyecto[cols], function(x) as.numeric(gsub(",", ".", x)))
# Verificar la estructura después de la conversión
str(proyecto)
## tibble [168 × 15] (S3: tbl_df/tbl/data.frame)
## $ Pais : chr [1:168] "United States" "China" "Japan" "Germany" ...
## $ Poblacion: num [1:168] 3.25e+08 1.42e+09 1.28e+08 8.27e+07 1.34e+09 ...
## $ RPC : num [1:168] 59939 8612 38214 44680 1980 ...
## $ EV : num [1:168] 78.9 76.7 84.5 81.2 69.4 81.2 82.5 75.7 83.6 82.3 ...
## $ TM : num [1:168] 0.098 0.0737 0.129 0.123 0.0907 0.091 0.092 0.0814 0.112 0.086 ...
## $ TN : num [1:168] 11 6.77 6.3 8.3 16.27 ...
## $ IF : num [1:168] 1.67 1.18 1.26 1.39 2.01 1.57 1.66 1.63 1.21 1.33 ...
## $ TD : num [1:168] 4.1 5.1 2.5 3.5 4.6 4.4 7.3 13.2 6.4 6.6 ...
## $ RP : num [1:168] 11.1 0 16 15.5 21.9 18.6 15.4 26.5 18.9 9.9 ...
## $ IDH : num [1:168] 0.927 0.788 0.92 0.95 0.644 0.94 0.91 0.76 0.906 0.935 ...
## $ IG : num [1:168] 41.3 35.7 32.9 29.4 32.8 33.5 29.7 52 31.5 31.7 ...
## $ GPS : num [1:168] 0.833 0.549 0.859 0.859 0.391 ...
## $ GPS_PIB : num [1:168] 0.139 0.0952 0.0952 0.1014 0.0455 ...
## $ PM : num [1:168] 0.498 0.49 0.512 0.506 0.484 ...
## $ PH : num [1:168] 0.502 0.51 0.488 0.494 0.516 ...
# Tener una vista de las medidas de tendencia central de cada una de las variables
summary(proyecto)
## Pais Poblacion RPC EV
## Length:168 Min. :1.781e+04 Min. : 293 Min. :52.80
## Class :character 1st Qu.:2.735e+06 1st Qu.: 1996 1st Qu.:67.25
## Mode :character Median :9.469e+06 Median : 5572 Median :74.10
## Mean :4.326e+07 Mean : 13474 Mean :72.54
## 3rd Qu.:3.119e+07 3rd Qu.: 16033 3rd Qu.:77.65
## Max. :1.421e+09 Max. :105280 Max. :84.50
## TM TN IF TD
## Min. :0.01870 Min. : 4.400 Min. :0.700 Min. : 0.100
## 1st Qu.:0.06383 1st Qu.: 9.723 1st Qu.:1.500 1st Qu.: 3.500
## Median :0.07815 Median :16.425 Median :2.070 Median : 5.100
## Mean :0.08223 Mean :18.440 Mean :2.482 Mean : 7.329
## 3rd Qu.:0.09632 3rd Qu.:26.740 3rd Qu.:3.277 3rd Qu.: 8.625
## Max. :0.21400 Max. :45.030 Max. :6.750 Max. :50.000
## RP IDH IG GPS
## Min. : 0.00 Min. :0.3870 Min. :14.50 Min. : 0.0648
## 1st Qu.:14.53 1st Qu.:0.6100 1st Qu.:30.95 1st Qu.: 0.3742
## Median :21.65 Median :0.7445 Median :34.60 Median : 0.5649
## Mean :26.02 Mean :0.7301 Mean :35.86 Mean : 0.7876
## 3rd Qu.:36.83 3rd Qu.:0.8495 3rd Qu.:40.70 3rd Qu.: 0.7174
## Max. :89.00 Max. :0.9660 Max. :59.10 Max. :39.2500
## GPS_PIB PM PH
## Min. :0.00150 Min. :0.3050 Min. :0.4510
## 1st Qu.:0.02042 1st Qu.:0.4950 1st Qu.:0.4880
## Median :0.03955 Median :0.5030 Median :0.4970
## Mean :0.07557 Mean :0.4981 Mean :0.5019
## 3rd Qu.:0.06432 3rd Qu.:0.5120 3rd Qu.:0.5050
## Max. :0.94000 Max. :0.5490 Max. :0.6950
# Calcular estadísticas descriptivas de las variables numéricas
proyecto_n <- proyecto[, -1]
summary_mestadisticas <- data.frame(
Media = sapply(proyecto_n, mean, na.rm = TRUE),
Mediana = sapply(proyecto_n, median, na.rm = TRUE),
Moda = sapply(proyecto_n, function(x) names(sort(table(x), decreasing = TRUE))[1]),
Desviacion_Estandar = sapply(proyecto_n, sd, na.rm = TRUE),
Varianza = sapply(proyecto_n, var, na.rm = TRUE)
)
summary_mestadisticas
## Media Mediana Moda Desviacion_Estandar Varianza
## Poblacion 4.325658e+07 9.468717e+06 17808 1.548580e+08 2.398100e+16
## RPC 1.347382e+04 5.572000e+03 293 1.810622e+04 3.278352e+08
## EV 7.254286e+01 7.410000e+01 76.5 7.575430e+00 5.738713e+01
## TM 8.223333e-02 7.815000e-02 0.066 2.873607e-02 8.257619e-04
## TN 1.843982e+01 1.642500e+01 8 9.841835e+00 9.686172e+01
## IF 2.481548e+00 2.070000e+00 1.26 1.244510e+00 1.548805e+00
## TD 7.329048e+00 5.100000e+00 4.4 6.522115e+00 4.253798e+01
## RP 2.602137e+01 2.165000e+01 21.9 1.680814e+01 2.825137e+02
## IDH 7.301012e-01 7.445000e-01 0.394 1.530660e-01 2.342919e-02
## IG 3.585714e+01 3.460000e+01 35.7 8.152466e+00 6.646270e+01
## GPS 7.875732e-01 5.649500e-01 0.345 3.012643e+00 9.076017e+00
## GPS_PIB 7.556964e-02 3.955000e-02 0.0098 1.457538e-01 2.124416e-02
## PM 4.980649e-01 5.030000e-01 0.503 3.212515e-02 1.032025e-03
## PH 5.019351e-01 4.970000e-01 0.497 3.212515e-02 1.032025e-03
# Histograma de la Distribución de la Esperanza de Vida
ggplot(proyecto, aes(x = EV)) +
geom_histogram(binwidth = 2, fill = "skyblue", color = "black") +
labs(title = "Distribución de la Esperanza de Vida",
x = "Esperanza de vida",
y = "Frecuencia") +
theme_minimal()

# Gráfico de barras de Top 10 Países por Esperanza de Vida
top_10_ev <- proyecto %>% arrange(desc(EV)) %>% head(10)
top_10_ev
## # A tibble: 10 × 15
## Pais Poblacion RPC EV TM TN IF TD RP IDH IG GPS
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Japan 127502725 38214 84.5 0.129 6.3 1.26 2.5 16 0.92 32.9 0.859
## 2 Hong … 7306322 46733 84.1 0.087 4.4 0.7 3.1 23.6 0.956 32.4 0.345
## 3 Singa… 5708041 56746 83.8 0.063 7.9 1.04 1.9 26.6 0.949 32.5 0.566
## 4 Italy 60673701 32038 83.6 0.112 6.4 1.21 6.4 18.9 0.906 31.5 0.740
## 5 Spain 46647428 28175 83.4 0.0896 6.61 1.12 10.6 19.7 0.911 31.5 0.743
## 6 Austr… 24584620 53831 83.3 0.073 11.6 1.63 4 13.4 0.946 34.5 0.719
## 7 Icela… 334393 73233 82.9 0.066 11 1.55 3.5 8.8 0.959 23.7 0.840
## 8 South… 51096415 29958 82.8 0.07 4.7 0.75 2.8 18.3 0.929 32.9 0.632
## 9 Israel 8243848 42852 82.8 0.054 19 2.89 2.6 20.7 0.915 37.9 0.685
## 10 Sweden 9904896 54075 82.7 0.09 9.5 1.45 8.6 14.8 0.952 29.5 0.862
## # ℹ 3 more variables: GPS_PIB <dbl>, PM <dbl>, PH <dbl>
Top10_EV <- ggplot(top_10_ev, aes(x = reorder(Pais, EV), y = EV, fill = Pais)) +
geom_bar(stat = "identity") +
coord_flip() +
labs(title = "Top 10 Países por Esperanza de Vida", y = "Esperanza de Vida (años)", x = "País") +
theme_minimal()
Top10_EV

# Gráfico de dispersión del Gasto en salud vs Esperanza de vida
GPSvsEV <- ggplot(proyecto, aes(x = GPS, y = EV)) +
geom_point(alpha = 0.6, color = "blue") +
geom_smooth(method = "lm", color = "red", se = TRUE) +
labs(title = "Gasto en Salud vs. Esperanza de Vida", x = "% Gasto en Salud", y = "Esperanza de Vida (años)") +
theme_minimal()
GPSvsEV
## `geom_smooth()` using formula = 'y ~ x'

# Gráfico de dispersión del IDH vs Esperanza de vida
IDHvsEV <- ggplot(proyecto, aes(x = IDH, y = EV)) +
geom_point(alpha = 0.6, color = "darkgreen") +
geom_smooth(method = "lm", color = "red", se = TRUE) +
labs(title = "IDH vs. Esperanza de Vida", x = "Índice de Desarrollo Humano", y = "Esperanza de Vida (años)") +
theme_minimal()
IDHvsEV
## `geom_smooth()` using formula = 'y ~ x'

# Realizar matriz de correlacion para identificar las variables que nos sirven
# Calcular la matriz de correlación excluyendo la columna de países
cor_matrix <- cor(proyecto[ , sapply(proyecto, is.numeric)], use = "pairwise.complete.obs")
# Visualizar la matriz de correlación como un mapa de calor
corrplot(cor_matrix, method = "color", type = "upper",
tl.cex = 0.8, tl.col = "black",
title = "Matriz de correlaciones",
mar = c(0,0,1,0))

# Visualización alternativa
cor_melted <- melt(cor_matrix)
ggplot(data = cor_melted, aes(x = Var1, y = Var2, fill = value)) +
geom_tile(color = "white") +
scale_fill_gradient2(low = "blue", high = "red", mid = "white",
midpoint = 0, limit = c(-1,1), space = "Lab",
name = "Correlación") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
ggtitle("Matriz de correlación entre variables")

# Detección de datos faltantes
# Conteo por variable
cat("Cantidad de valores faltantes por variable:\n")
## Cantidad de valores faltantes por variable:
colSums(is.na(proyecto))
## Pais Poblacion RPC EV TM TN IF TD
## 0 0 0 0 0 0 0 0
## RP IDH IG GPS GPS_PIB PM PH
## 0 0 0 0 0 0 0
# Visualización con visdat y naniar
vis_miss(proyecto) + ggtitle("Visualización de valores faltantes")

# Detección de valores atípicos
# Boxplots por variable numérica para detectar outliers
# Convertimos a formato largo para graficar todas las variables numéricas
proyecto_long <- proyecto %>%
select(where(is.numeric)) %>%
pivot_longer(cols = everything(), names_to = "Variable", values_to = "Valor")
ggplot(proyecto_long, aes(x = Variable, y = Valor)) +
geom_boxplot(fill = "orange", outlier.color = "red", outlier.shape = 8) +
theme_minimal() +
labs(title = "Detección de valores atípicos por variable",
x = "Variable", y = "Valor") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Preparar los datos para aplicar un modelo
# Normalizar los datos
# Seleccionar solo las columnas numéricas del dataframe
numeric_cols <- proyecto[, sapply(proyecto, is.numeric)]
# Verificar la estructura de las columnas numéricas
str(numeric_cols)
## tibble [168 × 14] (S3: tbl_df/tbl/data.frame)
## $ Poblacion: num [1:168] 3.25e+08 1.42e+09 1.28e+08 8.27e+07 1.34e+09 ...
## $ RPC : num [1:168] 59939 8612 38214 44680 1980 ...
## $ EV : num [1:168] 78.9 76.7 84.5 81.2 69.4 81.2 82.5 75.7 83.6 82.3 ...
## $ TM : num [1:168] 0.098 0.0737 0.129 0.123 0.0907 0.091 0.092 0.0814 0.112 0.086 ...
## $ TN : num [1:168] 11 6.77 6.3 8.3 16.27 ...
## $ IF : num [1:168] 1.67 1.18 1.26 1.39 2.01 1.57 1.66 1.63 1.21 1.33 ...
## $ TD : num [1:168] 4.1 5.1 2.5 3.5 4.6 4.4 7.3 13.2 6.4 6.6 ...
## $ RP : num [1:168] 11.1 0 16 15.5 21.9 18.6 15.4 26.5 18.9 9.9 ...
## $ IDH : num [1:168] 0.927 0.788 0.92 0.95 0.644 0.94 0.91 0.76 0.906 0.935 ...
## $ IG : num [1:168] 41.3 35.7 32.9 29.4 32.8 33.5 29.7 52 31.5 31.7 ...
## $ GPS : num [1:168] 0.833 0.549 0.859 0.859 0.391 ...
## $ GPS_PIB : num [1:168] 0.139 0.0952 0.0952 0.1014 0.0455 ...
## $ PM : num [1:168] 0.498 0.49 0.512 0.506 0.484 ...
## $ PH : num [1:168] 0.502 0.51 0.488 0.494 0.516 ...
# Normalizar los datos numéricos
datos_normalizados <- as.data.frame(scale(numeric_cols))
# Verificar los datos normalizados
head(datos_normalizados)
## Poblacion RPC EV TM TN IF TD
## 1 1.8199137 2.5662552 0.8391792 0.5486716 -0.7559384 -0.6521022 -0.4950921
## 2 8.8969593 -0.2685163 0.5487666 -0.2969554 -1.1857363 -1.0458315 -0.3417676
## 3 0.5440219 1.3663914 1.5784112 1.6274550 -1.2334916 -0.9815492 -0.7404113
## 4 0.2544384 1.7235062 1.1427923 1.4186583 -1.0302775 -0.8770904 -0.5870868
## 5 8.3652140 -0.6347992 -0.4148751 0.2946355 -0.2204692 -0.3789023 -0.4184299
## 6 0.1515639 1.4391841 1.1427923 0.3050753 -0.8575455 -0.7324551 -0.4490948
## RP IDH IG GPS GPS_PIB PM
## 1 -0.8877465 1.2863656 0.6676332 0.01511191 0.43518845 -0.002019631
## 2 -1.5481407 0.3782605 -0.0192755 -0.07929025 0.13468164 -0.251045688
## 3 -0.5962211 1.2406337 -0.3627299 0.02364262 0.13468164 0.433775969
## 4 -0.6259686 1.4366276 -0.7920478 0.02380859 0.17721914 0.247006426
## 5 -0.2452007 -0.5625103 -0.3749961 -0.13160312 -0.20630439 -0.437815231
## 6 -0.4415342 1.3712963 -0.2891325 0.01033205 0.09283024 0.309262941
## PH
## 1 0.002019631
## 2 0.251045688
## 3 -0.433775969
## 4 -0.247006426
## 5 0.437815231
## 6 -0.309262941
# Calcular la matriz de correlación de los datos normalizados
cor_matrix <- cor(datos_normalizados)
cor_matrix
## Poblacion RPC EV TM TN
## Poblacion 1.000000000 -0.041927905 0.009665429 0.015283903 -0.07706500
## RPC -0.041927905 1.000000000 0.651488267 0.003301292 -0.54768481
## EV 0.009665429 0.651488267 1.000000000 -0.034609205 -0.87207692
## TM 0.015283903 0.003301292 -0.034609205 1.000000000 -0.23402804
## TN -0.077064998 -0.547684814 -0.872076922 -0.234028039 1.00000000
## IF -0.078583134 -0.506007781 -0.844075665 -0.180217363 0.98042467
## TD -0.052572603 -0.170023840 -0.102695462 0.046072117 0.11765910
## RP -0.124548212 -0.369637846 -0.621648920 0.014973882 0.59236093
## IDH -0.006480292 0.722956767 0.905845947 0.100788143 -0.90291069
## IG -0.012638746 -0.335500673 -0.292700352 -0.107245173 0.31790251
## GPS -0.023399654 -0.023840319 -0.039832570 -0.032008708 0.08783549
## GPS_PIB -0.020005525 -0.079222375 -0.188159815 0.058173527 0.25338785
## PM -0.063472145 -0.082677147 0.021521707 0.381253145 -0.04747079
## PH 0.063472145 0.082677147 -0.021521707 -0.381253145 0.04747079
## IF TD RP IDH IG
## Poblacion -0.07858313 -0.05257260 -0.124548212 -0.006480292 -0.01263875
## RPC -0.50600778 -0.17002384 -0.369637846 0.722956767 -0.33550067
## EV -0.84407566 -0.10269546 -0.621648920 0.905845947 -0.29270035
## TM -0.18021736 0.04607212 0.014973882 0.100788143 -0.10724517
## TN 0.98042467 0.11765910 0.592360927 -0.902910687 0.31790251
## IF 1.00000000 0.08964073 0.572007006 -0.866004571 0.24326349
## TD 0.08964073 1.00000000 0.121309155 -0.136827742 0.11899736
## RP 0.57200701 0.12130916 1.000000000 -0.630492231 0.31568179
## IDH -0.86600457 -0.13682774 -0.630492231 1.000000000 -0.33782520
## IG 0.24326349 0.11899736 0.315681791 -0.337825202 1.00000000
## GPS 0.09232714 0.04057730 -0.001932711 -0.059180357 0.01367857
## GPS_PIB 0.30644476 -0.05748814 0.109954623 -0.217761819 -0.08820181
## PM -0.07165410 0.19940539 0.118181026 -0.047220496 0.15091665
## PH 0.07165410 -0.19940539 -0.118181026 0.047220496 -0.15091665
## GPS GPS_PIB PM PH
## Poblacion -0.023399654 -0.020005525 -0.06347215 0.06347215
## RPC -0.023840319 -0.079222375 -0.08267715 0.08267715
## EV -0.039832570 -0.188159815 0.02152171 -0.02152171
## TM -0.032008708 0.058173527 0.38125314 -0.38125314
## TN 0.087835489 0.253387848 -0.04747079 0.04747079
## IF 0.092327141 0.306444756 -0.07165410 0.07165410
## TD 0.040577304 -0.057488142 0.19940539 -0.19940539
## RP -0.001932711 0.109954623 0.11818103 -0.11818103
## IDH -0.059180357 -0.217761819 -0.04722050 0.04722050
## IG 0.013678567 -0.088201813 0.15091665 -0.15091665
## GPS 1.000000000 -0.009452073 0.03460990 -0.03460990
## GPS_PIB -0.009452073 1.000000000 0.02282926 -0.02282926
## PM 0.034609897 0.022829259 1.00000000 -1.00000000
## PH -0.034609897 -0.022829259 -1.00000000 1.00000000
# Extraer la correlación con la variable "EV"
cor_ev <- cor_matrix[, "EV"]
cor_ev
## Poblacion RPC EV TM TN IF
## 0.009665429 0.651488267 1.000000000 -0.034609205 -0.872076922 -0.844075665
## TD RP IDH IG GPS GPS_PIB
## -0.102695462 -0.621648920 0.905845947 -0.292700352 -0.039832570 -0.188159815
## PM PH
## 0.021521707 -0.021521707
# Seleccionar variables con correlación significativa (umbral de 0.3)
high_cor_vars <- names(cor_ev[abs(cor_ev) > 0.3])
high_cor_vars #Variables seleccionadas
## [1] "RPC" "EV" "TN" "IF" "RP" "IDH"
# Filtrar el conjunto de datos solo con variables significativas
datos_reducidos <- datos_normalizados[, high_cor_vars]
# Imprimimos la imagen de la matriz
ggcorrplot(cor_matrix,
method = "circle", # Opción "square" para cuadrados
type = "lower", # Mostrar solo la mitad inferior
lab = TRUE, # Etiquetas con valores numéricos
lab_size = 3, # Tamaño de las etiquetas
title = "Matriz de Correlación de Variables Normalizadas",
colors = c("#6D9EC1", "white", "#E46726")) # Colores de gradiente

# Verificamos multicolinealidad
# Ajustar un modelo lineal con todas las variables significativas
modelo_vif <- lm(EV ~ ., data = datos_reducidos)
vif_values <- vif(modelo_vif)
print(vif_values)
## RPC TN IF RP IDH
## 2.455057 37.121462 27.290880 1.704114 10.179256
# Eliminar TN (por ejemplo) y recalcular modelo y VIF
modelo_vif2 <- lm(EV ~ RPC + IF + RP + IDH, data = datos_reducidos)
vif_values2 <- vif(modelo_vif2)
print(vif_values2)
## RPC IF RP IDH
## 2.435379 4.549623 1.704056 8.024101
# Eliminar IF (por ejemplo) y recalcular modelo y VIF
modelo_vif3 <- lm(EV ~ RPC + TN + RP + IDH, data = datos_reducidos)
vif_values3 <- vif(modelo_vif3)
print(vif_values3)
## RPC TN RP IDH
## 2.446980 6.188464 1.704114 9.992293
# Calcular el VIF para cada variable
vif_values <- vif(modelo_vif)
vif_values
## RPC TN IF RP IDH
## 2.455057 37.121462 27.290880 1.704114 10.179256
# MODELO CUANTIL
# Modelo de regresión cuantil para tau = 0.5 (mediana)
if (!require(quantreg)) install.packages("quantreg")
library(quantreg)
modelo_qr <- rq(EV ~ RPC + IF + RP + IDH, tau = 0.5, data = datos_reducidos)
summary(modelo_qr)
##
## Call: rq(formula = EV ~ RPC + IF + RP + IDH, tau = 0.5, data = datos_reducidos)
##
## tau: [1] 0.5
##
## Coefficients:
## coefficients lower bd upper bd
## (Intercept) 0.02469 -0.02908 0.07225
## RPC 0.09140 0.03045 0.15997
## IF -0.33065 -0.45047 -0.05643
## RP -0.02835 -0.21850 0.07218
## IDH 0.51110 0.41414 0.72364
#Para varios cuantiles
taus <- seq(0.1, 0.9, by = 0.1)
modelos_cuantiles <- lapply(taus, function(tau) {
rq(EV ~ RPC + IF + RP + IDH, tau = tau, data = datos_reducidos)
})
coeficientes <- sapply(modelos_cuantiles, coef)
print(coeficientes)
## [,1] [,2] [,3] [,4] [,5]
## (Intercept) -0.52293441 -0.31998520 -0.20414224 -0.09781509 0.02468586
## RPC 0.06502898 0.07854523 0.06749328 0.04411055 0.09139820
## IF -0.19392417 -0.24906155 -0.18800831 -0.23557384 -0.33064831
## RP -0.23786521 -0.14083430 -0.18800389 -0.09257021 -0.02835079
## IDH 0.66669247 0.65012240 0.65989589 0.66777796 0.51109984
## [,6] [,7] [,8] [,9]
## (Intercept) 0.12192191 0.20444411 0.340686725 0.46510968
## RPC 0.05777073 0.01645561 -0.000635823 0.04786969
## IF -0.28020612 -0.22988308 -0.177711491 -0.20605513
## RP 0.02597823 0.04353982 0.044285475 0.06410422
## IDH 0.58276683 0.65598936 0.656908584 0.58206361
# Ajustar el modelo de regresión cuantil para la mediana (tau = 0.5)
modelo_qr <- rq(EV ~ RPC + IF + RP + IDH, tau = 0.5, data = datos_reducidos)
# Mostrar resumen del modelo con test bootstrap para inferencia
summary(modelo_qr, se = "boot")
##
## Call: rq(formula = EV ~ RPC + IF + RP + IDH, tau = 0.5, data = datos_reducidos)
##
## tau: [1] 0.5
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) 0.02469 0.03625 0.68096 0.49686
## RPC 0.09140 0.04699 1.94506 0.05349
## IF -0.33065 0.13575 -2.43579 0.01594
## RP -0.02835 0.08488 -0.33401 0.73880
## IDH 0.51110 0.12764 4.00431 0.00009
# Prueba de bondad entre cuantiles (Wald)
# Ajustar un modelo cuantil para varios cuantiles (ej. 0.25, 0.5 y 0.75)
modelo_wald <- rq(EV ~ RPC + IF + RP + IDH, tau = c(0.25, 0.5, 0.75), data = datos_reducidos)
# Aplicar prueba de Wald (prueba de igualdad de coeficientes entre cuantiles)
anova(modelo_wald)
## Quantile Regression Analysis of Deviance Table
##
## Model: EV ~ RPC + IF + RP + IDH
## Joint Test of Equality of Slopes: tau in { 0.25 0.5 0.75 }
##
## Df Resid Df F value Pr(>F)
## 1 8 496 4.0935 9.695e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Medida de bondad de ajuste
fitnull <- rq(EV ~ 1, tau = c(0.25, 0.5, 0.75), data = datos_reducidos, method = "fn")
fit4 <- rq(EV ~ RPC + IF + RP + IDH, tau = c(0.25, 0.5, 0.75), data = datos_reducidos, method = "fn")
pseudoR2_fit4 <- 1 - fit4$rho / fitnull$rho
pseudoR2_fit4
## [1] 0.6555897 0.6208897 0.5998999
# Gráfico de la prueba de bondad
if (!require(ggplot2)) install.packages("ggplot2")
library(ggplot2)
# Crear un data frame con los resultados
cuantiles <- c(0.25, 0.5, 0.75)
pseudoR2 <- pseudoR2_fit4
df_pseudoR2 <- data.frame(
Cuantil = cuantiles,
Pseudo_R2 = pseudoR2
)
ggplot(df_pseudoR2, aes(x = Cuantil, y = Pseudo_R2)) +
geom_point(color = "blue", size = 4) +
geom_line(color = "blue", size = 1) +
ylim(0,1) +
labs(
title = "Pseudo R-cuadrado para regresión cuantílica en diferentes cuantiles",
x = "Cuantil (τ)",
y = "Pseudo R-cuadrado"
) +
theme_minimal() +
theme(
text = element_text(size = 14)
)
## 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.

# Visualización simple para una variable (RPC) con el percentil 90
modelo_rpc <- rq(EV ~ RPC, tau = 0.9, data = datos_reducidos)
summary(modelo_rpc, se = "boot")
##
## Call: rq(formula = EV ~ RPC, tau = 0.9, data = datos_reducidos)
##
## tau: [1] 0.9
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) 0.82685 0.04004 20.65009 0.00000
## RPC 0.57902 0.06937 8.34630 0.00000
# Visualización
ggplot(datos_reducidos, aes(x = RPC, y = EV)) +
geom_point() +
geom_abline(intercept = coef(modelo_rpc)[1],
slope = coef(modelo_rpc)[2],
color = "red", size = 1.2) +
labs(title = "Regresión Cuantil (tau = 0.9)",
x = "Renta per cápita (RPC)", y = "Esperanza de vida (EV)")

# Calcular residuos para cada modelo
residuos <- lapply(modelos_cuantiles, function(modelo) modelo$residuals)
# Crear un data frame con los residuos y los cuantiles
df_residuos <- data.frame(
Residuos = unlist(residuos),
Cuantil = factor(rep(cuantiles, each = nrow(datos_reducidos)))
)
# Gráfico de dispersión de los residuos
ggplot(df_residuos, aes(x = 1:nrow(df_residuos), y = Residuos, color = Cuantil)) +
geom_point(alpha = 0.6) +
geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
labs(
title = "Gráfico de Residuos por Cuantil",
x = "Índice",
y = "Residuos"
) +
theme_bw()

# Extraer coeficientes de cada modelo
coeficientes <- lapply(modelos_cuantiles, coef)
coeficientes
## [[1]]
## (Intercept) RPC IF RP IDH
## -0.52293441 0.06502898 -0.19392417 -0.23786521 0.66669247
##
## [[2]]
## (Intercept) RPC IF RP IDH
## -0.31998520 0.07854523 -0.24906155 -0.14083430 0.65012240
##
## [[3]]
## (Intercept) RPC IF RP IDH
## -0.20414224 0.06749328 -0.18800831 -0.18800389 0.65989589
##
## [[4]]
## (Intercept) RPC IF RP IDH
## -0.09781509 0.04411055 -0.23557384 -0.09257021 0.66777796
##
## [[5]]
## (Intercept) RPC IF RP IDH
## 0.02468586 0.09139820 -0.33064831 -0.02835079 0.51109984
##
## [[6]]
## (Intercept) RPC IF RP IDH
## 0.12192191 0.05777073 -0.28020612 0.02597823 0.58276683
##
## [[7]]
## (Intercept) RPC IF RP IDH
## 0.20444411 0.01645561 -0.22988308 0.04353982 0.65598936
##
## [[8]]
## (Intercept) RPC IF RP IDH
## 0.340686725 -0.000635823 -0.177711491 0.044285475 0.656908584
##
## [[9]]
## (Intercept) RPC IF RP IDH
## 0.46510968 0.04786969 -0.20605513 0.06410422 0.58206361
# Crear un data frame con intercepto y pendiente de RPC (primer predictor) y los cuantiles
df_coeficientes <- data.frame(
Intercepto = sapply(coeficientes, function(x) x[1]),
Pendiente_RPC = sapply(coeficientes, function(x) x["RPC"]), # Ajusta el nombre si cambia
Cuantil = cuantiles
)
# Gráfico de coeficientes del intercepto por cuantil
ggplot(df_coeficientes, aes(x = Cuantil, y = Intercepto)) +
geom_line(color = "blue") +
geom_point(color = "blue", size = 3) +
labs(
title = "Coeficientes del Intercepto por Cuantil",
x = "Cuantil",
y = "Intercepto"
) +
theme_bw()

# Gráfico de coeficientes de la pendiente de RPC por cuantil
ggplot(df_coeficientes, aes(x = Cuantil, y = Pendiente_RPC)) +
geom_line(color = "darkgreen") +
geom_point(color = "darkgreen", size = 3) +
labs(
title = "Coeficientes de RPC por Cuantil",
x = "Cuantil",
y = "Pendiente"
) +
theme_bw()

# Distribución de residuos: densidad por cuantil
ggplot(df_residuos, aes(x = Residuos, fill = Cuantil)) +
geom_density(alpha = 0.5) +
labs(
title = "Distribución de los Residuos por Cuantil",
x = "Residuos",
y = "Densidad"
) +
theme_bw()

# Distribución de residuos: histograma por cuantil
ggplot(df_residuos, aes(x = Residuos, fill = Cuantil)) +
geom_histogram(alpha = 0.5, position = "identity", bins = 30) +
labs(
title = "Histograma de los Residuos por Cuantil",
x = "Residuos",
y = "Frecuencia"
) +
theme_bw()

# Obtener predicciones para cada modelo
predicciones <- lapply(modelos_cuantiles, function(modelo) {
predict(modelo, newdata = datos_reducidos)
})
# Crear data frame con predicciones, valores reales y cuantiles
df_pred <- data.frame(
Observado = rep(datos_reducidos$EV, times = length(taus)),
Predicho = unlist(predicciones),
Cuantil = factor(rep(taus, each = nrow(datos_reducidos)))
)
# Gráfico de dispersión predicho vs observado, coloreado por cuantil
ggplot(df_pred, aes(x = Observado, y = Predicho, color = Cuantil)) +
geom_point(alpha = 0.6) +
geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "black") +
labs(
title = "Predicciones vs Valores Observados por Cuantil",
x = "Esperanza de Vida Observada",
y = "Esperanza de Vida Predicha"
) +
theme_minimal() +
theme(text = element_text(size = 14))

# Intervalos de confianza
# Definir cuantiles para el intervalo de confianza
taus_ic <- c(0.025, 0.05, 0.5, 0.95, 0.975)
taus_ic
## [1] 0.025 0.050 0.500 0.950 0.975
# Ajustar los modelos para esos cuantiles
modelos_ic <- lapply(taus_ic, function(tau) {
rq(EV ~ RPC + IF + RP + IDH, tau = tau, data = datos_reducidos)
})
# Obtener predicciones para cada modelo
preds_ic <- lapply(modelos_ic, function(mod) predict(mod, newdata = datos_reducidos))
# Crear un data frame con predicciones y observados
df_ic <- data.frame(
Observado = datos_reducidos$EV,
Q2.5 = preds_ic[[1]],
Q5 = preds_ic[[2]],
Mediana = preds_ic[[3]],
Q95 = preds_ic[[4]],
Q97.5 = preds_ic[[5]]
)
# Ordenar por valor observado para que la línea sea clara
df_ic <- df_ic[order(df_ic$Observado), ]
# Graficar. mediana con intervalos de confianza
ggplot(df_ic, aes(x = Observado)) +
geom_line(aes(y = Mediana), color = "blue", size = 1, linetype = "solid") +
geom_ribbon(aes(ymin = Q2.5, ymax = Q97.5), fill = "red", alpha = 0.2) + # 95% IC
geom_ribbon(aes(ymin = Q5, ymax = Q95), fill = "orange", alpha = 0.3) + # 90% IC
labs(
title = "Intervalos de Confianza por Cuantiles en Regresión Cuantílica",
x = "Esperanza de Vida Observada",
y = "Esperanza de Vida Predicha"
) +
theme_minimal() +
theme(text = element_text(size = 14))
