R code used for the paper: “Factors Determining the Probability for Irregular Central American Migrants to Reside in the United States”
##### STEP 1: CREATE THE POINTS ON
THE MEX-USA BORDER
##### STEP 2: CREATE THE POINTS ON THE PACIFIC COAST
##### STEP 3: CREATE THE POINTS IN THE GULF OF MEXICO
##### STEP 4: CREATE THE OTHER EAST COAST (Atlantic) POINTS
##### STEP 5: GATHER ALL AT-RISK COUNTIES (FAILURE)
##### STEP 6: ELIMINATE THE REPEATED POINTS
require(sf)
## Loading required package: sf
## Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
require(housingData)
## Loading required package: housingData
require(dplyr)
## Loading required package: 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
require(mapview)
## Loading required package: mapview
require(psych)
## Loading required package: psych
require(geosphere)
## Loading required package: geosphere
## Warning: package 'geosphere' was built under R version 4.4.1
require(readr)
## Loading required package: readr
STEP 1: CREATE MEXICO-USA BORDER POINTS
point_border <- read_csv("~/Desktop/OneDrive - United Nations/IFF/MATEMÁTICAS/MODELO LOGISTICO/Coordenadas frontera.csv")
## Rows: 20 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (4): OBJECTID, fid_1, X, Y
##
## ℹ 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.
pb <- data.frame(lat = point_border$Y, long = point_border$X)
pb_CA <- pb[1:2,]
Function to calculate the midpoint
between boundary points
Suppose we have 3 original points
(1, 2 and 3)
We generate 2 midpoints: the midpoint between point 1
and point 2
and the midpoint between point 2 and point 3
Now, the original base (pb) has 20 rows
With our function, our
new array will have 2n - 1 = 2×20 - 1 = 39 rows
That is: the last
data of pb (n = 20) will not be in the position n = 20 of our new array
but in row 39
As we create 2 middle points, there are only 2 iterations
funcion_punto_medio_frontera <- function(pb) { # en la primera iteracion, se guarda el punto original 1 y se obtiene el punto medio entre los puntos 1 y 2
# en la siguiente iteracion, se obtiene el punto original 2 y se obtiene el punto medio entre los puntos 2 y 3
# ya no hay iteracion (entonces falta guadar el punto original 3)
i <- 1
n <- nrow(pb)
puntos_medio_long <- c()
puntos_medio_lat <- c()
k <- 1 # la k es para guardar los puntos en la salida (nuevo arreglo)
while (i <= n - 1) { # Con 3 puntos originales (n), obtenemos 2 puntos medio (n-1)
# Etapa 1: Creamos p1 y p2 para obtener su punto medio
p1 <- c(pb$long[i], pb$lat[i]) # varian los puntos de pb pero no se guardan
p2 <- c(pb$long[i + 1], pb$lat[i + 1]) # el punto 2 es la segunda fila de la base original. Se usa para obtener el punto medio entre los ptos 1 y 2
pm <- midPoint(p1, p2)
# Etapa 2: Creamos la columna longitud (que contiene pto 1 y pto medio) y la columna latitud (que contiene pto 1 y pto medio)
puntos_medio_long[k] <- p1[1] # usamos una k para guardar el punto original. aqui, se guardan LOS puntos
puntos_medio_lat[k] <- p1[2]
puntos_medio_long[k + 1] <- pm[1] # usamos k + 1 para guardar el punto medio
puntos_medio_lat[k + 1] <- pm[2]
k <- k + 2 # las 2 primeras filas del arreglo nuevo ya son guardadas, entonces se le agrega 2 a k
# para que guarde el siguiente punto original en una fila vacia
# pasa esto porque estamos agregando a la salida 1 fila procedente de la base original + 1 fila del punto medio
i <- i + 1
}
# El ultimo punto de pb no aparece porque la i va hasta n - 1, la i nunca toma este valor pero el ultimo punto esta en n
# Entonces se agrega el ultimo punto original (ubicado en la posicion n) al nuevo arreglo:
# El numero de filas de nuestro arreglo va a ser 3 puntos originales (n) + 2 puntos nuevos = 5 ptos
# Es decir: n + n - 1 = 2n - 1 = 5 ptos
# Es decir: la ultima fila esta en la posicion 2n - 1
# Se hace fuera del while porque solo se trata de un punto, el ultimo
puntos_medio_long[2 * n - 1] <- pb$long[n] # 2 x 3 - 1 = 6 - 1 = 5 = ultima fila del arreglo original
puntos_medio_lat[2 * n - 1] <- pb$lat[n]
return(data.frame(long = puntos_medio_long, lat = puntos_medio_lat))
}
nuevos_puntos_CA <- funcion_punto_medio_frontera(pb_CA) # 3 puntos originales + 2 puntos medios = 5 puntos
pb_CA_3_puntos <- funcion_punto_medio_frontera(pb_CA)
mapview(pb_CA_3_puntos, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
Add the point in Yuma:
pb_CA_4_puntos <- rbind(pb_CA_3_puntos, c(-114.7254, 32.71798))
vector_puntos <- paste("punto", 1:nrow(pb_CA_4_puntos), sep = "")
pb_CA_4_puntos <- cbind(vector_puntos, pb_CA_4_puntos)
mapview(pb_CA_4_puntos, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
1.2 Create the points in Arizona
pb_ARIZ <- pb[3:6,]
pb_ARIZ
## lat long
## 3 32.31493 -114.2221
## 4 31.80396 -112.5694
## 5 31.33299 -110.9168
## 6 31.33432 -109.1690
Replace column 1 by column 2
pb_ARIZ[,c(2,1)]
## long lat
## 3 -114.2221 32.31493
## 4 -112.5694 31.80396
## 5 -110.9168 31.33299
## 6 -109.1690 31.33432
pb_ARIZ <- pb_ARIZ[,c(2,1)]
ARIZONA counties to calculate the distance between each point y each county
condados_ARIZ <- geoCounty %>% filter(rMapState == "arizona")
vector_puntos <- paste("punto", 1:nrow(pb_ARIZ), sep = "")
pb_ARIZ <- cbind(vector_puntos, pb_ARIZ)
mapview(pb_ARIZ, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
1.3. Create the New Mexico points
################ New Mexico State
pb_NM <- pb[7:8,]
pb_NM <- pb_NM[,c(2,1)]
condados_NM <- geoCounty %>% filter(rMapState == "new mexico")
dim(condados_NM)
## [1] 33 7
vector_puntos <- paste("punto", 1:nrow(pb_NM), sep = "")
pb_NM <- cbind(vector_puntos, pb_NM)
mapview(pb_NM, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
1.4. Construir los puntos en Texas
pb_TX <- pb[8:20,]
Sustituir la columna 1 por la columna 2
pb_TX <- pb_TX[,c(2,1)]
condados_TX <- geoCounty %>% filter(rMapState == "texas")
vector_puntos <- paste("punto", 1:nrow(pb_TX), sep = "")
pb_TX <- cbind(vector_puntos, pb_TX)
mapview(pb_TX, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
par(mfrow = c(2,2))
mapview(pb_CA_4_puntos, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
mapview(pb_ARIZ, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
mapview(pb_NM, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
mapview(pb_TX, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
1.5. Build the dataset of the border points
pb_lon <- c(pb_CA_4_puntos[,2], pb_ARIZ[,2], pb_NM[1,2], pb_TX[,2])
pb_lat <- c(pb_CA_4_puntos[,3], pb_ARIZ[,3], pb_NM[1,3], pb_TX[,3])
nombres <- paste("punto", 1:length(pb_lon), sep = "")
arreglo_pb <- data.frame(puntos = nombres, lon = pb_lon, lat = pb_lat)
mapview(arreglo_pb, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)
1.6. Build the dataset of centroid of all counties in the U.S. border states.
condados_CA <- geoCounty %>% filter(rMapState == "california")
condados_ARIZ <- geoCounty %>% filter(rMapState == "arizona")
condados_NM <- geoCounty %>% filter(rMapState == "new mexico")
condados_TX <- geoCounty %>% filter(rMapState == "texas")
arreglo_condados_estados_fronterizos_USA <- rbind(condados_CA, condados_ARIZ, condados_NM, condados_TX)
mapview(arreglo_condados_estados_fronterizos_USA, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)
From here, there are 3 steps:
Calculate the distances between each border point (base “pb”) and each county (base “county”)
Obtain the distance between each county and its nearest border point For example, row 1 is the distance between the county “alameda” and the nearest border point to this county (which is obtained with min) before min, we had the distance between each county and each border point with min, we only have the distance between each county and its nearest border point
Filter out the counties that are less than 200 km away from the border.
1.7. Calculate the distances between each border point (base “pb”) and each county (base “county”).
For example, row 1 is the distance between the county “alameda” and the closest border point to this county (obtained with min) before min, we had the distance between each county and each border point with min, we only have the distance between each county and its single closest border point.
Distancia_cada_checkpoint_cada_condado3 <- function(condados_CA, pb_CA) { # en este caso, estamos usando los condados y pb de CA. Pero podemos usar la funcion para cualquier otro
i <- 1
n <- nrow(condados_CA)
num_pb <- nrow(pb_CA)
nombres_pb <- c()
nombres_condados <- c()
distancia_cada_checkpoint_cada_condado <- c()
estado <- c()
lon <- c()
lat <- c()
k <- 1 # k es el numero de distancias calculadas (# de checkpoints * # de condados)
# k se pone fuera de los whiles para que no se reinicie y no dependa de i o j para avanzar
while (i <= n) { # se fija el condado
j <- 1 # j se define dentro del primer while porque: para un i (condado), j (checkpoint) varia
# se recorren todos los checkpoints de CA antes de pasar al siguiente condado
while (j <= num_pb) {
points <- data.frame(long = c(pb_CA[j, 2], condados_CA[i, 4]), # primero, viene lon y despues lat
lat = c(pb_CA[j, 3], condados_CA[i, 5]))
points_sf <- st_as_sf(points , crs = 4326L , coords = c("long", "lat")) # sf = simple features. convert points to geometry points
distancia_cada_checkpoint_cada_condado[k] <- st_distance(points_sf)[1,2] / 1000 # redondear a 0 decimal
#nombres_pb[k] <- pb_CA[j, 1] # nombres_checkpoint se coloca al mismo nivel del contador de distancias k (mismo while)
# se rellena el vector con los nbres de checkpoints k veces (numero de distancias)
nombres_pb[k] <- arreglo_pb[j, 1]
nombres_condados[k] <- as.character(condados_CA[i, 7]) # cuando j = 1, i es 1. cuando j = 2, i sigue en 1. cambia i cuando se termina de recorrer todas las j
# R entiende que se repite los nbres de condados tantas veces como checkpoints porque j varia de 1 al num de checkpoints
lon[k] <- condados_CA[i, 4]
lat[k] <- condados_CA[i, 5]
estado[k] <- as.character(condados_CA[i, 6])
# se debe guardar como vector de character para que, en nuestra salida, no aparezca como variabe numerica
# k + 1 ayuda a rellenar el vector salida
k <- k + 1 # Por cada distancia que calculemos, queremos que k aumente 1
# se pone aqui para guardar el siguiente valor de distancia
j <- j + 1
}
i <- i + 1
}
return(data.frame(estados = estado, condado = nombres_condados, pb = nombres_pb, distancia = distancia_cada_checkpoint_cada_condado,
lon = lon, lat = lat))
}
dist_todos_condados_todos_pb <- Distancia_cada_checkpoint_cada_condado3(arreglo_condados_estados_fronterizos_USA, arreglo_pb)
1.8. Function to obtain the distance between each county and its nearest border point The coordinates do not change, they are used as a reference.
The function selects the counties that are at the minimum distance from the border points (with their lon and lat).
For example, row 1 is the distance between the county “alameda” and the nearest border point to this county (which is obtained with min) before min, we had the distance between each county and each border point with min, we only have the distance between each county and its nearest border point
dist_min_por_grupo_condado <- function(dist_todos_condados_todos_pb) {
i <- 1
# num_condados <- length(unique(dist_todos_condados_todos_pb$condado))
num_condados <- 360 # son 360 condados de los 4 estados fronterizos de EE.UU. (CA, ARIZ, NM, TX)
num_pb <- length(unique(dist_todos_condados_todos_pb[, 3]))
dist <- c()
nombre_condados <- c()
lon <- c()
lat <- c() # la salida tiene que ser de la misma dimension que el numero de i (es decir de condados)
estado <- c()
li <- 0
ls <- num_pb # dist_todos_condados_todos_pb contiene los 22 puntos frontera, por bloque (se repiten).
# son 22 puntos frontera y luego nuevamente los mismos 22 puntos frontera
while (i <= num_condados) {
li <- li + 1 # es para que, en la segunda iteracion, la fila sea 23 y no 22
distancias <- dist_todos_condados_todos_pb[li:ls, 4] ## 22 distancias en cada iteracion (hay 22 puntos fronterizos)
dist_min_funcion <- min(distancias)
posicion <- which(dist_min_funcion == dist_todos_condados_todos_pb[, 4]) ## da la posicion del valor minimo
## para poder ubicar la lon, lat y nbre del condado
#print(posicion)
lon[i] <- dist_todos_condados_todos_pb[posicion, 5]
lat[i] <- dist_todos_condados_todos_pb[posicion, 6]
dist[i] <- dist_min_funcion
estado[i] <- dist_todos_condados_todos_pb[posicion, 1]
nombre_condados[i] <- dist_todos_condados_todos_pb[posicion, 2]
li <- ls
i <- i + 1 # construyo la i + 1 antes de ls (abajo) porque ls depende de i
ls <- i * num_pb # es la ls de cada bloque. para el bloque 1, es i * 22 = 1 * 22 = 22. Para el 2ndo bloque, es i * 22 = 2 * 22 = 44
}
return(data.frame(estado, nombre_condados, dist, lon, lat))
}
data_frame_dist_min_por_grupo_condado <- dist_min_por_grupo_condado(dist_todos_condados_todos_pb)
1.9. Filtering the counties less than 200 km from the border
First, we tried to do it with “filter” but we didn’t get the coordinates so when we extracted with map county, it extracted all the counties that had the same name . For example, there are two Orange counties: in the border and outside the border.
Below is the attempt with filter:
dist_min_all_counties_all_pb_minus_160 <-
dist_min_all_counties_all_pb %>% #filter(min(distance)
<= 160) dim(dist_min_all_counties_all_pb_all_pb_minus_160)
FUNCTION THAT FILTERS THE COUNTIES WITH LESS THAN 200 KM OF DISTANCE
dist_min_todos_condados_todos_pb <- dist_todos_condados_todos_pb %>% group_by(condado) %>% summarise(min(distancia))
head(dist_min_todos_condados_todos_pb)
## # A tibble: 6 × 2
## condado `min(distancia)`
## <chr> <dbl>
## 1 alameda 713.
## 2 alpine 717.
## 3 amador 731.
## 4 anderson 576.
## 5 andrews 281.
## 6 angelina 634.
1.9. Filtar los condados de menos de 200 km de la frontera
Primero, lo intentamos hacer con “filter” pero no obteniamos las coordendas lo que hace que cuando extraimos con map county, nos extraia todos los condados que tenian el mismo nbre Por ej, hay dos condados Orange: en la franja y fuera de la franja
Abajo viene el intento con filter:
dist_min_todos_condados_todos_pb_menos_160 <-
dist_min_todos_condados_todos_pb %>%
#filter(min(distancia) <= 160)
dim(dist_min_todos_condados_todos_pb_menos_160)
FUNCION QUE FILTRA LOS CONDADOS CON MENOS DE 200 KM DE DISTANCIA
filtro_condados_menos_161 <- function(data_frame_dist_min_por_grupo_condado, umbral) {
i <- 1
n <- nrow(data_frame_dist_min_por_grupo_condado)
nombre_condados <- c()
dist <- c()
lon <- c()
lat <- c()
estado <- c()
k <- 1 # la dimension de la salida es menor que la de la base "data_frame_dist_min_por_grupo_condado", por eso se usa k
while (i <= n) { # las iteraciones se acaban hasta checar todas las filas de data_frame_dist_min_por_grupo_condado)
if(data_frame_dist_min_por_grupo_condado[i, 3] <= umbral)
{
dist[k] <- data_frame_dist_min_por_grupo_condado[i, 3]
nombre_condados[k] <- data_frame_dist_min_por_grupo_condado[i, 2]
lon[k] <- data_frame_dist_min_por_grupo_condado[i, 4]
lat[k] <- data_frame_dist_min_por_grupo_condado[i, 5]
estado[k] <- data_frame_dist_min_por_grupo_condado[i, 1]
k <- k + 1
}
else{k <- k}
i <- i + 1
}
return(data.frame(estado, nombre_condados, dist, lon, lat))
}
umbral <- 161
STEP 2: CREATE THE POINTS ON THE PACIFIC COAST 2.1. CREATE THE POINTS OF THE PACIFIC COAST (CALIFORNIA) We start from the extreme points and calculate their midpoints.
ultimo_punto_CA <- data.frame(lat = c(34.92197, 37.30028, 39.60569, 41.95132),
long = c(-120.65186, -122.40967, -123.78296, -124.18945))
ultimo_punto_CA
## lat long
## 1 34.92197 -120.6519
## 2 37.30028 -122.4097
## 3 39.60569 -123.7830
## 4 41.95132 -124.1894
mapview(ultimo_punto_CA, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
Incluir el punto al extremo sur de CA:
extremos_CA <- rbind(pb[1,], ultimo_punto_CA)
mapview(extremos_CA, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
Include the point to the South extreme of CA:
nuevos_extremos_CA <- funcion_punto_medio_frontera(extremos_CA)
vector_puntos <- paste("punto", 1:nrow(nuevos_extremos_CA), sep = "")
vector_puntos
## [1] "punto1" "punto2" "punto3" "punto4" "punto5" "punto6" "punto7" "punto8"
## [9] "punto9"
nuevos_extremos_CA <- cbind(vector_puntos, nuevos_extremos_CA)
mapview(nuevos_extremos_CA , xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
ultimo_punto_CA <- data.frame(lat = c(33.73804, 34.92197, 36.09350, 37.30028, 38.45511, 39.60569, 40.77222, 41.95132),
long = c(-118.39417, -120.65186, -121.62415, -122.40967, -123.08538, -123.78296, -124.18945, -124.18945))
ultimo_punto_CA <- rbind(pb[1,], ultimo_punto_CA)
ultimo_punto_CA <- cbind(vector_puntos, ultimo_punto_CA)
mapview(ultimo_punto_CA , xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
ultimo_punto_CA <- ultimo_punto_CA[,c(3,2)]
dim(ultimo_punto_CA)
## [1] 9 2
ultimo_punto_CA <- cbind(vector_puntos, ultimo_punto_CA)
2.2.CALCULATING THE DISTANCE BETWEEN THE POINTS OF THE PACIFIC COAST AND THE PACIFIC COAST
last point CA = 9 points of the coast counties_CA = the 58 counties of CA The number of rows of the base resulting from the function below should be 9*58 = 522
dist_costa_condados_CA_costa_pacifica <- Distancia_cada_checkpoint_cada_condado3(condados_CA, ultimo_punto_CA)
dim(dist_costa_condados_CA_costa_pacifica) # 522
## [1] 522 6
Distancia_cada_checkpoint_cada_condado3 <- function(condados_CA, ultimo_punto_CA) { # en este caso, estamos usando los condados y pb de CA. Pero podemos usar la funcion para cualquier otro
i <- 1
n <- nrow(condados_CA)
num_pb <- nrow(ultimo_punto_CA)
nombres_pb <- c()
nombres_condados <- c()
distancia_cada_checkpoint_cada_condado <- c()
estado <- c()
lon <- c()
lat <- c()
k <- 1 # k es el numero de distancias calculadas (# de checkpoints * # de condados)
# k se pone fuera de los whiles para que no se reinicie y no dependa de i o j para avanzar
while (i <= n) { # se fija el condado
j <- 1 # j se define dentro del primer while porque: para un i (condado), j (checkpoint) varia
# se recorren todos los checkpoints de CA antes de pasar al siguiente condado
while (j <= num_pb) {
points <- data.frame(long = c(ultimo_punto_CA[j, 2], condados_CA[i, 4]), # primero, viene lon y despues lat
lat = c(ultimo_punto_CA[j, 3], condados_CA[i, 5]))
points_sf <- st_as_sf(points , crs = 4326L , coords = c("long", "lat")) # sf = simple features. convert points to geometry points
distancia_cada_checkpoint_cada_condado[k] <- st_distance(points_sf)[1,2] / 1000 # redondear a 0 decimal
nombres_pb[k] <- ultimo_punto_CA[j, 1] # nombres_checkpoint se coloca al mismo nivel del contador de distancias k (mismo while)
# se rellena el vector con los nbres de checkpoints k veces (numero de distancias)
nombres_condados[k] <- as.character(condados_CA[i, 7]) # cuando j = 1, i es 1. cuando j = 2, i sigue en 1. cambia i cuando se termina de recorrer todas las j
# R entiende que se repite los nbres de condados tantas veces como checkpoints porque j varia de 1 al num de checkpoints
lon[k] <- condados_CA[i, 4]
lat[k] <- condados_CA[i, 5]
estado[k] <- as.character(condados_CA[i, 6])
# se debe guardar como vector de character para que, en nuestra salida, no aparezca como variabe numerica
# k + 1 ayuda a rellenar el vector salida
k <- k + 1 # Por cada distancia que calculemos, queremos que k aumente 1
# se pone aqui para guardar el siguiente valor de distancia
j <- j + 1
}
i <- i + 1
}
return(data.frame(estados = estado, condado = nombres_condados, pb = nombres_pb, distancia = distancia_cada_checkpoint_cada_condado,
lon = lon, lat = lat))
}
dist_costa_pac <- Distancia_cada_checkpoint_cada_condado3(condados_CA, ultimo_punto_CA)
dim(dist_costa_pac)
## [1] 522 6
2.3. ASSIGN TO EACH COUNTY ITS NEAREST BORDER POINT
dist_min_por_grupo_condado2 <- function(dist_costa_pac) {
i <- 1
# num_condados <- length(unique(dist_todos_condados_todos_pb$condado))
num_condados <- 58 # son 58 condados de CA
num_pb <- length(unique(dist_costa_pac[,3]))
dist <- c()
nombre_condados <- c()
lon <- c()
lat <- c() # la salida tiene que ser de la misma dimension que el numero de i (es decir de condados)
estado <- c()
li <- 0
ls <- num_pb
while (i <= num_condados) {
li <- li + 1 # es para que, en la segunda iteracion, la fila sea 23 y no 22
distancias <- dist_costa_pac[li:ls, 4] ## 22 distancias en cada iteracion
dist_min_funcion <- min(distancias)
posicion <- which(dist_min_funcion == dist_costa_pac[, 4]) ## da la posicion de la distancia minimo
#print(posicion)
lon[i] <- dist_costa_pac[posicion, 5]
lat[i] <- dist_costa_pac[posicion, 6]
dist[i] <- dist_min_funcion
nombre_condados[i] <- dist_costa_pac[posicion, 2]
estado[i] <- dist_costa_pac[posicion, 1]
li <- ls
i <- i + 1 # construyo la i + 1 antes de ls porque ls depende de i
ls <- i * num_pb # es la ls de cada bloque. para el bloque 1, es i * 22 = 1 * 22 = 22. Para el 2ndo bloque, es i * 22 = 2 * 22 = 44
}
return(data.frame(estado, nombre_condados, dist, lon, lat))
}
data_frame_dist_min_por_grupo_condado_costa <- dist_min_por_grupo_condado2(dist_costa_pac)
dim(data_frame_dist_min_por_grupo_condado_costa)
## [1] 58 5
2.4. FILTER THE COASTAL COUNTIES THAT ARE LESS THAN 200 KM AWAY FROM EACH OTHER
#data_frame_dist_min_por_grupo_condado_costa %>% filter(dist <= umbral)
umbral <- 161
condados_frontera_menos_161 <- filtro_condados_menos_161(data_frame_dist_min_por_grupo_condado, umbral)
dim(condados_frontera_menos_161)
## [1] 49 5
mapview(condados_frontera_menos_161, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)
#condados_costa_menos_161 <- filtro_condados_menos_161(, umbral)
#head(condados_costa_menos_161)
#mapview(condados_costa_menos_161, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)
filtro_condados_menos_161 <- function(data_frame_dist_min_por_grupo_condado, umbral) {
i <- 1
n <- nrow(data_frame_dist_min_por_grupo_condado_costa)
nombre_condados <- c()
dist <- c()
lon <- c()
lat <- c()
estado <- c()
k <- 1 # la dimension de la salida es menor que la de la base "data_frame_dist_min_por_grupo_condado_costa", por eso se usa k
while (i <= n) { # las iteraciones se acaban hasta checar todas las filas de data_frame_dist_min_por_grupo_condado_costa)
if(data_frame_dist_min_por_grupo_condado[i, 3] <= umbral)
{
dist[k] <- data_frame_dist_min_por_grupo_condado[i, 3]
nombre_condados[k] <- data_frame_dist_min_por_grupo_condado[i, 2]
lon[k] <- data_frame_dist_min_por_grupo_condado[i, 4]
lat[k] <- data_frame_dist_min_por_grupo_condado[i, 5]
estado[k] <- data_frame_dist_min_por_grupo_condado[i, 1]
k <- k + 1
}
else{k <- k}
i <- i + 1
}
return(data.frame(estado, nombre_condados, dist, lon, lat))
}
condados_costa_menos_161 <- filtro_condados_menos_161(data_frame_dist_min_por_grupo_condado_costa, umbral)
dim(condados_costa_menos_161)
## [1] 34 5
mapview(condados_costa_menos_161, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)
STEP 3. CREAR LOS PUNTOS EN EL GOLFO DE MEXICO TEXAS 3.1.1. CREAR LOS PUNTOS DE LA COSTA DE TEXAS
puntos_costa_este <- data.frame(long = c(-97.15759, -97.44392, -97.56340, -97.38281, -97.11502, -96.40709, -95.48801, -94.91089, -93.87886),
lat = c(25.95866, 26.43615, 26.93676, 27.41444, 27.95195, 28.44515, 28.83355, 29.35525, 29.68209))
mapview(puntos_costa_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_costa_este <- funcion_punto_medio_frontera(puntos_costa_este)
mapview(puntos_costa_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos <- paste("punto", 1:nrow(puntos_costa_este), sep = "")
puntos_costa_este <- cbind(puntos, puntos_costa_este)
CALCULAR LAS DISTANCIAS ENTRE LA COSTA DE TEXAS Y LOS CONDADOS DE TEXAS condados TX = 254 puntos_costa_este = 17
dist_costa_TX <- Distancia_cada_checkpoint_cada_condado3(condados_TX, puntos_costa_este)
dim(dist_costa_TX)
## [1] 4318 6
3.1.3. CALCULATE THE MINIMUM DISTANCES OF THE EAST COAST POINTS FROM TEXAS
dist_min_por_grupo_condado_TX <- function(dist_todos_condados_todos_pb) {
i <- 1
# num_condados <- length(unique(dist_todos_condados_todos_pb$condado))
num_condados <- 254 # son 254 condados de Texas
num_pb <- length(unique(dist_todos_condados_todos_pb[, 3]))
dist <- c()
nombre_condados <- c()
lon <- c()
lat <- c() # la salida tiene que ser de la misma dimension que el numero de i (es decir de condados)
estado <- c()
li <- 0
ls <- num_pb
while (i <= num_condados) {
li <- li + 1 # es para que, en la segunda iteracion, la fila sea 23 y no 22
distancias <- dist_todos_condados_todos_pb[li:ls, 4] ## 22 distancias en cada iteracion
dist_min_funcion <- min(distancias)
posicion <- which(dist_min_funcion == dist_todos_condados_todos_pb[, 4]) ## da la posicion del valor minimo
#print(posicion)
nombre_condados[i] <- dist_todos_condados_todos_pb[posicion, 2]
lon[i] <- dist_todos_condados_todos_pb[posicion, 5]
lat[i] <- dist_todos_condados_todos_pb[posicion, 6]
dist[i] <- dist_min_funcion
estado[i] <- dist_todos_condados_todos_pb[posicion, 1]
li <- ls
i <- i + 1 # construyo la i + 1 antes de ls (abajo) porque ls depende de i
ls <- i * num_pb # es la ls de cada bloque. para el bloque 1, es i * 22 = 1 * 22 = 22. Para el 2ndo bloque, es i * 22 = 2 * 22 = 44
}
return(data.frame(estado, nombre_condados, dist, lon, lat))
}
dist_min_por_grupo_condado_TX_2 <- dist_min_por_grupo_condado_TX(dist_costa_TX)
dim(dist_min_por_grupo_condado_TX_2)
## [1] 254 5
3.1.3. FILTER POINTS OF LESS THAN 161 MILES ON THE TEXAS COAST
dist_TX_menos_161 <- dist_min_por_grupo_condado_TX_2 %>% filter(dist <= 161)
head(dist_TX_menos_161)
## estado nombre_condados dist lon lat
## 1 texas aransas 19.02828 -96.95149 28.23596
## 2 texas austin 136.97136 -96.28069 29.89024
## 3 texas bee 80.57762 -97.74272 28.41994
## 4 texas brazoria 29.12503 -95.46681 29.21466
## 5 texas brooks 66.48372 -98.22452 27.03885
## 6 texas calhoun 29.38509 -96.69405 28.52403
dim(dist_TX_menos_161)
## [1] 46 5
mapview(dist_TX_menos_161, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)
3.2. LOUISIANA
3.2.1. CREATE LOUISIANA POINTS
condados_louisiana <- geoCounty %>% filter(rMapState == "louisiana")
mapview(condados_louisiana, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)
puntos_louisiana <- data.frame(long = c(-93.70398,-89.64054),
lat = c(29.74172, 30.16294))
puntos_louisiana
## long lat
## 1 -93.70398 29.74172
## 2 -89.64054 30.16294
mapview(puntos_louisiana, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_louisiana <- funcion_punto_medio_frontera(puntos_louisiana)
mapview(puntos_louisiana, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_louisiana <- data.frame(long = c(-93.70398,-89.64054),
lat = c(29.74172, 30.16294))
puntos_louisiana <- data.frame(long = c(-93.70398, -91.67336, -89.64054),
lat = c(29.74172, 29.74560, 30.16294))
puntos_louisiana <- funcion_punto_medio_frontera(puntos_louisiana)
mapview(puntos_louisiana, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_louisiana <- data.frame(long = c(-93.70398, -92.69646, -91.67336, -90.56442, -89.64054),
lat = c(29.74172, 29.60988, 29.74560, 29.43362, 30.16294))
nombres_puntos <- paste("punto", 1:nrow(puntos_louisiana), sep="")
nombres_puntos
## [1] "punto1" "punto2" "punto3" "punto4" "punto5"
puntos_louisiana <- data.frame(nombres_puntos, puntos_louisiana)
puntos_louisiana
## nombres_puntos long lat
## 1 punto1 -93.70398 29.74172
## 2 punto2 -92.69646 29.60988
## 3 punto3 -91.67336 29.74560
## 4 punto4 -90.56442 29.43362
## 5 punto5 -89.64054 30.16294
dim(puntos_louisiana)
## [1] 5 3
mapview(puntos_louisiana, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
3.2.2. CALCULATE THE DISTANCES BETWEEN LOUISIANA COAST AND LOUISIANA COUNTIES
dim(puntos_louisiana) # 5 puntos frontera Louisiana
## [1] 5 3
dim(condados_louisiana) # 64 condados de Louisiana
## [1] 64 7
dist_condados_louisiana_costa_louisiana <- Distancia_cada_checkpoint_cada_condado3(condados_louisiana, puntos_louisiana)
dim(dist_condados_louisiana_costa_louisiana)
## [1] 320 6
3.2.3. CALCULATE THE MINIMUM DISTANCES BETWEEN LOUISIANA COAST AND LOUISIANA COUNTIES
dist_min_por_grupo_condado <- function(dist_todos_condados_todos_pb, num_condados) {
i <- 1
# num_condados <- length(unique(dist_todos_condados_todos_pb$condado))
num_pb <- length(unique(dist_todos_condados_todos_pb[, 3]))
dist <- c()
nombre_condados <- c()
lon <- c()
lat <- c() # la salida tiene que ser de la misma dimension que el numero de i (es decir de condados)
estado <- c()
li <- 0
ls <- num_pb
while (i <= num_condados) {
li <- li + 1 # es para que, en la segunda iteracion, la fila sea 23 y no 22
distancias <- dist_todos_condados_todos_pb[li:ls, 4] ## 22 distancias en cada iteracion
dist_min_funcion <- min(distancias)
posicion <- which(dist_min_funcion == dist_todos_condados_todos_pb[, 4]) ## da la posicion del valor minimo
#print(posicion)
nombre_condados[i] <- dist_todos_condados_todos_pb[posicion, 2]
lon[i] <- dist_todos_condados_todos_pb[posicion, 5]
lat[i] <- dist_todos_condados_todos_pb[posicion, 6]
dist[i] <- dist_min_funcion
estado[i] <- dist_todos_condados_todos_pb[posicion, 1]
li <- ls
i <- i + 1 # construyo la i + 1 antes de ls (abajo) porque ls depende de i
ls <- i * num_pb # es la ls de cada bloque. para el bloque 1, es i * 22 = 1 * 22 = 22. Para el 2ndo bloque, es i * 22 = 2 * 22 = 44
}
return(data.frame(estado, nombre_condados, dist, lon, lat))
}
num_condados_louisiana <- nrow(condados_louisiana)
dist_min_louisiana <- dist_min_por_grupo_condado(dist_condados_louisiana_costa_louisiana, num_condados_louisiana)
3.2.4. FILTER LOUISIANA COUNTIES TO THOSE WITH LESS THAN 200 KM FROM THE COAST
condados_louisiana_menos_161 <- dist_min_louisiana %>% filter(dist <= 161)
dim(condados_louisiana_menos_161)
## [1] 37 5
mapview(condados_louisiana_menos_161, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)
STEP 4 THE OTHER POINTS OF THE EAST COAST (Atlantic) The border patrol is coastal, so we create the border points of the Atlantic East Coast 4.1. CREATE THE POINTS OF THE EAST COAST
puntos_extremos_este <- data.frame(long = c(-89.53308, -67.12646), lat = c(30.18015, 44.73113))
mapview(puntos_extremos_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_extremos_este <- funcion_punto_medio_frontera(puntos_extremos_este)
## Como es una linea recta, reubicamos los puntos hacia la costa:
puntos_extremos_este <- data.frame(long = c(-89.53308, -75.97046, -67.12646), lat = c(30.18015, 36.78289, 44.73113))
puntos_extremos_este <- funcion_punto_medio_frontera(puntos_extremos_este)
mapview(puntos_extremos_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_extremos_este <- data.frame(long = c(-89.53308, -80.49408, -75.97046, -72.10327, -67.12646),
lat = c(30.18015, 32.30803, 36.78289, 41.31289, 44.73113))
puntos_extremos_este <- funcion_punto_medio_frontera(puntos_extremos_este)
mapview(puntos_extremos_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_extremos_este <- data.frame(long = c(-89.53308, -84.85291, -80.49408, -77.84088, -75.97046, -74.49348, -72.10327, -70.60638, -67.12646),
lat = c(30.18015, 29.75961, 32.30803, 34.15386, 36.78289, 39.33005, 41.31289, 43.17314, 44.73113))
Add middle points:
puntos_extremos_este <- funcion_punto_medio_frontera(puntos_extremos_este)
mapview(puntos_extremos_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
Relocate:
puntos_extremos_este <- data.frame(long = c(-89.53308, -87.23557, -84.85291, -80.80994, -80.49408, -79.1814178, -77.84088, -76.49643, -75.97046, -75.34355, -74.49348, -73.97781, -72.10327, -70.76157, -70.60638, -69.12598, -67.12646),
lat = c(30.18015, 30.39657, 29.75961, 28.57005, 32.30803, 33.238087, 34.15386, 35.26580, 36.78289, 38.08809, 39.33005, 40.33241, 41.31289, 42.23055, 43.17314, 44.01998, 44.73113))
puntos_extremos_este <- funcion_punto_medio_frontera(puntos_extremos_este)
mapview(puntos_extremos_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
dim(puntos_extremos_este)
## [1] 33 2
Relocate:
puntos_extremos_este <- data.frame(long = c(-89.53308, -88.39050, -87.23557, -86.03668, -84.85291, -82.82181, -80.80994, -81.42242, -80.49408, -79.83370, -79.1814178,
-78.55911, -77.84088, -77.11844, -76.49643, -76.24168, -75.97046, -75.77682, -75.34355, -75.07456, -74.49348, -74.15462, -73.97781,
-73.02612, -72.10327, -71.37817, -70.76157, -70.79693, -70.60638, -70.21122, -69.12598, -68.10150, -67.12646),
lat = c(30.18015, 30.37761, 30.39657, 30.27804, 29.75961, 29.15336, 28.57005, 30.44394, 32.30803, 32.75855, 33.238087,
33.84903, 34.15386, 34.68708, 35.26580, 36.10404, 36.78289, 37.49338, 38.08809, 38.71311, 39.33005, 39.83220, 40.33241,
40.74414, 41.31289, 41.66932, 42.23055, 42.70136, 43.17314, 43.61346, 44.01998, 44.38178, 44.73113))
dim(puntos_extremos_este)
## [1] 33 2
mapview(puntos_extremos_este, xcol = "long", ycol = "lat", crs = 4269, grid = FALSE)
puntos_nombres <- paste("punto", 1:nrow(puntos_extremos_este), sep = "")
puntos_extremos_este <- data.frame(puntos_nombres, puntos_extremos_este)
4.1. CALCULATE THE DISTANCES FROM THE COAST
#freq(geoCounty, "rMapState", plot = FALSE)
states <- c( "louisiana", "mississippi", "alabama", "florida", "georgia", "south carolina", "north carolina",
"maryland", "virginia", "delaware", "pennsylvania", "new jersey", "connecticut", "massachusetts",
"maine", "new hampshire", "new york")
estados_costa_este <- geoCounty %>% filter(rMapState %in% states) # vienen todos los condados tambien
dim(estados_costa_este)
## [1] 910 7
dist_costa_condados_costa_este <- Distancia_cada_checkpoint_cada_condado3(estados_costa_este, puntos_extremos_este)
dim(dist_costa_condados_costa_este)
## [1] 30030 6
4.2. CALCULAR THE MINIMUM DISTANCES
dist_minima_costa_este <- dist_min_por_grupo_condado(dist_costa_condados_costa_este, nrow(estados_costa_este))
dim(dist_minima_costa_este) #910
## [1] 910 5
head(dist_minima_costa_este)
## estado nombre_condados dist lon lat
## 1 alabama autauga 244.82606 -86.64565 32.54009
## 2 alabama baldwin 60.42531 -87.72627 30.73831
## 3 alabama barbour 187.62019 -85.39733 31.87403
## 4 alabama bibb 289.56814 -87.12526 32.99902
## 5 alabama blount 404.60190 -86.56271 33.99044
## 6 alabama bullock 205.56141 -85.71680 32.10634
4.3. FILTRER THE DISTANCES WITH LESS THAN 161 KM
condados_costa_este_menos_161 <- dist_minima_costa_este %>% filter(dist <= 161)
dim(condados_costa_este_menos_161)
## [1] 333 5
mapview(condados_costa_este_menos_161, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)
toda_costa_este_menos_161 <- rbind(condados_costa_este_menos_161,
condados_louisiana_menos_161,
dist_TX_menos_161)
dim(toda_costa_este_menos_161)
## [1] 416 5
mapview(toda_costa_este_menos_161, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)
STEP 5 JOINT ALL AT-RISK COUNTIES (FAILURE)
conjunto_condados_menos_161_ <- rbind(condados_frontera_menos_161, # 49
condados_costa_menos_161, # 34
condados_costa_este_menos_161, # 333
dist_TX_menos_161, # 46
condados_louisiana_menos_161) # 37
dim(conjunto_condados_menos_161_)
## [1] 499 5
mapview(conjunto_condados_menos_161_, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE)
dim(conjunto_condados_menos_161_)
## [1] 499 5
head(conjunto_condados_menos_161_)
## estado nombre_condados dist lon lat
## 1 california imperial 43.44225 -115.3751 33.04472
## 2 california orange 144.04868 -117.7533 33.71696
## 3 california riverside 129.54921 -116.0093 33.74562
## 4 california san diego 62.20824 -116.7202 33.04015
## 5 arizona cochise 83.25116 -109.7629 31.88631
## 6 arizona pima 79.92557 -111.8002 32.10501
CHECK IF THE DUPLICATES WERE REMOVED
distinct_conjunto <- conjunto_condados_menos_161_ %>% distinct(lon, lat, .keep_all = TRUE)
head(distinct_conjunto)
## estado nombre_condados dist lon lat
## 1 california imperial 43.44225 -115.3751 33.04472
## 2 california orange 144.04868 -117.7533 33.71696
## 3 california riverside 129.54921 -116.0093 33.74562
## 4 california san diego 62.20824 -116.7202 33.04015
## 5 arizona cochise 83.25116 -109.7629 31.88631
## 6 arizona pima 79.92557 -111.8002 32.10501
dim(distinct_conjunto)
## [1] 468 5
#468
mapview(distinct_conjunto, xcol = "lon", ycol = "lat", crs = 4269, grid = FALSE) # base limpia