Distance-based spatial weights for neighbours lists
nb2listwdist.Rd
The nb2listwdist
function supplements a neighbours list with spatial weights for the chosen types of distance modelling and coding scheme. While the offered coding schemes parallel those of the nb2listw
function, three distance-based types of weights are available: inverse distance weighting (IDW), double-power distance weights, and exponential distance decay. The can.be.simmed
helper function checks whether a spatial weights object is similar to symmetric and can be so transformed to yield real eigenvalues or for Cholesky decomposition.
Usage
nb2listwdist(neighbours, x, type="idw", style="raw",
alpha = 1, dmax = NULL, longlat = NULL, zero.policy=NULL)
Arguments
- neighbours
an object of class
nb
- x
an
sp
sf
, orsfc
object- type
default “idw”; the intended type of distance modelling, can take values “idw”, “exp”, and “dpd”
- style
default “raw”;
style
can take values “raw”, “W”, “B”, “C”, “U”, “minmax”, and “S”- alpha
default 0; a parameter for controlling the distance modelling, see “Details”
- dmax
default NULL, maximum distance threshold that is required for type “dpd” but optional for all other types
- longlat
default NULL; TRUE if point coordinates are longitude-latitude decimal degrees, in which case distances are measured in metres; if x is a SpatialPoints object, the value is taken from the object itself, and overrides this argument if not NULL; distances are measured in map units if FALSE or NULL
- zero.policy
default NULL; use global option value; if FALSE stop with error for any empty neighbour sets, if TRUE permit the weights list to be formed with zero-length weights vectors
Details
Starting from a binary neighbours list, in which regions are either listed as neighbours or are absent (thus not in the set of neighbours for some definition), the function adds a distance-based weights list. Three types of distance weight calculations based on pairwise distances \(d_{ij}\) are possible, all of which are controlled by parameter “alpha” (\(\alpha\) below): $$\textrm{idw: } w_{ij} = d_{ij}^{-\alpha},$$ $$\textrm{exp: } w_{ij} = \exp(-\alpha \cdot d_{ij}),$$ $$\textrm{dpd: } w_{ij} = \left[1 - \left(d_{ij}/d_{\textrm{max}}\right)^{\alpha}\right]^{\alpha},$$ the latter of which leads to \(w_{ij} = 0\) for all \(d_{ij} > d_{\textrm{max}}\). Note that IDW weights show extreme behaviour close to 0 and can take on the value infinity. In such cases, the infinite values are replaced by the largest finite weight present in the weights list.
The default coding scheme is “raw”, which outputs the raw distance-based weights without applying any kind of normalisation. In addition, the same coding scheme styles that are also available in the nb2listw
function can be chosen. B is the basic binary coding, W is row standardised (sums over all links to n), C is globally standardised (sums over all links to n), U is equal to C divided by the number of neighbours (sums over all links to unity), while S is the variance-stabilising coding scheme proposed by Tiefelsdorf et al. 1999, p. 167-168 (sums over all links to n). The “minmax” style is based on Kelejian and Prucha (2010), and divides the weights by the minimum of the maximum row sums and maximum column sums of the input weights. It is similar to the C and U styles; it is also available in Stata.
If zero.policy is set to TRUE, weights vectors of zero length are inserted for regions without neighbour in the neighbours list. These will in turn generate lag values of zero, equivalent to the sum of products of the zero row t(rep(0, length=length(neighbours))) %*% x
, for arbitraty numerical vector x
of length length(neighbours)
. The spatially lagged value of x for the zero-neighbour region will then be zero, which may (or may not) be a sensible choice.
Value
A listw
object with the following members:
- style
one of W, B, C, U, S, minmax as above
- type
one of idw, exp, dpd as above
- neighbours
the input neighbours list
- weights
the weights for the neighbours and chosen style, with attributes set to report the type of relationships (binary or general, if general the form of the glist argument), and style as above
References
Tiefelsdorf, M., Griffith, D. A., Boots, B. 1999 A variance-stabilizing coding scheme for spatial link matrices, Environment and Planning A, 31, pp. 165–180; Kelejian, H. H., and I. R. Prucha. 2010. Specification and estimation of spatial autoregressive models with autoregressive and heteroskedastic disturbances. Journal of Econometrics, 157: pp. 53–67.
Author
Rene Westerholt rene.westerholt@tu-dortmund.de
Examples
# World examples
data(world, package="spData")
# neighbours on distance interval [0, 1000] kilometres
# suppressWarnings(st_crs(world) <- "+proj=longlat") # for older PROJ
pts <- st_centroid(st_transform(world, 3857))
#> Warning: st_centroid assumes attributes are constant over geometries
nb_world <- dnearneigh(pts, 0, 1000000)
#> Warning: neighbour object has 46 sub-graphs
# Moran's I (life expectancy) with IDW with alpha = 2, no coding scheme
world_weights <- nb2listwdist(nb_world, as(pts, "Spatial"), type = "idw",
alpha = 2, zero.policy = TRUE)
moran.test(world$lifeExp, world_weights, zero.policy = TRUE, na.action = na.pass)
#> Warning: NAs in lagged values
#>
#> Moran I test under randomisation
#>
#> data: world$lifeExp
#> weights: world_weights
#> n reduced by no-neighbour observations
#>
#> Moran I statistic standard deviate = 2.7769, p-value = 0.002744
#> alternative hypothesis: greater
#> sample estimates:
#> Moran I statistic Expectation Variance
#> 0.473883371 -0.007042254 0.029994057
#>
# \dontrun{
# Moran's I (life expectancy) with IDW with alpha = 2, no coding scheme
world_weights <- nb2listwdist(nb_world, pts, type = "idw",
alpha = 2, zero.policy = TRUE)
moran.test(world$lifeExp, world_weights, zero.policy = TRUE, na.action = na.pass)
#> Warning: NAs in lagged values
#>
#> Moran I test under randomisation
#>
#> data: world$lifeExp
#> weights: world_weights
#> n reduced by no-neighbour observations
#>
#> Moran I statistic standard deviate = 2.7769, p-value = 0.002744
#> alternative hypothesis: greater
#> sample estimates:
#> Moran I statistic Expectation Variance
#> 0.473883371 -0.007042254 0.029994057
#>
# Moran's I (life expectancy), DPD, alpha = 2, dmax = 1000 km, no coding scheme
world_weights <- nb2listwdist(nb_world, pts, type = "dpd",
dmax = 1000000, alpha = 2, zero.policy = TRUE)
moran.test(world$lifeExp, world_weights, zero.policy = TRUE, na.action = na.pass)
#> Warning: NAs in lagged values
#>
#> Moran I test under randomisation
#>
#> data: world$lifeExp
#> weights: world_weights
#> n reduced by no-neighbour observations
#>
#> Moran I statistic standard deviate = 8.8557, p-value < 2.2e-16
#> alternative hypothesis: greater
#> sample estimates:
#> Moran I statistic Expectation Variance
#> 0.601498970 -0.007042254 0.004722063
#>
# Boston examples
data(boston, package="spData")
boston_coords <- data.frame(x = boston.utm[,1], y = boston.utm[,2])
boston.geoms <- st_as_sf(boston_coords, coords = c("x", "y"), remove = FALSE)
nb_boston <- dnearneigh(boston.geoms, 0, 3)
#> Warning: neighbour object has 9 sub-graphs
# Moran's I (crime) with exp weights with alpha = 2, no coding scheme
boston_weights <- nb2listwdist(nb_boston, boston.geoms, type = "exp", alpha = 2,
style="raw", zero.policy = TRUE)
moran.test(boston.c$CRIM, boston_weights, zero.policy = TRUE, na.action = na.pass)
#>
#> Moran I test under randomisation
#>
#> data: boston.c$CRIM
#> weights: boston_weights
#> n reduced by no-neighbour observations
#>
#> Moran I statistic standard deviate = 51.34, p-value < 2.2e-16
#> alternative hypothesis: greater
#> sample estimates:
#> Moran I statistic Expectation Variance
#> 0.8845114518 -0.0019960080 0.0002981586
#>
# Moran's I (crime) with idw weights with alpha = 2, coding scheme = W
boston_weights <- nb2listwdist(nb_boston, boston.geoms, type = "idw", alpha = 2,
style="W", zero.policy = TRUE)
moran.test(boston.c$CRIM, boston_weights, zero.policy = TRUE, na.action = na.pass)
#>
#> Moran I test under randomisation
#>
#> data: boston.c$CRIM
#> weights: boston_weights
#> n reduced by no-neighbour observations
#>
#> Moran I statistic standard deviate = 18.976, p-value < 2.2e-16
#> alternative hypothesis: greater
#> sample estimates:
#> Moran I statistic Expectation Variance
#> 0.4392852330 -0.0019960080 0.0005408065
#>
# }