Spatial Autocorrelation (categorical variables)

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\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,]  #研究區:台北+新北

1. Defining Neighborhood

# 定義鄰近關係與鄰近矩陣
TWN_nb <- poly2nb(NorthTW_sf) #QUEEN = TRUE
TWN_nb_w <- nb2listw(TWN_nb, zero.policy=T)

2. Creating categorical variables

# 計算切點:連續變數 轉換 類別變數分類
ave <- mean(NorthTW_sf$A0A14_CNT)
max <- max(NorthTW_sf$A0A14_CNT)

HIPOP <- cut(NorthTW_sf$A0A14_CNT, breaks=c(0,ave,max), labels=c("LOW","HIGH"))
names(HIPOP) <- rownames(NorthTW_sf)

3-1. Join Counts Statistics: two categories

joincount.test(HIPOP, TWN_nb_w)

    Join count test under nonfree sampling

data:  HIPOP 
weights: TWN_nb_w 

Std. deviate for LOW = 3.2383, p-value = 0.0006013
alternative hypothesis: greater
sample estimates:
Same colour statistic           Expectation              Variance 
            7.7702381             5.7750000             0.3796304 


    Join count test under nonfree sampling

data:  HIPOP 
weights: TWN_nb_w 

Std. deviate for HIGH = 4.4985, p-value = 3.421e-06
alternative hypothesis: greater
sample estimates:
Same colour statistic           Expectation              Variance 
            6.9260823             4.2750000             0.3473002 
joincount.multi(HIPOP, TWN_nb_w)
          Joincount Expected Variance z-value
LOW:LOW     7.77024  5.77500  0.37963  3.2383
HIGH:HIGH   6.92608  4.27500  0.34730  4.4985
HIGH:LOW    5.80368 10.45000  1.03357 -4.5702
Jtot        5.80368 10.45000  1.03357 -4.5702

3-2. Join Counts Statistics: more categories

# 兩個以上的類別
cut1 <- quantile(NorthTW_sf$A0A14_CNT,0.33)
cut2 <- quantile(NorthTW_sf$A0A14_CNT,0.66)
max <- max(NorthTW_sf$A0A14_CNT)

HIPOP <- cut(NorthTW_sf$A0A14_CNT, breaks=c(0, cut1, cut2, max), 
             labels=c("LOW","MID","HIGH"))
names(HIPOP) <- rownames(NorthTW_sf)

joincount.test(HIPOP, TWN_nb_w)

    Join count test under nonfree sampling

data:  HIPOP 
weights: TWN_nb_w 

Std. deviate for LOW = 4.3537, p-value = 6.692e-06
alternative hypothesis: greater
sample estimates:
Same colour statistic           Expectation              Variance 
            4.4547619             2.2750000             0.2506667 


    Join count test under nonfree sampling

data:  HIPOP 
weights: TWN_nb_w 

Std. deviate for MID = 0.81447, p-value = 0.2077
alternative hypothesis: greater
sample estimates:
Same colour statistic           Expectation              Variance 
            2.3380952             1.9500000             0.2270534 


    Join count test under nonfree sampling

data:  HIPOP 
weights: TWN_nb_w 

Std. deviate for HIGH = 3.3322, p-value = 0.0004308
alternative hypothesis: greater
sample estimates:
Same colour statistic           Expectation              Variance 
            3.9433261             2.2750000             0.2506667 
joincount.multi(HIPOP, TWN_nb_w)
          Joincount Expected Variance z-value
