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==