Skip to contents

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, or sfc 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

See also

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 
#> 
# }