Given a distance matrix (symmetrical or not) and weighting function, calculate a spatial weights matrix with various ways of handling row-sums

makeWeights(
  x,
  bw,
  mode = "adaptive",
  weighting = "membership",
  FUN = NULL,
  offset = 0,
  inf.val = NA,
  minval = -Inf,
  row.stand = FALSE,
  clear.mem = FALSE
)

Arguments

x

A matrix or distance object representing pairwise distances. The distances need not be symmetrical.

bw

A number representing the bandwidth within neighbors are considered. If mode = 'adaptive', bw is the number of nearest neighbors. If mode = 'fixed', bw is the radius of the window in the map units.

mode

One of 'adaptive', which considers a bw number of nearest neighbors; or 'fixed', which considers a fixed bandwidth window of radius bw.

weighting

One of 'membership', which considers binary membership such that neighbors are weighted 1 and non-neighbors 0; 'distance' which weighs neighbors according to FUN with the raw distance matrix providing the distance; or 'rank' which uses the rank-distance (i.e. 1 for nearest neighbor, 2 for second nearest...) as the distance variable.

FUN

The distance function. Default is NULL for 'membership', and function(x) 1/(offset + x) otherwise.

offset

What value is added to the denominator to prevent singularities from arising (e.g. whenever the value is 1/0)? Larger values imply smaller distance-decay. Default is offset = 0.

inf.val

When singularities arise, (i.e. whenever the value is 1/0), by what value are they replaced? Default is the FUN of the lowest non-minval value.

minval

When distances are raw, what is the minimum allowable distance? Default is -Inf.

row.stand

Logical or 'fuzzy'. If TRUE (the default), rows are standardized such that they sum to one. If 'fuzzy', rows are standardized as a proportion of the largest value.

clear.mem

Logical. Should gc be run in the middle of the calculation? Default is clear.mem but set as TRUE if memory limits are a concern.

Value

A matrix of dimensions length(x) x length(x).

Examples


# Generate dummy observations
x <- runif(10, 0, 100)

# Get distance matrix
dists <- dist(x)

# Get fuzzy weights considering 5 nearest neighbors based on 
# inverse square distance
weights <- makeWeights(dists, bw = 5, 
                       mode = 'adaptive', weighting = 'distance',
                       FUN = function(x) 1/x^2, minval = 0.1,
                       row.stand = 'fuzzy')