# Create an integer vector of the 2 regions (23 & 31) that need to be
connected.
ij <- as.integer(c(23,31))
# Update the neighbor list to add the symmetric link.
nb[[ij[1]]] <- sort(unique(c(nb[[ij[1]]], ij[2])))
nb[[ij[2]]] <- sort(unique(c(nb[[ij[2]]], ij[1])))
I just wanted to share that detail back to the list in case anyone else
wants to do this sort of data manipulation.
Steven J. Pierce
E-mail: pierces1 at msu.edu
-----Original Message-----
From: Roger Bivand [mailto:Roger.Bivand at nhh.no]
Sent: Saturday, June 03, 2006 7:11 AM
To: Steven J. Pierce
Cc: r-sig-geo at stat.math.ethz.ch
Subject: Re: [R-sig-Geo] adding links to neighbour lists
On Fri, 2 Jun 2006, Steven J. Pierce wrote:
Hi folks,
After using spdep to construct a neighbor list from a SpatialPolygons
object, I plotted the neighbor list and noted that I needed one more link
that wasn't caught by the poly2nb command. I found the edit.nb() function
and can successfully use the interactive graphical interface to add the
link, but would like to know if there is an alternative method for adding
link between two regions. What would I need to do to directly edit the
neighbor list object to include an additional link between regions 23 and
31?
There is a drop.links() function but no add.links(). So yes, you could
manipulate the list directly. If ij is a two element vector for the
missing link:
nb[[ij[1]]] <- sort(unique(c(nb[[ij[1]]], ij[2])))
nb[[ij[2]]] <- sort(unique(c(nb[[ij[2]]], ij[1])))
should do it (untried). If there are more links, have a look at drop.links
and see if you can adapt it.
# Create a SpatialPolygons object from a SpatialPolygonsDataFrame
# helps set up for creating a neighbor list via commands from spdep
CITY.polys <- as.SpatialPolygons.PolygonsList(CITY.ZCTA.data at polygons,
+
proj4string=CRS(projection.details))
I think:
CITY.polys <- as(CITY.ZCTA.data, "SpatialPolygons")
should be enough, in time poly2nb() will do that internally.
# Create a neighbor list based on shared boundary. We need this to
# creating a weights matrix when we go to do spatial regression models.
CITY.nb <- poly2nb(CITY.polys, row.names = NULL,
snap=sqrt(.Machine$double.eps), queen=TRUE)
# Capture coordinates of ZCTA centroids into a matrix we can use in
# the neighbor list.
coords.mat <- cbind(CITY.ZCTA.data$centroid.x,
CITY.ZCTA.data$centroid.y)
Could be:
coords.mat <- coordinates(CITY.ZCTA.data)
if the centroid.x|y values correspond to the polygon centroids.
Roger
# Plot the neighbor list (reveals we need to add 1 more link)
plot(CITY.ZCTA.data, col="grey", border="black", axes=FALSE, asp=1,
title(main="Neighbor List Links", adj= 0, cex.sub=.75)
plot(CITY.nb, coords.mat, add=TRUE, col="black", lwd=2)
# Add 1 link to neighbor list. This requires interaction with the
# on screen.
CITY.nb <- edit.nb(CITY.nb, coords.mat, polys=CITY.polys)
Identifying contiguity for deletion ...
No contiguity between chosen points
Add contiguity? (y/n) y
added contiguity between point 23 and 31
Options: quit[q] refresh[r] continue[c] q
# Plot the revised neighbor list (now everything looks right)
plot(CITY.ZCTA.data, col="grey", border="black", axes=FALSE, asp=1,
title(main="Neighbor List Links", adj= 0, cex.sub=.75)
plot(CITY.nb, coords.mat, add=TRUE, col="black", lwd=2)
Steven J. Pierce
E-mail: pierces1 at msu.edu