Spatial Autocorrelation

0. Loading R packages and data

rm(list = ls())
library(spdep)
library(sf)
library(tmap)

# setwd("C:/Data")
TWPOP_sf <- st_read("./Data/Popn_TWN2.shp",options = "encoding=Big5" )
options:        encoding=Big5 
Reading layer `Popn_TWN2' from data source `C:\Users\wenth\Desktop\WK09\Data\Popn_TWN2.shp' using driver `ESRI Shapefile'
Simple feature collection with 368 features and 14 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -197572.5 ymin: 2295201 xmax: 606875.6 ymax: 2919551
Projected CRS: TWD97 / TM2 zone 121
ID<- TWPOP_sf$COUNTY_ID
Sel<- ID == "65000" | ID == "63000" 
NorthTW_sf<- TWPOP_sf[Sel,]
length(NorthTW_sf)
[1] 15
NorthTW_lyr <- tm_shape(NorthTW_sf)+tm_polygons(col="grey")

1. Define Spatial Neighbors

a. Contiguity: QUEEN vs. ROOK

#?poly2nb: Construct neighbours list 
TWN_nb<-poly2nb(NorthTW_sf) #QUEEN = TRUE
summary(TWN_nb)
Neighbour list object:
Number of regions: 41 
Number of nonzero links: 202 
Percentage nonzero weights: 12.01666 
Average number of links: 4.926829 
Link number distribution:

 2  3  4  5  6  7  8  9 11 
 3  7  6 12  7  3  1  1  1 
3 least connected regions:
278 292 296 with 2 links
1 most connected region:
231 with 11 links
TWN_nb2<-poly2nb(NorthTW_sf,queen=FALSE ) # ROOK

# 1.1. Finding neighbors of a district
TWN_nb[1]
[[1]]
[1]  2  3  4  9 10
# 1-2 Buiding Neighborhood Matrix
TWN_nb_w.mat <- nb2mat(TWN_nb, style="B")
# style = B is the basic binary coding, 
# W is row standardised, C is globally standardised

# 1.3. Plot the Neighborhood Matrix
coords_sf<-st_centroid(NorthTW_sf)
coords_lyr <- tm_shape(coords_sf)+tm_dots(col="red", size=0.3)
NorthTW_lyr + coords_lyr


TW.centroid <- st_centroid(NorthTW_sf)
TW.coords <- st_coordinates(TW.centroid)
TW.net <- nb2lines(TWN_nb,coords=TW.coords)
TW.net_sf <- st_as_sf(TW.net)
st_crs(TW.net_sf) <-  st_crs(TWPOP_sf)

NorthTW_lyr + coords_lyr + 
  tm_shape(TW.net_sf) + tm_lines(col='red')

b. K-nearest Neighbors (KNN)

IDs <-NorthTW_sf$TOWN_ID
TWN_kn1<-knn2nb(knearneigh(TW.coords, k=2), row.names=IDs)
TWN_kn1[1]
[[1]]
[1] 2 4
TW.net <- nb2lines(TWN_kn1,coords=TW.coords)
TW.net_sf <- st_as_sf(TW.net)
st_crs(TW.net_sf) <-  st_crs(TWPOP_sf)

NorthTW_lyr + coords_lyr + 
  tm_shape(TW.net_sf) + tm_lines(col='red')

c. Fixed distance band

TWN_ran1<-dnearneigh(TW.coords, d1=0, d2=20000, row.names=IDs)
TW.net <- nb2lines(TWN_ran1,coords=TW.coords)
TW.net_sf <- st_as_sf(TW.net)
st_crs(TW.net_sf) <-  st_crs(TWPOP_sf)

NorthTW_lyr + coords_lyr + 
  tm_shape(TW.net_sf) + tm_lines(col='red')

2. Weighting matrix

# From Spatial Neighbors to ListW 

TWN_nb_w<- nb2listw(TWN_nb, zero.policy=T) # default: style = "W" (row standardised)
TWN_nb_w$weight[1]
[[1]]
[1] 0.2 0.2 0.2 0.2 0.2

3. Moran’s I & General G Statistics