LOW:LOW     4.45476  2.27500  0.25067  4.3537
MID:MID     2.33810  1.95000  0.22705  0.8145
HIGH:HIGH   3.94333  2.27500  0.25067  3.3322
MID:LOW     2.71548  4.55000  0.54680 -2.4809
HIGH:LOW    2.25364  4.90000  0.57924 -3.4771
HIGH:MID    4.79470  4.55000  0.54680  0.3309
Jtot        9.76382 14.00000  0.90287 -4.4582
LS0tDQp0aXRsZTogIlNwYXRpYWwgQW5hbHlzaXM6IDEwIg0KYXV0aG9yOiAiVHphaS1IdW5nIFdlbiINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDYNCiAgICB0b2NfZmxvYXQ6IHRydWUNCi0tLQ0KDQojIyBTcGF0aWFsIEF1dG9jb3JyZWxhdGlvbiAoY2F0ZWdvcmljYWwgdmFyaWFibGVzKQ0KDQojIyMgMC4gTG9hZGluZyBSIHBhY2thZ2VzIGFuZCBkYXRhDQpgYGB7cix3YXJuaW5nPUZBTFNFfQ0Kcm0obGlzdCA9IGxzKCkpDQpsaWJyYXJ5KHNwZGVwKQ0KbGlicmFyeShzZikNCmxpYnJhcnkodG1hcCkNCg0KIyBzZXR3ZCgiQzovRGF0YSIpDQpUV1BPUF9zZiA8LSBzdF9yZWFkKCIuL0RhdGEvUG9wbl9UV04yLnNocCIsb3B0aW9ucyA9ICJlbmNvZGluZz1CaWc1IiApDQoNCklEIDwtIFRXUE9QX3NmJENPVU5UWV9JRA0KU2VsIDwtIElEID09ICI2NTAwMCIgfCBJRCA9PSAiNjMwMDAiIA0KTm9ydGhUV19zZiA8LSBUV1BPUF9zZltTZWwsXSAgI+eglOeptuWNgO+8muWPsOWMl++8i+aWsOWMlw0KYGBgDQoNCiMjIyAxLiBEZWZpbmluZyBOZWlnaGJvcmhvb2QNCmBgYHtyfQ0KIyDlrprnvqnphLDov5Hpl5zkv4LoiIfphLDov5Hnn6npmaMNClRXTl9uYiA8LSBwb2x5Mm5iKE5vcnRoVFdfc2YpICNRVUVFTiA9IFRSVUUNClRXTl9uYl93IDwtIG5iMmxpc3R3KFRXTl9uYiwgemVyby5wb2xpY3k9VCkNCg0KYGBgDQoNCiMjIyAyLiBDcmVhdGluZyBjYXRlZ29yaWNhbCB2YXJpYWJsZXMNCmBgYHtyfQ0KIyDoqIjnrpfliIfpu57vvJrpgKPnuozorormlbgg6L2J5o+bIOmhnuWIpeiuiuaVuOWIhumhng0KYXZlIDwtIG1lYW4oTm9ydGhUV19zZiRBMEExNF9DTlQpDQptYXggPC0gbWF4KE5vcnRoVFdfc2YkQTBBMTRfQ05UKQ0KDQpISVBPUCA8LSBjdXQoTm9ydGhUV19zZiRBMEExNF9DTlQsIGJyZWFrcz1jKDAsYXZlLG1heCksIGxhYmVscz1jKCJMT1ciLCJISUdIIikpDQpuYW1lcyhISVBPUCkgPC0gcm93bmFtZXMoTm9ydGhUV19zZikNCmBgYA0KDQojIyMgMy0xLiBKb2luIENvdW50cyBTdGF0aXN0aWNzOiB0d28gY2F0ZWdvcmllcw0KYGBge3J9DQpqb2luY291bnQudGVzdChISVBPUCwgVFdOX25iX3cpDQpqb2luY291bnQubXVsdGkoSElQT1AsIFRXTl9uYl93KQ0KYGBgDQojIyMgMy0yLiBKb2luIENvdW50cyBTdGF0aXN0aWNzOiBtb3JlIGNhdGVnb3JpZXMNCmBgYHtyfQ0KIyDlhanlgIvku6XkuIrnmoTpoZ7liKUNCmN1dDEgPC0gcXVhbnRpbGUoTm9ydGhUV19zZiRBMEExNF9DTlQsMC4zMykNCmN1dDIgPC0gcXVhbnRpbGUoTm9ydGhUV19zZiRBMEExNF9DTlQsMC42NikNCm1heCA8LSBtYXgoTm9ydGhUV19zZiRBMEExNF9DTlQpDQoNCkhJUE9QIDwtIGN1dChOb3J0aFRXX3NmJEEwQTE0X0NOVCwgYnJlYWtzPWMoMCwgY3V0MSwgY3V0MiwgbWF4KSwgDQogICAgICAgICAgICAgbGFiZWxzPWMoIkxPVyIsIk1JRCIsIkhJR0giKSkNCm5hbWVzKEhJUE9QKSA8LSByb3duYW1lcyhOb3J0aFRXX3NmKQ0KDQpqb2luY291bnQudGVzdChISVBPUCwgVFdOX25iX3cpDQpqb2luY291bnQubXVsdGkoSElQT1AsIFRXTl9uYl93KQ0KYGBgDQoNCg==