The function converts a square spatial weights matrix, optionally a sparse matrix to a weights list object, optionally adding region IDs from the row names of the matrix, as a sequence of numbers 1:nrow(x), or as given as an argument. The style can be imposed by rebuilting the weights list object internally.

mat2listw(x, row.names = NULL, style="M")

Arguments

x

A square non-negative matrix with no NAs representing spatial weights; may be a matrix of class “sparseMatrix”

row.names

row names to use for region IDs

style

default "M", unknown style; if not "M", passed to nb2listw to re-build the object

Value

A listw object with the following members:

style

"M", meaning matrix style, underlying style unknown, or assigned style argument in rebuilt object

neighbours

the derived neighbours list

weights

the weights for the neighbours derived from the matrix

Author

Roger Bivand Roger.Bivand@nhh.no

See also

Examples

columbus <- st_read(system.file("shapes/columbus.shp", package="spData")[1], quiet=TRUE)
col005 <- dnearneigh(st_coordinates(st_centroid(st_geometry(columbus),
 of_largest_polygon=TRUE)), 0, 0.5, as.character(columbus$NEIGNO))
summary(col005)
#> Neighbour list object:
#> Number of regions: 49 
#> Number of nonzero links: 170 
#> Percentage nonzero weights: 7.080383 
#> Average number of links: 3.469388 
#> 4 regions with no links:
#> 1005 1006 1008 1043
#> Link number distribution:
#> 
#>  0  1  2  3  4  5  6  7  8  9 
#>  4 11  5  8  3  9  2  2  3  2 
#> 11 least connected regions:
#> 1001 1007 1018 1010 1045 1044 1046 1047 1049 1048 1015 with 1 link
#> 2 most connected regions:
#> 1038 1036 with 9 links
col005.w.mat <- nb2mat(col005, zero.policy=TRUE)
col005.w.b <- mat2listw(col005.w.mat)
summary(col005.w.b$neighbours)
#> Neighbour list object:
#> Number of regions: 49 
#> Number of nonzero links: 170 
#> Percentage nonzero weights: 7.080383 
#> Average number of links: 3.469388 
#> 4 regions with no links:
#> 1005 1006 1008 1043
#> Link number distribution:
#> 
#>  0  1  2  3  4  5  6  7  8  9 
#>  4 11  5  8  3  9  2  2  3  2 
#> 11 least connected regions:
#> 1001 1007 1018 1010 1045 1044 1046 1047 1049 1048 1015 with 1 link
#> 2 most connected regions:
#> 1038 1036 with 9 links
diffnb(col005, col005.w.b$neighbours)
#> Neighbour list object:
#> Number of regions: 49 
#> Number of nonzero links: 0 
#> Percentage nonzero weights: 0 
#> Average number of links: 0 
#> 49 regions with no links:
#> 1005 1001 1006 1002 1007 1008 1004 1003 1018 1010 1038 1037 1039 1040
#> 1009 1036 1011 1042 1041 1017 1043 1019 1012 1035 1032 1020 1021 1031
#> 1033 1034 1045 1013 1022 1044 1023 1046 1030 1024 1047 1016 1014 1049
#> 1029 1025 1028 1048 1015 1027 1026
col005.w.mat.3T <- kronecker(diag(3), col005.w.mat)
col005.w.b.3T <- mat2listw(col005.w.mat.3T, style="W")
#> Warning: zero sum general weights
summary(col005.w.b.3T$neighbours)
#> Neighbour list object:
#> Number of regions: 147 
#> Number of nonzero links: 510 
#> Percentage nonzero weights: 2.360128 
#> Average number of links: 3.469388 
#> 12 regions with no links:
#> 1 3 6 21 50 52 55 70 99 101 104 119
#> Link number distribution:
#> 
#>  0  1  2  3  4  5  6  7  8  9 
#> 12 33 15 24  9 27  6  6  9  6 
#> 33 least connected regions:
#> 2 5 9 10 31 34 36 39 42 46 47 51 54 58 59 80 83 85 88 91 95 96 100 103 107 108 129 132 134 137 140 144 145 with 1 link
#> 6 most connected regions:
#> 11 16 60 65 109 114 with 9 links
run <- FALSE
if (require("spatialreg", quiet=TRUE)) run <- TRUE
if (run) {
W <- as(nb2listw(col005, style="W", zero.policy=TRUE), "CsparseMatrix")
col005.spM <- mat2listw(W)
summary(col005.spM$neighbours)
}
#> Warning: 1005, 1006, 1008, 1043 are not origins
#> Neighbour list object:
#> Number of regions: 49 
#> Number of nonzero links: 170 
#> Percentage nonzero weights: 7.080383 
#> Average number of links: 3.469388 
#> 4 regions with no links:
#> 1005 1006 1008 1043
#> Link number distribution:
#> 
#>  0  1  2  3  4  5  6  7  8  9 
#>  4 11  5  8  3  9  2  2  3  2 
#> 11 least connected regions:
#> 1001 1007 1018 1010 1045 1044 1046 1047 1049 1048 1015 with 1 link
#> 2 most connected regions:
#> 1038 1036 with 9 links
if (run) {
diffnb(col005, col005.spM$neighbours)
}
#> Neighbour list object:
#> Number of regions: 49 
#> Number of nonzero links: 0 
#> Percentage nonzero weights: 0 
#> Average number of links: 0 
#> 49 regions with no links:
#> 1005 1001 1006 1002 1007 1008 1004 1003 1018 1010 1038 1037 1039 1040
#> 1009 1036 1011 1042 1041 1017 1043 1019 1012 1035 1032 1020 1021 1031
#> 1033 1034 1045 1013 1022 1044 1023 1046 1030 1024 1047 1016 1014 1049
#> 1029 1025 1028 1048 1015 1027 1026
if (run && require("Matrix", quiet=TRUE)) {
IW <- kronecker(Diagonal(3), W)
col005.spM.3T <- mat2listw(as(IW, "CsparseMatrix"), style="W")
summary(col005.spM.3T$neighbours)
}
#> Warning: 1, 3, 6, 21, 50, 52, 55, 70, 99, 101, 104, 119 are not origins
#> Warning: zero sum general weights
#> Neighbour list object:
#> Number of regions: 147 
#> Number of nonzero links: 510 
#> Percentage nonzero weights: 2.360128 
#> Average number of links: 3.469388 
#> 12 regions with no links:
#> 1 3 6 21 50 52 55 70 99 101 104 119
#> Link number distribution:
#> 
#>  0  1  2  3  4  5  6  7  8  9 
#> 12 33 15 24  9 27  6  6  9  6 
#> 33 least connected regions:
#> 2 5 9 10 31 34 36 39 42 46 47 51 54 58 59 80 83 85 88 91 95 96 100 103 107 108 129 132 134 137 140 144 145 with 1 link
#> 6 most connected regions:
#> 11 16 60 65 109 114 with 9 links