Popn<-NorthTW_sf$A65UP_CNT
NorthTW_sf$Density<- Popn * 10^6 / st_area(NorthTW_sf)


# 1. Mapping the attribute
tm_shape(NorthTW_sf) + 
  tm_polygons("Density", palette = "OrRd", style = "jenks", title = "Elder Density")


# 2.Moran I Statistic
Density <- NorthTW_sf$Density
Density <- as.vector(Density)
M <- moran.test(Density, listw=TWN_nb_w, zero.policy=T)

# 3.Monte-Carlo simulation of Moran I
bperm <- moran.mc(Density,listw=TWN_nb_w,nsim=999)
hist(bperm$res, freq=TRUE, breaks=20, xlab="Simulated Moran's I")
abline(v=0.486, col="red")


# 4.Moran Spatial Correlogram
cor<-sp.correlogram(TWN_nb, Density, order=3, method="I", style="W")
print(cor); plot(cor)
Spatial correlogram for Density 
method: Moran's I
         estimate expectation   variance standard deviate Pr(I) two sided    
1 (41)  0.6327816  -0.0250000  0.0094261           6.7751       1.243e-11 ***
2 (41)  0.1797066  -0.0250000  0.0044722           3.0611        0.002206 ** 
3 (41) -0.1876583  -0.0250000  0.0031154          -2.9142        0.003566 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

# 5.Moran Scatter Plot
nci <- moran.plot (Density, TWN_nb_w, labels=IDs , xlab="Popn", ylab="SL Popn")


# 6.Getis-Ord General G Statistic
TWN_ran1_wb <- nb2listw(TWN_ran1, style="B", zero.policy=T)
G <- globalG.test(Density, listw=TWN_ran1_wb)
G

    Getis-Ord global G statistic

data:  Density 
weights: TWN_ran1_wb   

standard deviate = 4.813, p-value = 7.434e-07
alternative hypothesis: greater
sample estimates:
Global G statistic        Expectation           Variance 
       0.969818340        0.540243902        0.007966092 
