#ÍNDICE DE MARGINACIÓN URBANA POR COLONIA
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"
# 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)
# 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"]]))
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])))
#### 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")
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))
## 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))))