# Geographical Detectors for Spatial Stratified Heterogeneity Analysis

#### Yongze Song

#### 2018-07-02

Spatial stratified heterogeneity can be measured using geographical detectors (Wang et al. 2010, Wang et al. 2016).

GD package consists of four parts:

- the optimal discretization of continuous data;

- four primary functions of geographical detectors, including factor detector, risk detector, interaction detector and ecological detector;

- comparison of size effects of spatial unit;

- visualizations of results.

GD package includes three datasets:

- `NDVI` (`ndvi_5`, `ndvi_10`, `ndvi_20`, `ndvi_30`, `ndvi_40` and `ndvi_50`): spatial data of vegetation changes `NDVI` with six sizes of grids, 5 km, 10 km, 20 km, 30 km, 40 km and 50 km;

- `H1N1` (`h1n1_50`, `h1n1_100` and `h1n1_150`): spatial data of influenza A virus subtype H1N1 incidences with the spatial grid sizes of 50 km, 100 km and 150 km;

- `road_GD`: line segment based spatial data of road conditions (Song et al. 2018).

Further information can be found on the manual of GD package.

More applications of geographical detectors are listed on Geodetector website.

## Discretization and optimal discretization

Categorical variables are required for geographical detectors, so continuous variables should be discretized before modelling. GD package provides two options: discretization with given parameters, including discretization methods and numbers of intervals, and optimal discretization with a series of optional parameter combinations. Dataset `ndvi_40` is used as an example for explanation.

    library("GD")
    data("ndvi_40")
    head(ndvi_40)[1:3,]
    #>   NDVIchange Climatezone Mining Tempchange Precipitation   GDP Popdensity
    #> 1    0.11599         Bwk    low    0.25598        236.54 12.55    1.44957
    #> 2    0.01783         Bwk    low    0.27341        213.55  2.69    0.80124
    #> 3    0.13817         Bsk    low    0.30247        448.88 20.06   11.49432

### Discretization with given parameters: `disc`

    ## discretization methods: equal, natural, quantile (default), geometric, sd and manual
    ds1 <- disc(ndvi_40$Tempchange, 4)
    ds1
    plot(ds1)

Further information can be found on the manual of GD package.

### Optimal discretization: `optidisc`

    ## set optional discretization methods and numbers of intervals
    discmethod <- c("equal","natural","quantile","geometric","sd")
    discitv <- c(3:7)
    ## optimal discretization
    odc1 <- optidisc(continuous_variable = ndvi_40$Tempchange,
                     response_variable = ndvi_40$NDVIchange,
                     discmethod, discitv)
    odc1
    plot(odc1)

## Geographical detectors

GD package provides two options for geographical detectors modelling: * four functions are performed step by step: `gd` for factor detector, `riskmean` and `gdrisk` for risk detector, `gdinteract` for interaction detector and `gdeco` for ecological detector; * optimal discretization and geographical detectors are performed using a one-step function `gdm`.

### A one-step function: `gdm`

    ## NDVI: ndvi_40
    ## define elements orders of categorical variables
    cz <- c("Bwk","Bsk","Dwa","Dwb","Dwc") ## climate zone
    mp <- c("very low","low","medium","high","very high") ## mining production
    ndvi_40$Climatezone <- as.numeric(1:5)[match(ndvi_40$Climatezone, cz)]
    ndvi_40$Mining <- as.numeric(1:5)[match(ndvi_40$Mining, mp)]
    ## set optional parameters of optimal discretization
    ## optional methods: equal, natural, quantile, geometric, sd and manual
    discmethod <- c("equal","natural","quantile")
    discitv <- c(4:6)
    ## "gdm" function
    ndvigdm <- gdm(NDVIchange ~ Climatezone + Mining + Tempchange + GDP,
                   continuous_variable = c("Tempchange", "GDP"),
                   data = ndvi_40,
                   discmethod = discmethod, discitv = discitv)
    ndvigdm
    plot(ndvigdm)

    ## H1N1: h1n1_100
    ## set optional parameters of optimal discretization
    discmethod <- c("equal","natural","quantile","geometric","sd")
    discitv <- c(3:7)
    continuous_variable <- colnames(h1n1_100)[-c(1,11)]
    ## "gdm" function
    h1n1gdm <- gdm(H1N1 ~ .,
                   continuous_variable = continuous_variable,
                   data = h1n1_100,
                   discmethod = discmethod, discitv = discitv)
    h1n1gdm
    plot(h1n1gdm)

