#ÍNDICE DE MARGINACIÓN URBANA POR COLONIA

Paqueterías necesarias.

paquetes <- c("openxlsx", "dplyr", "p2distance", "stratification", "readxl")

instalar <- function(p){
  if (p == "p2distance" && 
      !suppressMessages(require(p, character.only = TRUE, quietly = TRUE))){
    install.packages(
      "https://cran.r-project.org/src/contrib/Archive/p2distance/p2distance_1.0.1.tar.gz",
      repos = NULL, type = "source"
    )
  } else if (!suppressMessages(require(p, character.only = TRUE, quietly = TRUE))){
    install.packages(p, dependencies = TRUE, quiet = TRUE)
  }
  library(p, character.only = TRUE, quietly = TRUE)
}

lapply(paquetes, instalar)
## [[1]]
## [1] "openxlsx"  "stats"     "graphics"  "grDevices" "utils"     "datasets" 
## [7] "methods"   "base"     
## 
## [[2]]
## [1] "dplyr"     "openxlsx"  "stats"     "graphics"  "grDevices" "utils"    
## [7] "datasets"  "methods"   "base"     
## 
## [[3]]
##  [1] "p2distance" "dplyr"      "openxlsx"   "stats"      "graphics"  
##  [6] "grDevices"  "utils"      "datasets"   "methods"    "base"      
## 
## [[4]]
##  [1] "stratification" "p2distance"     "dplyr"          "openxlsx"      
##  [5] "stats"          "graphics"       "grDevices"      "utils"         
##  [9] "datasets"       "methods"        "base"          
## 
## [[5]]
##  [1] "readxl"         "stratification" "p2distance"     "dplyr"         
##  [5] "openxlsx"       "stats"          "graphics"       "grDevices"     
##  [9] "utils"          "datasets"       "methods"        "base"

Lectura y unificación de la base IMUC_2020

# Ajusta la ruta a donde tengas descargado el ZIP descomprimido con "IMUC_2020.xlsx"
ruta_base <- "~/Desktop/R con René/IMUC_2020.xlsx"

# Leer ambas hojas y unirlas
sheet1 <- readxl::read_excel(ruta_base, sheet = "IMUC_2020_AGS-MOR")
sheet2 <- readxl::read_excel(ruta_base, sheet = "IMUC_2020_NAY-ZAC")
IMUC_2020 <- dplyr::bind_rows(sheet1, sheet2)

Cálculo del índice sintético vía método DP2

# Elegir las columnas 15 a 25 como variables de carencia
vars_carencia <- names(IMUC_2020)[15:25]

# Crear vector base de referencia (peor escenario teórico = mínimos)
maxRV <- makeReferenceVector(
  X = IMUC_2020[vars_carencia],
  reference_vector_function = max
)

# Cálculo del p2distance
ind_2020 <- p2distance(
  matriz          = as.matrix(IMUC_2020[vars_carencia]),
  reference_vector = maxRV,
  iterations      = 50
)
## [1] "Iteration 1"
## [1] "Iteration 2"
## [1] "Iteration 3"
## Se anexa el índice a la base de datos a por colonia

assign(paste0("IMUC_2020_resultados"), cbind(IMUC_2020[1:25], ind_2020[["p2distance"]])) 

Identificación de datos atípicos e Índice ficticio

assign(paste0("outliers_2020"), boxplot.stats(IMUC_2020_resultados[,26]))

## Se crea un índice ficticio donde se posición los datos que salen de la norma a la primera observación del primer cuantil 

assign(paste0("IMUC_2020_resultados"), IMUC_2020_resultados %>%
         mutate(IM_out = ifelse(get(paste(colnames(IMUC_2020_resultados))[26]) >= outliers_2020$stats[1],
                                get(paste(colnames(IMUC_2020_resultados))[26]),
                                outliers_2020$stats[1])))

Método de Dalenius & Hodges

#### Enlace de la nota metodológica : https://www.gob.mx/cms/uploads/attachment/file/714573/Nota_t_cnica_IMUC_2020.pdf

