Cuando trabajamos con zonificación o geolocalización, la adyacencia entre los elementos del estudio es relevante. En este caso, quería trabajar con la adyacencia entre los polígonos que componen un archivo de datos espaciales shapefile; y para entender mejor cómo podemos obtener la adyacencia entre polígonos, creo que lo mejor es hacer un ejemplo con un mapa, en este caso un mapa de municipios de Barcelona. El primer paso es disponer del objeto con los datos espaciales; de esto ya he escrito mucho en el blog y por eso no me detengo mucho:

library(sp)
ub <- "./Desktop/R/mapas/ESP_adm4.rds"

# Creamos los objetos de R
espania <- readRDS(ub)
barcelona <- espania[espania$NAME_2 == "Barcelona", ]
plot(barcelona)
# Marcamos el centro de cada polígono
points(coordinates(barcelona))

adyacencia poligonos con R 1

Leemos el objeto con los datos municipales de España y hacemos un subset para quedarnos sólo con Barcelona y realizamos un mapa municipal de la provincia de Barcelona sencillamente usando plot. Podemos identificar todos los centroides de los polígonos que componen este objeto con la función coordinates; ahora lo que necesitamos identificar es la adyacencia entre estos puntos, la adyacencia entre los municipios de Barcelona. En mi caso, localicé el paquete spdep de R, muy adecuado para trabajar con ponderaciones.

Os pongo paso a paso el código de R y luego comento cómo voy buscando referencias para crear las adyacencias:

# install.packages("spdep")
library(spdep)
centros <- coordinates(barcelona)
mas_proxima <- knn2nb(knearneigh(centros))

El primer paso es buscar el centroide más cercano para cada uno de los elementos con los que trabajo y, a partir de ese momento, necesito buscar una referencia para establecer la adyacencia. En un primer paso fijo esa referencia en el percentil 99 y puedo graficarla:

referencia <- quantile(unlist(nbdists(mas_proxima, centros)), 0.99)
proximos <- dnearneigh(centros, 0, referencia)
plot(barcelona)
plot(proximos, centros, add = TRUE, col = "red")

adyacencia polígonos con R 2

Calculamos el percentil 99 del conjunto de todas las distancias entre próximos; algún polígono quedará necesariamente sin unir. La función dnearneigh va a crear una lista que, polígono a polígono, recoge los polígonos cuya distancia euclídea está dentro de los límites de referencia. Barcelona capital sólo se une a los municipios del sur porque los del norte están fuera de la distancia euclídea de referencia. A modo ilustrativo, la lista para los datos municipales de Barcelona con los que estamos trabajando sería:

str(proximos)
# List of 313
#  $ : int [1:190] ...
#  $ : int [1:11] 7 9 10 21 22 31 34 35 81 102 ...
#  ...
#  - attr(*, "class")= chr "nb"
#  - attr(*, "nbtype")= chr "distance"
#  - attr(*, "distances")= num [1:2] 0 0.0698
#  - attr(*, "region.id")= chr [1:313] "1" "2" "3" "4" ...
#  - attr(*, "call")= language dnearneigh(x = centros, d1 = 0, d2 = referencia)
#  - attr(*, "dnn")= Named num [1:2] 0 0.0698
#   ..- attr(*, "names")= chr [1:2] "" "99%"
#  - attr(*, "bounds")= chr [1:2] "GT" "LE"
#  - attr(*, "sym")= logi TRUE

El objeto barcelona se compone de 313 polígonos (municipios) y, para cada uno de los correspondientes polígonos, los adyacentes están en la lista. Si queremos que todos los municipios tengan su adyacente, la distancia de referencia habría de ser la máxima posible:

referencia <- max(unlist(nbdists(mas_proxima, centros)))
proximos <- dnearneigh(centros, 0, referencia)
plot(barcelona)
plot(proximos, centros, add = TRUE, col = "red")

adyacencia polígonos con R 3

Interesantes posibilidades las que nos ofrece spdep para la realización de estos análisis; en este caso estamos en el nivel básico: la adyacencia por distancias euclídeas. También podemos hacer adyacencias en función de los $k$ vecinos:

proximos_k4 <- knn2nb(knearneigh(centros, k = 4, longlat = TRUE))
plot(barcelona)
plot(proximos_k4, centros, add = TRUE, col = "red")

adyacencia polígonos con R 4

Creamos adyacencias para los $k=4$ elementos más cercanos polígono a polígono con la función knearneigh, aunque en este caso el objeto que genera es necesario transformarlo en lista con knn2nb. Más posibilidades para spdep; en cualquier caso, a ver si encuentro ejemplos ilustrativos y pasamos de la adyacencia a la ponderación, que es donde de verdad me gusta cómo funciona este paquete. Espero que os sea útil. Saludos.