LS0tDQp0aXRsZTogIlNwYXRpYWwgQW5hbHlzaXM6IDA5Ig0KYXV0aG9yOiAiVHphaS1IdW5nIFdlbiINCmRhdGU6ICcyMDI1LTA1LTEyJw0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNg0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KLS0tDQoNCiMjIFNwYXRpYWwgQXV0b2NvcnJlbGF0aW9uDQoNCiMjIyAwLiBMb2FkaW5nIFIgcGFja2FnZXMgYW5kIGRhdGENCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kcm0obGlzdCA9IGxzKCkpDQpsaWJyYXJ5KHNwZGVwKQ0KbGlicmFyeShzZikNCmxpYnJhcnkodG1hcCkNCg0KIyBzZXR3ZCgiQzovRGF0YSIpDQpUV1BPUF9zZiA8LSBzdF9yZWFkKCIuL0RhdGEvUG9wbl9UV04yLnNocCIsb3B0aW9ucyA9ICJlbmNvZGluZz1CaWc1IiApDQoNCklEPC0gVFdQT1Bfc2YkQ09VTlRZX0lEDQpTZWw8LSBJRCA9PSAiNjUwMDAiIHwgSUQgPT0gIjYzMDAwIiANCk5vcnRoVFdfc2Y8LSBUV1BPUF9zZltTZWwsXQ0KbGVuZ3RoKE5vcnRoVFdfc2YpDQpOb3J0aFRXX2x5ciA8LSB0bV9zaGFwZShOb3J0aFRXX3NmKSt0bV9wb2x5Z29ucyhjb2w9ImdyZXkiKQ0KYGBgDQoNCiMjIyAxLiBEZWZpbmUgU3BhdGlhbCBOZWlnaGJvcnMNCg0KIyMjIyBhLiBDb250aWd1aXR5OiBRVUVFTiB2cy4gUk9PSw0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojP3BvbHkybmI6IENvbnN0cnVjdCBuZWlnaGJvdXJzIGxpc3QgDQpUV05fbmI8LXBvbHkybmIoTm9ydGhUV19zZikgI1FVRUVOID0gVFJVRQ0Kc3VtbWFyeShUV05fbmIpDQoNClRXTl9uYjI8LXBvbHkybmIoTm9ydGhUV19zZixxdWVlbj1GQUxTRSApICMgUk9PSw0KDQojIDEuMS4gRmluZGluZyBuZWlnaGJvcnMgb2YgYSBkaXN0cmljdA0KVFdOX25iWzFdDQoNCiMgMS0yIEJ1aWRpbmcgTmVpZ2hib3Job29kIE1hdHJpeA0KVFdOX25iX3cubWF0IDwtIG5iMm1hdChUV05fbmIsIHN0eWxlPSJCIikNCiMgc3R5bGUgPSBCIGlzIHRoZSBiYXNpYyBiaW5hcnkgY29kaW5nLCANCiMgVyBpcyByb3cgc3RhbmRhcmRpc2VkLCBDIGlzIGdsb2JhbGx5IHN0YW5kYXJkaXNlZA0KDQojIDEuMy4gUGxvdCB0aGUgTmVpZ2hib3Job29kIE1hdHJpeA0KY29vcmRzX3NmPC1zdF9jZW50cm9pZChOb3J0aFRXX3NmKQ0KY29vcmRzX2x5ciA8LSB0bV9zaGFwZShjb29yZHNfc2YpK3RtX2RvdHMoY29sPSJyZWQiLCBzaXplPTAuMykNCk5vcnRoVFdfbHlyICsgY29vcmRzX2x5cg0KDQpUVy5jZW50cm9pZCA8LSBzdF9jZW50cm9pZChOb3J0aFRXX3NmKQ0KVFcuY29vcmRzIDwtIHN0X2Nvb3JkaW5hdGVzKFRXLmNlbnRyb2lkKQ0KVFcubmV0IDwtIG5iMmxpbmVzKFRXTl9uYixjb29yZHM9VFcuY29vcmRzKQ0KVFcubmV0X3NmIDwtIHN0X2FzX3NmKFRXLm5ldCkNCnN0X2NycyhUVy5uZXRfc2YpIDwtICBzdF9jcnMoVFdQT1Bfc2YpDQoNCk5vcnRoVFdfbHlyICsgY29vcmRzX2x5ciArIA0KICB0bV9zaGFwZShUVy5uZXRfc2YpICsgdG1fbGluZXMoY29sPSdyZWQnKQ0KYGBgDQoNCiMjIyMgYi4gSy1uZWFyZXN0IE5laWdoYm9ycyAoS05OKQ0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpJRHMgPC1Ob3J0aFRXX3NmJFRPV05fSUQNClRXTl9rbjE8LWtubjJuYihrbmVhcm5laWdoKFRXLmNvb3Jkcywgaz0yKSwgcm93Lm5hbWVzPUlEcykNClRXTl9rbjFbMV0NCg0KVFcubmV0IDwtIG5iMmxpbmVzKFRXTl9rbjEsY29vcmRzPVRXLmNvb3JkcykNClRXLm5ldF9zZiA8LSBzdF9hc19zZihUVy5uZXQpDQpzdF9jcnMoVFcubmV0X3NmKSA8LSAgc3RfY3JzKFRXUE9QX3NmKQ0KDQpOb3J0aFRXX2x5ciArIGNvb3Jkc19seXIgKyANCiAgdG1fc2hhcGUoVFcubmV0X3NmKSArIHRtX2xpbmVzKGNvbD0ncmVkJykNCmBgYA0KDQojIyMjIGMuIEZpeGVkIGRpc3RhbmNlIGJhbmQNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KVFdOX3JhbjE8LWRuZWFybmVpZ2goVFcuY29vcmRzLCBkMT0wLCBkMj0yMDAwMCwgcm93Lm5hbWVzPUlEcykNClRXLm5ldCA8LSBuYjJsaW5lcyhUV05fcmFuMSxjb29yZHM9VFcuY29vcmRzKQ0KVFcubmV0X3NmIDwtIHN0X2FzX3NmKFRXLm5ldCkNCnN0X2NycyhUVy5uZXRfc2YpIDwtICBzdF9jcnMoVFdQT1Bfc2YpDQoNCk5vcnRoVFdfbHlyICsgY29vcmRzX2x5ciArIA0KICB0bV9zaGFwZShUVy5uZXRfc2YpICsgdG1fbGluZXMoY29sPSdyZWQnKQ0KYGBgDQoNCiMjIyAyLiBXZWlnaHRpbmcgbWF0cml4DQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgRnJvbSBTcGF0aWFsIE5laWdoYm9ycyB0byBMaXN0VyANCg0KVFdOX25iX3c8LSBuYjJsaXN0dyhUV05fbmIsIHplcm8ucG9saWN5PVQpICMgZGVmYXVsdDogc3R5bGUgPSAiVyIgKHJvdyBzdGFuZGFyZGlzZWQpDQpUV05fbmJfdyR3ZWlnaHRbMV0NCg0KYGBgDQoNCg0KIyMjIDMuIE1vcmFuJ3MgSSAmIEdlbmVyYWwgRyBTdGF0aXN0aWNzDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NClBvcG48LU5vcnRoVFdfc2YkQTY1VVBfQ05UDQpOb3J0aFRXX3NmJERlbnNpdHk8LSBQb3BuICogMTBeNiAvIHN0X2FyZWEoTm9ydGhUV19zZikNCg0KDQojIDEuIE1hcHBpbmcgdGhlIGF0dHJpYnV0ZQ0KdG1fc2hhcGUoTm9ydGhUV19zZikgKyANCiAgdG1fcG9seWdvbnMoIkRlbnNpdHkiLCBwYWxldHRlID0gIk9yUmQiLCBzdHlsZSA9ICJqZW5rcyIsIHRpdGxlID0gIkVsZGVyIERlbnNpdHkiKQ0KDQojIDIuTW9yYW4gSSBTdGF0aXN0aWMNCkRlbnNpdHkgPC0gTm9ydGhUV19zZiREZW5zaXR5DQpEZW5zaXR5IDwtIGFzLnZlY3RvcihEZW5zaXR5KQ0KTSA8LSBtb3Jhbi50ZXN0KERlbnNpdHksIGxpc3R3PVRXTl9uYl93LCB6ZXJvLnBvbGljeT1UKQ0KDQojIDMuTW9udGUtQ2FybG8gc2ltdWxhdGlvbiBvZiBNb3JhbiBJDQpicGVybSA8LSBtb3Jhbi5tYyhEZW5zaXR5LGxpc3R3PVRXTl9uYl93LG5zaW09OTk5KQ0KaGlzdChicGVybSRyZXMsIGZyZXE9VFJVRSwgYnJlYWtzPTIwLCB4bGFiPSJTaW11bGF0ZWQgTW9yYW4ncyBJIikNCmFibGluZSh2PTAuNDg2LCBjb2w9InJlZCIpDQoNCiMgNC5Nb3JhbiBTcGF0aWFsIENvcnJlbG9ncmFtDQpjb3I8LXNwLmNvcnJlbG9ncmFtKFRXTl9uYiwgRGVuc2l0eSwgb3JkZXI9MywgbWV0aG9kPSJJIiwgc3R5bGU9IlciKQ0KcHJpbnQoY29yKTsgcGxvdChjb3IpDQoNCiMgNS5Nb3JhbiBTY2F0dGVyIFBsb3QNCm5jaSA8LSBtb3Jhbi5wbG90IChEZW5zaXR5LCBUV05fbmJfdywgbGFiZWxzPUlEcyAsIHhsYWI9IlBvcG4iLCB5bGFiPSJTTCBQb3BuIikNCg0KIyA2LkdldGlzLU9yZCBHZW5lcmFsIEcgU3RhdGlzdGljDQpUV05fcmFuMV93YiA8LSBuYjJsaXN0dyhUV05fcmFuMSwgc3R5bGU9IkIiLCB6ZXJvLnBvbGljeT1UKQ0KRyA8LSBnbG9iYWxHLnRlc3QoRGVuc2l0eSwgbGlzdHc9VFdOX3JhbjFfd2IpDQpHDQpgYGANCg0K