iteraciones <- 1500
start.time <- Sys.time()
i <- 1
sd <- matrix(NA, nrow = (iteraciones), ncol = 3)
meanh <- matrix(NA, nrow = (iteraciones), ncol = 6)
varh <- matrix(NA, nrow = (iteraciones), ncol = 6)
for (n in seq(5, iteraciones, 1)){
  cum <- strata.cumrootf(x = IMUC_2020_resultados[,27], CV = 0.05 , Ls = 5, alloc = c(0.5, 0, 0.5), nclass = n)
  sd[i,] <-  c(n, cum$stderr, cum$CV)
  meanh[i,] <- c(n, cum$meanh)
  varh[i,] <-  c(n, cum$varh)
  i <- i + 1
}
colnames(sd) <- c("n", "sderr", "CV")
colnames(meanh) <- c("nclass", paste0(rep("Strata", 5), 1:5))
colnames(varh) <- c("nclass", paste0(rep("Strata", 5), 1:5))
end.time <- Sys.time()
time.taken <- round(end.time - start.time, 2)
time.taken
## Time difference of 17.56 mins
min.strata <- sd %>% 
  as.data.frame() %>% 
  slice(which.min(.$CV))

## Continuación del código 
strata.DH_2020 <- strata.cumrootf(IMUC_2020_resultados[,27],
                                  CV = 0.05,
                                  Ls = 5,
                                  alloc = c(0.5, 0, 0.5), 
                                  nclass = 20)
strata.DH_2020
## Given arguments:
## x = IMUC_2020_resultados[, 27]
## nclass = 20, CV = 0.05, Ls = 5
## allocation: q1 = 0.5, q2 = 0, q3 = 0.5
## model = none
## 
## Strata information:
##           |      type rh |     bh   E(Y) Var(Y)    Nh nh fh
## stratum 1 | take-some  1 | 143.80 141.16   2.41  7876  1  0
## stratum 2 | take-some  1 | 147.24 145.81   0.93 12269  1  0
## stratum 3 | take-some  1 | 149.82 148.63   0.54 18602  1  0
## stratum 4 | take-some  1 | 152.40 151.07   0.55 20495  1  0
## stratum 5 | take-some  1 | 157.70 153.65   0.71 14984  1  0
## Total                                           74226  5  0
## 
## Total sample size: 5 
## Anticipated population mean: 149.0563 
## Anticipated CV: 0.002662845
#### Se agrega a la base de datos los resultados finales 

assign(paste0("IMUC_2020_resultados"), data.frame(IMUC_2020_resultados %>% 
                                                    select(-IM_out), ## Se elimina el índice ficticio
                                                  strata.DH_2020[["stratumID"]])) 

#### Se cambian los nombres de las columnas 
names(IMUC_2020_resultados) <- c(names(IMUC_2020_resultados)[1:25],
                                 paste0("IM_2020"), paste0("GM_2020"))

#### Se cambian los levels del método de D&H
levels(IMUC_2020_resultados[,27]) <- c("Muy alto", "Alto", "Medio", "Bajo", "Muy bajo")

Indice de marginación normalizado a nivel urbana por colonia

La normalización se realiza utilizando un cambio de escala conocido como normalización mínima-máxima. Con este procedimiento el índice de marginación se escala a valoresrelativos con un rango de entre cero y uno, lo cual permite su comparación numérica y le da una propiedad adicional al índice de marginación.

De antemano, se sabe que cada indicador simple toma valores de cero a 100 y, además,el método DP2 ya proporcionó el orden de entrada de las variables. Desviación estandar de los indicadores simples Es necesario calcular el estimador insesgado de la varianza poblacional de cada indiciador simple, ya el la función p2distance() no proporciona el cálculo.

desvest <- as.matrix(apply(IMUC_2020_resultados[15:25], MARGIN = 2, sd)) %>%
  as.data.frame() %>%
  rename("desvest" ="V1") %>%
  mutate(sd_muestral = .$desvest * (sqrt((dim(IMUC_2020_resultados[15:25])[1] - 1)/dim(IMUC_2020_resultados[15:25])[1]))) %>%
  mutate(desvest.inversa = 1/(.$sd_muestral))

Escenarios del mínimo y máximo valor en el índice por el método DP2

## Mínimo valor del índice
vector_minimo <- maxRV
minimo <- abs(vector_minimo - maxRV) * desvest$desvest.inversa *
  ind_2020[["correction_factors"]][names(IMUC_2020[15:25])] %>%
  t() %>%
  as.data.frame()

## Máximo valor del DP2   
vector_maximo <- rep(0, length(maxRV)) # Cuando los indicadores valen cero 
maximo <- abs(vector_maximo - maxRV) * desvest$desvest.inversa *
  ind_2020[["correction_factors"]][names(IMUC_2020[15:25])] %>%
  t() %>%
  as.data.frame()

assign(paste0("IMUC_2020_resultados"), IMUC_2020_resultados %>%  
         mutate(IMN_2020 = (.$IM_2020 - sum(minimo))/(sum(maximo) - sum(minimo))))