### Factor detector: `gd`

    ## a categorical explanatory variable
    g1 <- gd(NDVIchange ~ Climatezone, data = ndvi_40)
    g1

    ## multiple categorical explanatory variables
    g2 <- gd(NDVIchange ~ ., data = ndvi_40[,1:3])
    g2
    plot(g2)

    ## multiple variables inclusing continuous variables
    discmethod <- c("equal","natural","quantile","geometric","sd")
    discitv <- c(3:7)
    data_ndvi <- ndvi_40
    odc1 <- optidisc(continuous_variable = data_ndvi[,4:7],
                     response_variable = data_ndvi$NDVIchange,
                     discmethod, discitv)
    for (i in 4:7){
      data_ndvi[,i] <- stra(data_ndvi[,i], odc1[[i-3]]$itv)
    }
    g3 <- gd(NDVIchange ~ ., data = data_ndvi)
    g3
    plot(g3)

### Risk detector: `riskmean` and `gdrisk`

Risk mean values by variables:

    ## categorical explanatory variables
    rm1 <- riskmean(NDVIchange ~ Climatezone + Mining, data = ndvi_40)
    rm1
    plot(rm1)
    ## multiple variables inclusing continuous variables
    rm3 <- riskmean(NDVIchange ~ ., data = data_ndvi)
    rm3
    plot(rm3)

Risk matrix:

    ## categorical explanatory variables
    gr1 <- gdrisk(NDVIchange ~ Climatezone + Mining, data = ndvi_40)
    gr1
    plot(gr1)
    ## multiple variables inclusing continuous variables
    gd3 <- gdrisk(NDVIchange ~ ., data = data_ndvi)
    gd3
    plot(gd3)

### Interaction detector: `gdinteract`

    ## categorical explanatory variables
    gi1 <- gdinteract(NDVIchange ~ Climatezone + Mining, data = ndvi_40)
    gi1
    ## multiple variables inclusing continuous variables
    gi3 <- gdinteract(NDVIchange ~ ., data = data_ndvi)
    gi3
    plot(gi3)

### Ecological detector: `gdeco`

    ## categorical explanatory variables
    ge1 <- gdeco(NDVIchange ~ Climatezone + Mining, data = ndvi_40)
    ge1
    ## multiple variables inclusing continuous variables
    gd3 <- gdeco(NDVIchange ~ ., data = data_ndvi)
    gd3
    plot(gd3)

## Comparison of size effects of spatial unit

    ndvilist <- list(ndvi_10, ndvi_20, ndvi_30, ndvi_40, ndvi_50)
    su <- c(10,20,30,40,50) ## sizes of spatial units
    gdlist <- list() ## list of all geographical detectors results
    ## set optional parameters of optimal discretization
    discmethod <- c("equal","natural","quantile","geometric","sd")
    discitv <- c(3:7)
    ## "gdm" function (~ 40s)
    for (i in 1:length(su)){
      ndvidata <- ndvilist[[i]]
      gdlist[[i]] <- gdm(NDVIchange ~ .,
                         continuous_variable = c("Tempchange", "Precipitation", "GDP", "Popdensity"),
                         data = ndvidata,
                         discmethod = discmethod, discitv = discitv)
    }
    ## size effects of spatial units
    sesu(gdlist, su)

## Reference

Song Y (2018). GD: Geographical Detectors. R package, https://CRAN.R-project.org/package=GD.

Wang J, Li X, Christakos G, Liao Y, Zhang T, Gu X and Zheng X (2010). “Geographical Detectors-Based Health Risk Assessment and its Application in the Neural Tube Defects Study of the Heshun Region, China.” International Journal of Geographical Information Science, 24(1), pp. 107-127. doi: 10.1080/13658810802443457.

Wang J, Zhang T and Fu B (2016). “A measure of spatial stratified heterogeneity.” Ecological Indicators, 67, pp. 250-256. doi: 10.1016/j.ecolind.2016.02.052.

Song Y, Wang X, Wright G, Thatcher D, Wu P and Felix P (2018). “Traffic Volume Prediction With Segment-Based Regression Kriging and its Implementation in Assessing the Impact of Heavy Vehicles.” IEEE Transactions on Intelligent Transportation Systems, pp. 1-12. doi: 10.1109/TITS.2018.2805817.

Xu C and Wang J (2018). Geodetector Website. http://www.geodetector.org/.

## Author and Contact

Yongze Song

Email: yongze.song@postgrad.curtin.edu.au

Curtin University, Australia