The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Spatial matrices

library(SDPDmod)

This vignette gives a few examples on how to create different spatial weights matrices using the SDPDmod package.

Introduction

A spatial weights matrix is an \(N \times N\) non-negative matrix, where \(N\) is the size of the data set. The elements of the spatial matrix \(W\), \(w_{ij}\) are non-zero if \(i\) and \(j\) are considered to be neighbors and zero otherwise. Since unit \(i\) can not be a neighbor to itself, the diagonal elements of the spatial weights matrix are zero, i.e. \(w_{ij}=0\).

Data

Data on German districts and distances between district’s centroids in meters are included in the SDPDmod package and are used for the examples.

library("sf")
ger <- st_read(system.file(dsn = "shape/GermanyNUTS3.shp",
                         package = "SDPDmod"))

data(gN3dist, package = "SDPDmod")

Types of spatial weights matrices

Contiguity based

Spatial Contiguity Weights Matrix

\[ w_{ij} = \begin{cases} 1,&i &\text{and} &j &\text{have a shared boundary}\\ 0,& \text{otherwise} \end{cases} \]

    W_1 <- mOrdNbr(ger) ## first order neighbors

Higher Order Contiguity

\[ w_{ij} = \begin{cases} 1,&i &\text{and} &j &\text{are neighbors of order} &m\\ 0,& \text{otherwise} \end{cases} \]

   W_2n <- mOrdNbr(sf_pol = ger, m = 2) ## second order neighbors
   W_3n <- mOrdNbr(ger, 3) ## third order neighbors

Shared Boundary Spatial Weights Matrix

\[ w_{ij} = \begin{cases} len,&i &\text{and} &j &\text{have a shared boundary}\\ 0,& \text{otherwise} \end{cases} \] \(len_{ij}\) - length of the boundary between units \(i\) and \(j\)

   ls <- ger[which(substr(ger$NUTS_CODE,1,3)=="DE9"),] ## Lower Saxony districts
   W_len_sh <- SharedBMat(ls)

Based on distance

k-Nearest Neighbor

\[ w_{ij} = \begin{cases} 1,& \text{if unit} &j &\text{is one of the} &k &\text{nearest neighbor of} &i\\ 0,& \text{otherwise} \end{cases} \]

    W_knn <- mNearestN(distMat = gN3dist, m = 5) ## 5 nearest neighbors

Inverse Distance

\[ w_{ij} = d_{ij}^{-\alpha} \] \(d_{ij}\) - distance between units \(i\) and \(j\), \(\alpha\) - positive exponent

    ## inverse distance no cut-off
    W_inv1 <- InvDistMat(distMat = gN3dist) 
    ## inverse distance with cut-off 100000 meters
    W_inv2 <- InvDistMat(distMat = gN3dist, distCutOff = 100000) 
    gN3dist2 <- gN3dist/1000 ## convert to kilometers
    ## inverse distance with cut-off 100 km
    W_inv3 <- InvDistMat(distMat = gN3dist2, distCutOff = 100)  
    ## inverse distance with cut-off 200km and exponent 2
    W_inv4 <- InvDistMat(gN3dist2, 200, powr = 2) 

Exponential Distance

\[ w_{ij} = exp(-\alpha d_{ij}) \] \(d_{ij}\) - distance between units \(i\) and \(j\), \(\alpha\) - positive exponent

    ## Exponential distance no cut-off
    W_exp1 <- ExpDistMat(distMat = gN3dist) 
    ## Exponential distance with cut-off 100000 meters
    W_exp2 <- ExpDistMat(distMat = gN3dist, distCutOff = 100000) 
    gN3dist2 <- gN3dist/1000 ## convert to kilometers
    ## Exponential distance with cut-off 100 km 
    W_exp3 <- ExpDistMat(gN3dist2, 100) 
    ## Exponential distance with cut-off 100 km
    W_exp4 <- DistWMat(gN3dist2, 100, type = "expo") 
    all(W_exp3==W_exp4)
#> [1] TRUE
    ## Exponential distance with cut-off 200 km and exponent 0.001
    W_exp5 <- ExpDistMat(gN3dist2, 200, expn = 0.001) 

Double-Power Distance

\[ w_{ij} = \begin{cases} (1-(\frac{d_{ij}}{D})^p)^p,&0 \leq d_{ij} \leq D \\ 0,& d_{ij} \geq D \end{cases} \] \(d_{ij}\) - distance between units \(i\) and \(j\), \(p\) - positive exponent, \(D\) - distance cut-off

    ## Double-Power distance no cut-off, exponent 2
    W_dd1 <- DDistMat(distMat = gN3dist) 
    ## Double-Power distance with cut-off 100000 meters, exponent 2
    W_dd2 <- DDistMat(distMat = gN3dist, distCutOff=100000) 
    gN3dist2 <- gN3dist/1000 ## convert to kilometers
    ## Double-Power distance with cut-off 100 km 
    W_dd3 <- DDistMat(gN3dist2, 100) 
    ## Double-Power distance with cut-off 100 km
    W_dd4 <- DistWMat(gN3dist2, 100, type = "doubled") 
    all(W_dd3==W_dd4) 
#> [1] TRUE
    ## Double-Power distance with cut-off 200km and exponent 3
    W_dd5 <- DDistMat(gN3dist2, 200, powr = 3) 

Normalization

Row normalization

\[ w_{ij}^{normalized} =w_{ij}/\sum_{j=1}^N w_{ij} \]

   W_2n_norm <- mOrdNbr(sf_pol = ger, m = 2, rn = T) ## second order neighbors
   W_2n_norm2 <- rownor(W_2n)
   all(W_2n_norm==W_2n_norm2)
#> [1] TRUE

Scalar normalization

\[ w_{ij}^{normalized} =w_{ij}/\lambda_{max} \] \(\lambda_{max}\) maximum eigenvalue of \(W\)

  W_inv1_norm <- InvDistMat(distMat = gN3dist, mevn = T) ## Inverse distance
  W_inv1_norm2 <- eignor(W_inv1)
  all(W_inv1_norm==W_inv1_norm2)
#> [1] TRUE

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.