-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path01-NotionsDeBase.qmd
1672 lines (1314 loc) · 82.9 KB
/
01-NotionsDeBase.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# Autocorrélation spatiale, dépendance spatiale et hétérogénéité spatiale d'un modèle de régression {#sec-chap01}
Avant d'explorer les différents types de régressions spatiales dans les chapitres suivants, il est primordial de comprendre plusieurs notions clés, comme l'autocorrélation spatiale, la dépendance spatiale et l'hétérogénéité spatiale. Aussi, de nombreuses méthodes de régression spatiale s'appuient sur l'utilisation de matrices de pondération spatiale. Nous proposons également un bref rappel sur la régression linéaire multiple.
Certaines sections de ce chapitre sont adaptées du manuel suivant : Apparicio P. et J. Gelb (2024). *Méthodes d’analyse spatiales : un grand bol d’R*. Université de Sherbrooke, Département de géomatique appliquée. fabriqueREL. Licence CC BY-SA.
::: bloc_objectif
::: bloc_objectif-header
::: bloc_objectif-icon
:::
**Objectifs d'apprentissage visés dans ce chapitre**
:::
::: bloc_objectif-body
À la fin de ce chapitre, vous devriez être en mesure de :
- Connaître les principales matrices de pondérations spatiales.
- Maîtriser les notions d'autocorrélation spatiale, de dépendance spatiale et d'hétérogénéité spatiale.
- Comprendre la notion de variable spatialement décalée.
- Calculer une mesure d'autocorrélation spatiale globale (*I* de Moran) dans R.
- Évaluer la dépendance spatiale d'un modèle de régression multiple en calculant le *I* de Moran sur ses résidus.
:::
:::
::: bloc_package
::: bloc_package-header
::: bloc_package-icon
:::
**Liste des *packages* utilisés dans ce chapitre**
:::
::: bloc_package-body
- Pour importer et manipuler des fichiers géographiques :
- `sf` pour importer et manipuler des données vectorielles.
- Pour cartographier des données :
- `ggplot2` et `ggpubr` pour construire des graphiques.
- `tmap` pour construire des cartes thématiques.
- `RColorBrewer` pour construire une palette de couleur.
- Pour les mesures d'autocorrélation spatiale :
- `spdep` pour construire des matrices de pondération spatiales et calculer le *I* de Moran.
:::
:::
## Description des jeux de données utilisés dans le manuel {#sec-011}
Plusieurs jeux de données sont utilisés dans ce livre et sont déjà structurés et disponibles au format `.Rdata`.
::: bloc_attention
::: bloc_attention-header
::: bloc_attention-icon
:::
**Manipulation, structuration et cartographie de données spatiales**
:::
::: bloc_attention-body
Ce livre n'a pas pour objectif de traiter la phase préparatoire consistant à structurer les données spatiales dans R avant l'application de modèles de régression spatiale. Nous partons du principe que les lectrices et lecteurs maîtrisent déjà l'utilisation des *packages* `sf` et `tmap` pour manipuler, structurer et cartographier des données spatiales. Si ce n'est pas le cas, nous vous encourageons à consulter le chapitre intitulé [*Manipulation des données spatiales dans R*](https://serieboldr.github.io/MethodesAnalyseSpatiale/01-ManipulationDonneesSpatiales.html) [@RBoldAirMethodesAnalysesSpatiales].
:::
:::
### Jeu de données sur l'agglomération de Lyon {#sec-0111}
Premièrement, nous utiliserons le jeu de données spatiales `LyonIris` du *package* `geocmeans`. Ce jeu de données spatiales pour l'agglomération lyonnaise (France) comprend dix variables, dont quatre environnementales (EN) et six socioéconomiques (SE), pour les îlots regroupés pour l'information statistique (IRIS) de l'agglomération lyonnaise (@tbl-datageocmeans et @fig-datacarto).
{#fig-datacarto width="100%" fig-align="center"}
```{r}
#| label: tbl-datageocmeans
#| tbl-cap: Statistiques descriptives du jeu de données LyonIris
#| echo: false
#| message: false
#| warning: false
#| eval: true
library(sf)
load("data/Lyon.Rdata")
donnees <- st_drop_geometry(LyonIris)
donnees <- donnees[c("Lden", "NO2", "PM25", "VegHautPrt",
"Pct0_14", "Pct_65", "Pct_Img",
"TxChom1564", "Pct_brevet", "NivVieMed")]
intitule <- c("Bruit routier (Lden dB(A))",
"Dioxyde d'azote (ug/m^3^)",
"Particules fines (PM$_{2,5}$)",
"Canopée (%)",
"Moins de 15 ans (%)",
"65 ans et plus (%)",
"Immigrants (%)",
"Taux de chômage",
"Personnes à faible scolarité (%)",
"Médiane du niveau de vie (milliers d'euros)")
stats <- data.frame(variable = names(donnees),
nom = intitule,
type = c("EN", "EN", "EN", "EN", "SE", "SE", "SE", "SE", "SE", "SE"),
moy = round(sapply(donnees, mean),2),
et = round(sapply(donnees, sd),2),
minimum = round(sapply(donnees, min),2),
maximum = round(sapply(donnees, max),2)
)
knitr::kable(stats,
digits = 1,
row.names = FALSE,
format.args = list(decimal.mark = ',', big.mark = " "),
col.names=c("Nom", "Intitulé", "Type", "Moy.", "E.-T.", "Min.", "Max."),
align= c("l", "l", "c", "r", "r", "r", "r"),
format = "markdown")
```
### Jeu de données sur la région métropolitaine de Montréal {#sec-0112}
Deuxièmement, nous utiliserons un jeu de données spatiales sur les parts modales dans la région de Montréal extraites du recensement de 2021 de Statistique Canada pour la région métropolitaine de Montréal (@tbl-Mtl). En guise d'exemple, les proportions des navetteurs utilisant respectivement le transport en commun et l'automobile par secteur de recensement sont présentées à la @fig-datamtlCarto.
```{r}
#| label: tbl-Mtl
#| tbl-cap: Statistiques descriptives du jeu de données sur Montréal
#| echo: false
#| message: false
#| warning: false
#| eval: true
# data_mtl <- st_read('data/chap06/data_sr_access.gpkg', quiet = TRUE)
# data_mtl <- data_mtl %>%
# mutate(
# prt_tc = mode_tc / total_commuters,
# prt_auto = mode_auto / total_commuters,
# revenu_median = revenu_median / 1000,
# prt_actif = (mode_pieton + mode_velo) / total_commuters,
# ) %>%
# filter(!is.na(prt_tc)) %>%
# st_transform(32188)
# save(data_mtl, file="data/Mtl.Rdata")
load("data/Mtl.Rdata")
donnees <- st_drop_geometry(data_mtl)
donnees[, c("GeoUID", "Households", "Dwellings",
"Population", "acs_idx_emp_tc_offpeak")] <- list(NULL)
intitule <- c("Proportion de familles monoparentales",
"Proportion de minorités visibles",
"Proportion de chômeurs",
"Proportion de personnes à faible revenu",
"Revenu médian des ménages (milliers de dollars)",
"Habitants au km2",
"Transports en commun (effectifs)",
"Automobile (effectifs)",
"Marche (effectifs)",
"Vélo (effectifs)",
"Total navetteurs (effectifs)",
"Accessibilité aux emplois en heure de pointe à vélo",
"Accessibilité aux emplois en heure de pointe en transport collectif",
"Accessibilité aux emplois en heure de pointe à la marche",
"Proportion de navetteurs en transport en commun",
"Proportion de navetteurs en auto",
"Proportion de naveteurs en transport actif (vélo et marche)"
)
stats <- data.frame(variable = names(donnees),
nom = intitule,
moy = round(sapply(donnees, mean),2),
et = round(sapply(donnees, sd),2)
)
knitr::kable(stats,
digits = 1,
row.names = FALSE,
format.args = list(decimal.mark = ',', big.mark = " "),
col.names=c("Nom", "Intitulé", "Moy.", "E.-T."),
align= c("l", "l", "r", "r"),
format = "markdown")
```
```{r}
#| echo: false
#| message: false
#| eval: true
#| warning: false
#| label: fig-datamtlCarto
#| fig-cap: Parts modales de tranport en commun et de l'automobile (proportion)
#| fig-align: center
library(tmap, quietly = TRUE)
legende_parametres <- list(text.separator = "à",
decimal.mark = ",",
big.mark = " ",
digits = 2)
carte1 <- tm_shape(data_mtl) +
tm_fill(col = "prt_tc",
n = 5,
palette = "Reds",
style = "quantile",
legend.format = legende_parametres,
title = 'Transport en commun') +
tm_layout(frame = FALSE, legend.outside = TRUE)
carte2 <- tm_shape(data_mtl) +
tm_fill(col = "prt_auto",
n = 5,
palette = "Reds",
style = "quantile",
legend.format = legende_parametres,
title = 'Automobile') +
tm_layout(frame = FALSE, legend.outside = TRUE)
carte3 <- tm_shape(data_mtl) +
tm_fill(col = "prt_actif",
n = 5,
palette = "Reds",
style = "quantile",
legend.format = legende_parametres,
title = 'Transport actif') +
tm_layout(frame = FALSE, legend.outside = TRUE) +
tm_scale_bar(breaks = c(0,10))
tmap_arrange(carte1, carte2, carte3, ncol=2, nrow=2)
```
### Jeu de données sur Barcelone {#sec-0113}
```{r}
#| echo: false
#| message: false
#| warning: false
load("data/Bcn.RData")
```
### Jeu de données sur la densité pour six villes espagnoles {#sec-0114}
```{r}
#| echo: false
#| message: false
#| warning: false
load("data/Density.RData")
```
### Jeu de données sur la densité pour six régions métropolitaines espagnoles {#sec-0115}
```{r}
#| echo: false
#| message: false
#| warning: false
load("data/ProbitData.RData")
```
## Matrices des pondérations spatiales {#sec-012}
::: bloc_objectif
::: bloc_objectif-header
::: bloc_objectif-icon
:::
**Utilité des matrices de pondérations spatiales**
:::
::: bloc_objectif-body
Ces matrices permettent de définir les relations spatiales entre les entités spatiales d'une couche géographique, et plus spécifiquement la manière de mesurer leur relation d'adjacence (voisinage) ou de proximité (distance). Nous verrons qu'elles sont largement utilisées dans les régressions spatiales, notamment dans les modèles d'économétrie spatiale abordées dans la seconde partie du livre. Elles sont aussi nécessaires au calcul des mesures d'autocorrélation globales ou locales ([section @sec-0142]) et à la construction des variables spatialement décalées ([section @sec-013]).
:::
:::
Il existe huit principales matrices de pondération spatiale regroupées en deux grandes catégories : celles de contiguïté (basées sur l'adjacence) et celles de proximité (basées sur la distance) (@tbl-TabMatricesSpatiales). Lorsque la couche géographique est composée de points, seules les matrices de proximité peuvent être utilisées.
```{r}
#| label: tbl-TabMatricesSpatiales
#| tbl-cap: Matrices de pondération spatiale selon la géométrie
#| echo: false
#| message: false
#| warning: false
df1 <- data.frame(
Matrice = c("Partage d'un nœud (Queen)",
"Partage d'un segment (Rook)",
"Partage d'un nœud et ordre d'adjacence (Queen)",
"Partage d'un segment et ordre d'adjacence (Rook)",
"Connectivité selon la distance",
"Inverse de la distance",
"Inverse de la distance au carré",
"Nombre de plus proches voisins"),
Points = c(" ", " ", " ", "", "X", "X", "X", "X"),
Lignes = c("X", "X", "X", "X", "X", "X", "X", "X"),
Polyg = c("X", "X", "X", "X", "X", "X", "X", "X"),
Raster = c("X", "X", "X", "X", "X", "X", "X", "X")
)
my_table <- knitr::kable(df1,
format.args = list(decimal.mark = ',', big.mark = " "),
col.names = c("Matrice", "Points", "Lignes", "Polyg.", "Raster"),
align=c("l", "c", "c", "c", "c"))
kableExtra::pack_rows(my_table,
index = c(
"Matrices de contiguïté (basées sur l'adjacence)" = 4,
"Matrices de proximité (basées sur la distance)" = 4))
```
### Matrices de contiguïté {#sec-0121}
La relation d'adjacence (de contiguïté) vise à déterminer si deux entités spatiales sont ou non voisines selon le partage soit d'un nœud, soit d'un segment (frontière commune). La contiguïté est liée à la notion de topologie qui prend en compte les relations de voisinage entre des entités spatiales, sans tenir compte de leurs tailles et de leurs formes géométriques. Elle peut être représentée à partir d'une **matrice de contiguïté** (avec une valeur de 1 quand deux entités sont voisines et de 0 pour une situation inverse) ou d'un **graphe** (formé de points représentant les entités spatiales et de lignes reliant les entités voisines) (@fig-Chap02Contiguity1).
{#fig-Chap02Contiguity1 width="55%" fig-align="center"}
Trois évaluations de la contiguïté sont représentées à la @fig-Chap01Contiguity2 :
- **Adjacence selon le partage d'un segment**, soit d'une frontière commune entre les polygones (A).
- **Adjacence selon le partage d'un nœud** (B).
- **Ordre d'adjacence selon le partage d'un segment** (C). L'ordre d'adjacence indique le nombre de frontières à traverser pour se rendre à l'entité spatiale contiguë, soit :
- **Ordre 1** : une frontière à traverser pour se rendre dans l'entité spatiale adjacente.
- **Ordre 2** : deux frontières à traverser pour atteindre les entités de la deuxième couronne.
- **Ordre 3** : trois frontières à traverser pour atteindre les entités de la troisième couronne.
- Etc.
Bien entendu, les ordres d'adjacence peuvent être également définis selon le partage d'un nœud commun.
{#fig-Chap01Contiguity2 width="60%" fig-align="center"}
Habituellement appelée $\mathbf{W}$, la matrice de contiguïté est binaire selon le partage tant d'un nœud (*Queen* en anglais) (@eq-ContiguiteQueen) que d'un segment commun (*Rook* en anglais) (@eq-ContiguiteRook).
$$
w_{ij} =
\begin{cases}
1 & \text{si les entités spatiales }i \text{ et }j \text{ ont au moins un nœud commun; } i \ne j\\
0 & \text{sinon}
\end{cases}
$$ {#eq-ContiguiteQueen}
$$
w_{ij} =
\begin{cases}
1 & \text{si les entités spatiales }i \text{ et }j \text{ partagent une frontière commune; } i \ne j\\
0 & \text{sinon}
\end{cases}
$$ {#eq-ContiguiteRook}
### Matrices de proximité {#sec-0122}
Pour construire une matrice de pondération spatiale selon la proximité, nous pouvons utiliser plusieurs types de distance [@ApparicioGelbrevisited] : certaines sont cartésiennes, d'autres, dites réticulaires, sont calculées à partir d'un réseau de rues (@fig-Chap01TypesDistances).
Les distances cartésiennes -- euclidienne et de Manhattan (@eq-DistEuc et @eq-DistManh) -- sont facilement calculables à partir des coordonnées géographiques (*x*,*y*) lorsque la couche géographique est dans un système de projection plane (@fig-Chap01TypesDistances, a). Si la projection de la couche est sphérique (longitude/latitude), il convient d'utiliser la formule de haversine (basée sur la trigonométrie sphérique) pour obtenir la distance à vol d'oiseau (@eq-DistLongLat).
Par contre, comme leurs noms l'indiquent, le calcul des distances réticulaires (@fig-Chap01TypesDistances, b) nécessite d'avoir un réseau de rues dans un système d'information géographique (par exemple, l'extension *Network Analyst* d'ArcGIS Pro) ou dans R (notamment avec le *package* R5R) pour calculer le chemin le plus rapide (voir le chapitre intitulé [*Mesures d'accessibilité spatiale selon différents modes de transport*](https://serieboldr.github.io/MethodesAnalyseSpatiale/05-AnalyseReseau.html) [@RBoldAirMethodesAnalysesSpatiales]).
$$
d_{ij} = \sqrt{(x_i-x_j)^2+(y_i-y_j)^2}
$$ {#eq-DistEuc}
$$
d_{ij} = \lvert x_i-x_j \rvert + \lvert y_i-y_j \rvert
$$ {#eq-DistManh}
$$
d_{ij} = 2R \cdot \text{ arcsin} \left( \sqrt{\text{sin}^2 \left( \frac{\delta _i - \delta _j}{2} \right) + \text{cos }\delta _i \cdot \text{cos }\delta _j \cdot \text{sin}^2 \left( \frac{\phi _i - \phi _j}{2} \right)} \right)
$$ {#eq-DistLongLat}
avec $R$ étant le rayon de la terre; $\delta _i$ et $\delta _j$ les coordonnées de longitude pour les points $i$ et $j$; $\phi _i$ et $\phi _j$ les coordonnées de latitude pour les points $i$ et $j$.
{#fig-Chap01TypesDistances width="80%" fig-align="center"}
#### Matrice de distance binaire (de connectivité) {#sec-01221}
À partir d'une matrice de distance entre les entités spatiales d'une couche géographique, il est possible de créer une matrice de pondération binaire (@eq-MatriceDistanceNonBinaire). Ce type de matrice est habituellement appelée **matrice de connectivité**. Il convient alors de fixer un seuil de distance maximal. Par exemple, avec un seuil de 500 mètres, $w_{ij}=1$ si la distance entre les entités spatiales $i$ et $j$ est inférieure ou égale à 500 mètres; sinon $w_{ij}=0$. Notez que pour des lignes et des polygones, la distance est habituellement calculée à partir de leurs centroïdes.
$$
w_{ij} =
\begin{cases}
1 & \text{si }d_{ij}\leq{\bar{d}}\text{; } i \ne j\\
0 & \text{sinon}
\end{cases}
$$ {#eq-MatriceDistanceNonBinaire}
avec $d_{ij}$ étant la distance entre les entités spatiales $i$ et $j$, et $\bar{d}$ étant un seuil de distance maximal fixé par la personne utilisatrice (par exemple, 500 mètres).
En guise d'exemple, à la @fig-Connectivite, seuls les polygones jaunes seraient considérés comme voisins du polygone bleu avec un seuil de distance maximal fixé à 2,5 kilomètres (valeur de 1); les roses se verraient affecter la valeur de 0.
{#fig-Connectivite width="50%" fig-align="center"}
#### Matrices basées sur la distance {#sec-01222}
Une fois les distances calculées entre les entités spatiales, les pondérations peuvent être calculées avec l'inverse de la distance ($1/d_{ij}$) ou l'inverse de la distance au carré ($1/d_{ij^2}$) (@eq-MatriceDistance1).
$$
w_{ij} =
\begin{cases}
\frac{1}{d_{ij}^{\gamma}} &\\
0 & \text{si } i=j
\end{cases}
$$ {#eq-MatriceDistance1}
avec $\gamma = 1$ pour une matrice de l'inverse de la distance et $\gamma = 2$ pour l'inverse de la distance au carré.
Analysons le graphique à la @fig-PonderationInvDistInvDist2. Premièrement, nous constatons que plus la distance est grande, plus la valeur de la pondération est faible et inversement. De la sorte, nous accordons un rôle plus important aux entités spatiales proches les unes des autres qu'à celles éloignées. Deuxièmement, les pondérations chutent beaucoup plus rapidement avec l'inverse de la distance au carré qu'avec l'inverse de la distance. Autrement dit, le recours à une matrice de pondération calculée avec l'inverse de la distance au carré a comme effet d'accorder un poids plus important aux entités géographiques très proches.
```{r}
#| echo: false
#| message: false
#| warning: false
#| label: fig-PonderationInvDistInvDist2
#| fig-align: center
#| fig-cap: Comparaison des matrices inverse de la distance et inverse de la distance au carré
#| out-width: 75%
library(ggplot2)
library(ggthemes)
dij <- c(1:40)
df1 <- data.frame(Distance = dij, Ponderation = 1/(dij), type = "Inverse de la distance")
df2 <- data.frame(Distance = dij, Ponderation = 1/(dij)^2, type = "Inverse de la distance au carré")
df3 <- rbind(df1, df2)
x_ticks <- seq(0,40,5)
ggplot(data = df3)+
geom_path(aes(x = Distance, y = Ponderation, color = type), linewidth = 1)+
labs(x = "Distance (en mètres)",
y = "Pondération",
color = "",
title = '') +
scale_x_continuous(breaks = x_ticks, labels = x_ticks)+
geom_segment(aes(xend = df3[5,1]+.0, x = df3[5,1]+10,
yend = df3[5,2], y = df3[5,2]+.2),
linewidth=1, linetype="solid", colour="black")+
geom_segment(aes(xend = df3[45,1]+.0, x = df3[45,1]+10,
yend = df3[45,2], y = df3[45,2]+.2),
linewidth=1, linetype="solid", colour="black")+
annotate(geom="text", x =df3[5,1]+10.5, y= df3[5,2]+.2,
label="Inverse de la distance", color="black", hjust = 0, size = 4)+
annotate(geom="text", x =df3[45,1]+10.5, y=df3[45,2]+.2,
label="Inverse de la distance au carré", color="black", hjust = 0, size = 4)+
theme(legend.position = "none")
```
Notez que l'@eq-MatriceDistance1 peut être légèrement modifiée en introduisant un seuil maximal de la distance au-delà duquel les pondérations sont mises à 0 (@eq-MatriceDistance2). Autrement dit, cela permet de ne pas tenir compte des entités spatiales distantes à plus d'un seuil fixé par l'analyste, ce qui est particulièrement intéressant lorsque vous analysez un phénomène dont la diffusion (ou propagation) cesse au-delà d'une certaine distance.
$$
w_{ij} =
\begin{cases}
\frac{1}{d_{ij}^{\gamma}} & \text{si }d_{ij}\leq{\bar{d}}\\
0 & \text{si }d_{ij}>{\bar{d}}\\
0 & \text{si } i=j
\end{cases}
$$ {#eq-MatriceDistance2}
#### Matrices selon le critère des plus proches voisins {#sec-01223}
Une autre façon très utilisée pour définir une matrice de proximité à partir d'une matrice de distance consiste à retenir uniquement les *n* plus proches voisins. La matrice est aussi binaire avec les valeurs de 1 si les observations sont parmi les *n* plus proches de l'entité spatiale $i$ et de 0 pour une situation inverse.
### Standardisation des matrices de pondération spatiale en ligne {#sec-0123}
Il est recommandé de standardiser les matrices de pondération en ligne. La somme de la matrice de pondération sera alors égale au nombre d'entités spatiales de la couche géographique.
::: bloc_attention
::: bloc_attention-header
::: bloc_attention-icon
:::
**Quel est l'intérêt de la standardisation?**
:::
::: bloc_attention-body
Nous verrons dans les sections suivantes que ces matrices sont utilisées pour évaluer le degré d'autocorrélation spatiale globale et locale. Or, il est fréquent de comparer les valeurs des mesures d'autocorrélation spatiale obtenues avec différentes matrices d'adjacence et de proximité (contiguïté selon le partage d'un nœud, d'une frontière commune; inverse de la distance, inverse de la distance au carré, etc.). Autrement dit, la standardisation des matrices de pondération spatiale permet de vérifier si le degré de (dis)ressemblance des entités spatiales en fonction d'une variable donnée est plus fort avec une matrice de contiguïté, d'inverse de la distance ou encore d'inverse de la distance au carré, etc.
:::
:::
Pour illustrer comment réaliser une standardisation, nous utilisons une couche géographique comprenant peu d'entités spatiales, soit celle des quatre arrondissements de la ville de Sherbrooke (@fig-Arrond).
{#fig-Arrond width="50%" fig-align="center"}
Au @tbl-StandardisationMatrice, différentes matrices de contiguïté et de distance ont été calculées, puis standardisées. Voici comment interpréter les différentes sections du tableau :
- **Contiguïté selon le partage d'une frontière commune.** La valeur de 1 signale que deux arrondissements sont voisins, sinon la valeur est à 0. Tel qu'indiqué aux @eq-ContiguiteQueen et @eq-ContiguiteRook, un arrondissement ne peut être voisin de lui-même (ex.: valeur de 0 pour la cellule `Bro.` et `Bro.`). L'arrondissement de Brompton--Rock Forest--Saint-Élie--Deauville (`Bro.`) a deux voisins, soit ceux des Nations et de Fleurimont (`Nat.` et `Fle.`), comme indiqué par la valeur 2 dans la colonne `total`. Par contre, les arrondissements des Nations et de Fleurimont sont voisins de tous les autres (valeur de 3 dans la colonne `total`).
- **Standardisation de la matrice de contiguïté.** Il suffit de diviser chaque valeur de la matrice de contiguïté par la somme de la ligne correspondante. De la sorte, la somme de chaque ligne est égale à 1 et la somme de l'ensemble des valeurs de la matrice est égale au nombre d'entités spatiales (ici 4).
- **Distance (km).** Nous avons calculé la distance euclidienne en kilomètres entre les centroïdes des arrondissements.
- **Inverse de la distance.** Les valeurs sont obtenues avec la formule $1/_{dij}$. Par exemple, entre `Bro.` et `Nat.`, nous avons $1/7,9930 = 0,1251$.
- **Inverse de la distance au carré.** Les valeurs sont obtenues avec la formule $1/_{dij^2}$. Par exemple, entre `Bro.` et `Nat.`, nous avons $1/7,9930^2 = 0,0160$.
- **Standardisation de l'inverse de la distance.** Comme précédemment, il suffit de diviser chaque valeur de la matrice par la somme de la ligne correspondante. Par exemple, pour `Bro.` et `Nat.`, nous avons $0,1251 / 0,3241 = 0,3860$. Remarquez que la somme des lignes est bien égale à 1.
- **Standardisation de l'inverse de la distance au carré.** Comme précédemment, il suffit de diviser chaque valeur de la matrice par la somme de la ligne correspondante. Par exemple, pour `Bro.` et `Nat.`, nous avons $0,0160 / 0,0360 = 0,4440$. Remarquez que la somme des lignes est bien égale à 1.
```{r}
#| label: tbl-StandardisationMatrice
#| tbl-cap: Standardisation de matrices de pondération spatiale
#| echo: false
#| message: false
#| warning: false
Arrondissements <- st_read("data/chap01/Arrondissements.shp", quiet=TRUE)
Arrondissements$Etiquette <- c("Bro.", "Nat.", "Len.", "Fle.")
Arrond.Centroid <- st_centroid(Arrondissements)
## Dataframe contiguïté
Contiguite <- data.frame(st_intersects(Arrondissements, Arrondissements, sparse = FALSE))
Contiguite[1,1] <- 0
Contiguite[2,2] <- 0
Contiguite[3,3] <- 0
Contiguite[4,4] <- 0
cols <- sapply(Contiguite, is.logical)
Contiguite[,cols] <- lapply(Contiguite[,cols], as.numeric)
names(Contiguite) <- Arrondissements$Etiquette
Contiguite$Total <- rowSums(Contiguite)
ContiguiteZ <- round(Contiguite / Contiguite$Total, 3)
## Dataframe des distances
Distances <- st_distance(Arrond.Centroid, Arrond.Centroid)
Distances <- round(as.numeric(Distances) / 1000, 3)
Distances <- data.frame("Bro." = Distances[1:4],
"Nat." = Distances[5:8],
"Len." = Distances[9:12],
"Fle." = Distances[13:16],
"Total" = c(NA, NA, NA, NA)
)
## Inverse de la distance
InvDist <- round(1/Distances, 4)
InvDist[sapply(InvDist, is.infinite)] <- 0
InvDist$Total <- 0
InvDist$Total <- rowSums(InvDist)
## Inverse de la distance au carré
InvDist2 <- round(1/Distances^2, 3)
InvDist2[sapply(InvDist2, is.infinite)] <- 0
InvDist2$Total <- 0
InvDist2$Total <- rowSums(InvDist2)
## Standardisation
InvDistZ <- round(InvDist / InvDist$Total, 3)
InvDistZ2 <- round(InvDist2 / InvDist2$Total, 3)
## Création du tableau
dffinal <- rbind(Contiguite, ContiguiteZ,
Distances, InvDist, InvDist2, InvDistZ, InvDistZ2)
df1 <- data.frame(Nom = rep(Arrondissements$Etiquette, nrow(dffinal) / 4))
dffinal <- cbind(df1, dffinal)
options(knitr.kable.NA = "")
my_table <- knitr::kable(dffinal,
format.args = list(decimal.mark = ',', big.mark = " "),
col.names = c("Arrondissement", Arrondissements$Etiquette, "Somme (lignes)"),
align=c("r", "r", "r", "r", "r"),
)
kableExtra::pack_rows(my_table,
index = c(
"Matrice de contiguïté selon le partage d'une frontière commune" = 4,
"Standardisation de la matrice de contiguïté" = 4,
"Distance (km)" = 4,
"Matrice selon l'inverse de la distance" = 4,
"Matrice selon l'inverse de la distance au carré" = 4,
"Standardisation de l'inverse de la distance" = 4,
"Standardisation de l'inverse de la distance au carré" = 4
)
)
```
### Mise en œuvre dans R {#sec-0124}
::: bloc_attention
::: bloc_attention-header
::: bloc_attention-icon
:::
**Construction des matrices dans R avec le *package*`spdep`**.
:::
::: bloc_attention-body
Le package `spdep` dispose de différentes fonctions pour construire des matrices de contiguïté, de connectivité et de distance :
- `poly2nb` pour des matrices de contiguïté.
- `nblag` et `nblag_cumul` pour des matrices de contiguïté avec des ordres d'adjacence.
- `dnearneigh` pour des matrices de connectivité.
- `as.matrix(dist(coords))` et `mat2listw` pour des matrices de distance.
- `knn2nb` pour des matrices selon le critère des plus proches voisins.
:::
:::
#### Matrices de pondération spatiale selon la contiguïté {#sec-01241}
Pour créer des matrices de pondération spatiale selon la contiguïté, nous utilisons deux fonctions du *package* `spdep` :
- `poly2nb(Nom de l'objet sf, queen = TRUE)` crée une matrice de contiguïté sous la forme d'une classe `nb` (*A neighbours list with class nb*). Avec le paramètre `queen = TRUE`, la contiguïté est évaluée selon le partage d'un nœud; avec `queen = FALSE`, la contiguïté est évaluée selon le partage d'un segment (frontière). La matrice spatiale comprend une ligne par polygone avec les index de ceux qui sont adjacents. Par exemple, `Queen[[1]]` renvoie la liste des polygones voisins à la première entité spatiale, soit `24 36 44 73`, c'est-à-dire quatre voisins.
- `nb2listw(objet nb, zero.policy = TRUE, style = "W")` crée une matrice de pondération spatiale à partir de n'importe quelle matrice spatiale (de contiguïté ou de distance). Le `paramètre style = "W"`, qui est par défaut, permet de standardiser la matrice en ligne. Par exemple, `w_queen$weights[[1]]` renvoie les valeurs des pondérations pour la première entité spatiale, soit `0.25 0.25 0.25 25` (0,25 = 1 / 4 voisins). Pour obtenir une matrice non standardisée, vous devez écrire `style = "B"`, alors `w_queen$weights[[1]]` renverra les valeurs de `1 1 1 1`.
```{r}
#| echo: true
#| message: false
#| warning: false
library(sf) # pour importer des couches géographiques
library(spdep) # pour construire les matrices de pondération
## Utilisation du jeu de données sur l'agglomération de Lyon
load("data/Lyon.Rdata")
## Matrice selon le partage d'un nœud (Queen)
# Création de la matrice spatiale
nb_queen <- poly2nb(LyonIris, queen = TRUE)
# Affichage de la première ligne de la matrice
nb_queen[[1]]
# Création de la matrice de pondération avec une standardisation en ligne
w_queen <- nb2listw(nb_queen, zero.policy = TRUE, style = "W")
# Affichage de la première ligne des pondérations standardisée
w_queen$weights[[1]]
cat("La somme de la première ligne de la matrice de pondération est égale à",
sum(w_queen$weights[[1]]))
# Affichage de la première ligne des pondérations non standardisée
nb2listw(nb_queen, zero.policy = TRUE, style = "B")$weights[[1]]
## Matrice selon le partage d'un segment (Rook)
nb_rook <- poly2nb(LyonIris, queen = FALSE)
w_rook <- nb2listw(nb_rook, zero.policy = TRUE, style = "W")
## Comparaison des deux matrices de contiguïté
# Résultat de la matrice de pondération (Queen)
summary(w_queen)
# Résultat de la matrice de pondération (Rook)
summary(w_rook)
```
#### Matrices de pondération spatiale selon la contiguïté et un ordre d'adjacence {#sec-01242}
Le code ci-dessous génère les matrices de pondération spatiale standardisées en ligne selon les ordre d'adjacence de 1 à 3.
```{r}
#| echo: true
#| message: false
#| warning: false
# Création des matrices d'ordre 1, 2 et 3
nb_queen1 <- poly2nb(LyonIris, queen = TRUE)
nb_queen2 <- nblag_cumul(nblag(nb_queen1, 2))
nb_queen3 <- nblag_cumul(nblag(nb_queen1, 3))
# Création des matrices de pondération spatiale standardisées en lignes
w_queen1 <- nb2listw(nb_queen1, zero.policy = TRUE, style = "W")
w_queen2 <- nb2listw(nb_queen2, zero.policy = TRUE, style = "W")
w_queen3 <- nb2listw(nb_queen3, zero.policy = TRUE, style = "W")
```
#### Matrice de connectivité (matrice distance binaire) {#sec-01243}
La fonction `dnearneigh(sf points, d1=, d2=)` crée une matrice de connectivité à partir d'une couche de points. Les paramètres `d1` et `d2` permettent de spécifier le rayon de recherche (ex. : avec `d1 = 0` et `d2 = 2500`, le seuil maximal de distance est de 2500 mètres). Si votre couche `sf` comprend des `lignes` ou des `polygones`, utilisez la fonction `st_centroid` ou `st_point_on_surface()` pour les convertir en points ([section @sec-0122]).
```{r}
#| echo: true
#| message: false
#| warning: false
## Conversion des polygones en points avec st_centroid
iris_centroides <- st_centroid(LyonIris)
## Matrice binaire avec un seuil de 2500 mètres
connect_2500m <- dnearneigh(iris_centroides, d1 = 0, d2 = 2500)
## Matrice de pondération spatiale standardisée en ligne
w_connect_2500m <- nb2listw(connect_2500m, zero.policy = TRUE, style = "W")
```
#### Matrices de pondération spatiale selon l'inverse de la distance et l'inverse de la distance au carré {#sec-01244}
Le code ci-dessous, qui permet de les créer les matrices de l'inverse de la distance et de l'inverse de la distance au carré, comprend les étapes suivantes :
- Récupération des coordonnées géographiques des entités spatiales.
- Création de la matrice de distance euclidienne $n \times n$ ($n$ étant le nombre d'entités spatiales de la couche).
- Calcul des matrices d'inverse de la distance et d'inverse de la distance au carré.
- Standardisation de ces deux matrices et transformation dans des objets `listw` avec la fonction `mat2listw`.
```{r}
#| echo: true
#| message: false
#| warning: false
## Coordonnées des centroïdes des entités spatiales
coords <- st_coordinates(iris_centroides)
## Création de la matrice de distance
distances <- as.matrix(dist(coords, method = "euclidean"))
# S'assurer que la diagonale de la matrice est à 0
diag(distances) <- 0
## Matrices inverse de la distance et inverse de la distance au carré
inv_distances <- ifelse(distances!=0, 1/distances, distances)
inv_distances2 <- ifelse(distances!=0, 1/distances^2, distances)
## Matrices de pondération spatiale standardisées en ligne
w_inv_distances <- mat2listw(inv_distances, style = "W")
w_inv_distances2 <- mat2listw(inv_distances2, style = "W")
```
::: bloc_astuce
::: bloc_astuce-header
::: bloc_astuce-icon
:::
**Intégration d'autres types de distance**
:::
::: bloc_astuce-body
À la [section @sec-0122], nous avons vu que plusieurs types de distances peuvent être utilisés : cartésiennes (euclidienne et de Manhattan) et réticulaires (chemin le plus rapide à pied, à vélo, en automobile et en transport en commun).
Pour construire une matrice de distance de Manhattan, vous devez changer la valeur du paramètre `method` de la fonction `dist` comme suit : `as.matrix(dist(coords, method = "manhattan"))`.
Pour intégrer une distance réticulaire, vous devez la calculer, soit [dans R](https://serieboldr.github.io/MethodesAnalyseSpatiale/01-ManipulationDonneesSpatiales.html) [@RBoldAirMethodesAnalysesSpatiales], soit dans un un logiciel de système d'information géographique (QGIS ou ArcGIS Pro avec l'extension *Network Analyst* par exemple) et l'importer dans R. Le reste du code sera alors identique.
:::
:::
Nous avons vu qu'il est possible d'utiliser une matrice de distance en fixant une distance maximale au-delà de laquelle les pondérations sont mises à 0 (@eq-MatriceDistance2). Le code ci-dessous permet de créer des matrices de pondération standardisées avec l'inverse de la distance et l'inverse de la distance au carré avec des seuils de 2500 et de 5000 mètres.
```{r}
#| echo: true
#| message: false
#| warning: false
## Coordonnées des centroïdes des entités spatiales
coords <- st_coordinates(iris_centroides)
## Création de la matrice de distance
distances <- as.matrix(dist(coords, method = "euclidean"))
## Création de différentes matrices avec différents seuils
inv_distances_1000m <- ifelse(distances<=1000 & distances!=0, 1/distances, 0)
inv_distances_2500m <- ifelse(distances<=2500 & distances!=0, 1/distances, 0)
inv_distances_5000m <- ifelse(distances<=5000 & distances!=0, 1/distances, 0)
inv_distances2_2500m <- ifelse(distances<=2500 & distances!=0, 1/distances^2, 0)
inv_distances2_5000m <- ifelse(distances<=5000 & distances!=0, 1/distances^2, 0)
## Matrices de pondération spatiale standardisées en ligne
w_inv_distances_1000 <- mat2listw(inv_distances_1000m, style = "W", zero.policy = TRUE)
w_inv_distances_2500 <- mat2listw(inv_distances_2500m, style = "W", zero.policy = TRUE)
w_inv_distances_5000 <- mat2listw(inv_distances_5000m, style = "W", zero.policy = TRUE)
w_inv_distances2_2500 <- mat2listw(inv_distances2_2500m, style = "W", zero.policy = TRUE)
w_inv_distances2_5000 <- mat2listw(inv_distances2_5000m, style = "W", zero.policy = TRUE)
```
Spécifier un seuil de distance trop réduit peut toutefois être problématique. Par exemple, sur les 506 IRIS de l'agglomération de Lyon, 68 n'ont pas de voisins à 1000 mètres, indiqués par le résultat suivant : `68 regions with no links`.
```{r}
#| echo: true
#| message: false
#| warning: false
summary(w_inv_distances_1000, zero.policy = TRUE)
```
::: bloc_attention
::: bloc_attention-header
::: bloc_attention-icon
:::
**Réduction de la taille des matrices de distance**
:::
::: bloc_attention-body
Plusieurs logiciels (notamment ArcGIS Pro et GeoDa) réduisent par défaut la taille des matrices de distance de la façon suivante : 1) construction d'une matrice de distance uniquement pour l'entité la plus proche (la matrice résultante est donc de dimension $n \times 1$); 2) obtention de la distance maximale dans cette matrice, soit la distance la plus grande entre une entité spatiale et celle la plus proche; 3) construction de la matrice de distance finale avec comme seuil la distance maximale obtenue à l'étape précédente.
Cette réduction procure deux avantages importants :
- **Une diminution considérable des temps de calcul**, surtout pour les couches géographiques comprenant un nombre très élevé d'entités spatiales. Par exemple, avec une couche de 50 entités spatiales, la matrice des distances comprendra 2500 valeurs (50 $\times$ 50 = 2500) tandis qu'avec 1000 entités spatiales, elle en comprendra un million (1000 $\times$ 1000 = 1 000 000).
- Comme décrit plus haut, il est préférable d'**éviter d'avoir une matrice de distances avec des entités spatiales sans voisins**, puisque cela a un impact négatif sur les mesures d'autocorrélation spatiale.
:::
:::
La syntaxe ci-dessous permet ainsi de construire des matrices de pondération (inverse de la distance et inverse de la distance au carré) à partir de la distance maximale et un SR et son voisin le plus proche.
```{r}
#| echo: true
#| message: false
#| warning: false
## Coordonnées des centroïdes des entités spatiales
coords <- st_coordinates(iris_centroides)
## Trouver le plus proche voisin
k1 <- knn2nb(knearneigh(coords))
## Affichage de la distance la plus proche pour les 506 IRIS
round(unlist(nbdists(k1, coords)), 0)
## Trouver la distance maximale
plusprochevoisin_max <- max(unlist(nbdists(k1, coords)))
cat("Distance maximale au plus proche voisin :", round(plusprochevoisin_max, 0), "mètres")
## Matrice de distance avec la valeur maximale
# les voisins les plus proches avec le seuil de distance maximal
voisins_distmax <- dnearneigh(coords, 0, plusprochevoisin_max)
# Distances avec le seuil maximum
distances <- nbdists(voisins_distmax, coords)
# Inverse de la distance
inv_distances <- lapply(distances, function(x) (1/x))
# Inverse de la distance au carré
inv_distances2 <- lapply(distances, function(x) (1/x^2))
## Matrices de pondération spatiale standardisées en ligne
w_inv_distances <- nb2listw(voisins_distmax, glist = inv_distances, style = "W", zero.policy = TRUE)
w_inv_distances2 <- nb2listw(voisins_distmax, glist = inv_distances2, style = "W", zero.policy = TRUE)
```
#### Matrices de pondération spatiale selon le critère des plus proches voisins {#sec-01245}
La fonction `knearneigh` du *package* `spdep` crée des matrices de distance selon le critère des plus proches voisins, dont le nombre est fixé avec le paramètre `k`.
```{r}
#| echo: true
#| message: false
#| warning: false
## Coordonnées géographiques des centroïdes des polygones
coords <- st_coordinates(st_centroid(LyonIris))
## Matrices des plus proches voisins de 2 à 5
k2 <- knn2nb(knearneigh(coords, k = 2))
k3 <- knn2nb(knearneigh(coords, k = 3))
k4 <- knn2nb(knearneigh(coords, k = 4))
k5 <- knn2nb(knearneigh(coords, k = 5))
## Matrices de pondération spatiale standardisées en ligne
w_k2 <- nb2listw(k2, zero.policy = FALSE, style = "W")
w_k3 <- nb2listw(k3, zero.policy = FALSE, style = "W")
w_k4 <- nb2listw(k4, zero.policy = FALSE, style = "W")
w_k5 <- nb2listw(k5, zero.policy = FALSE, style = "W")
```
::: bloc_astuce
::: bloc_astuce-header
::: bloc_astuce-icon
:::
**L'ensemble des matrices en quelques lignes de code!**
:::
::: bloc_astuce-body
```{r}
#| echo: true
#| message: false
#| warning: false
library(dplyr)
# Nom de la couche sf départ à changer au besoin
Couche.sf <- LyonIris
# Matrice de contiguité
nb_queen <- poly2nb(Couche.sf, queen = TRUE)
nb_rook <- poly2nb(Couche.sf, queen = FALSE)
w_queen <- nb2listw(nb_queen, zero.policy = TRUE, style = "W")
w_rook <- nb2listw(nb_rook, zero.policy = TRUE, style = "W")
# Matrice de contiguité (ordre 2 à 5)
w_rook2 <- nblag_cumul(nblag(nb_rook, 2)) %>% nb2listw(zero.policy = TRUE, style = "W")
w_rook3 <- nblag_cumul(nblag(nb_rook, 3)) %>% nb2listw(zero.policy = TRUE, style = "W")
w_rook4 <- nblag_cumul(nblag(nb_rook, 4)) %>% nb2listw(zero.policy = TRUE, style = "W")
w_rook5 <- nblag_cumul(nblag(nb_rook, 5)) %>% nb2listw(zero.policy = TRUE, style = "W")
# Matrice de connectivité binaire
centroides <- st_centroid(Couche.sf)
w_connect_2500m <- dnearneigh(centroides, d1 = 0, d2 = 2500) %>%
nb2listw(zero.policy = TRUE, style = "W")
# Inverse de la distance et inverse de la distance au carré (matrices complètes)
distances <- as.matrix(dist(st_coordinates(centroides), method = "euclidean"))
diag(distances) <- 0
w_inv_distances <- ifelse(distances!=0, 1/distances, distances) %>% mat2listw(style = "W")
w_inv_distances2 <- ifelse(distances!=0, 1/distances^2, distances) %>% mat2listw(style = "W")
# Inverse de la distance et inverse de la distance au carré (matrices réduites)
coords <- st_coordinates(centroides)
plusprochevoisin_max <- max(unlist(nbdists(knn2nb(knearneigh(coords)),coords)))
dists <- nbdists(dnearneigh(coords, 0, plusprochevoisin_max), coords)
w_inv_distances_reduite <- lapply(dists, function(x) (1/x)) %>%
nb2listw(voisins_distmax, glist = ., style = "W", zero.policy = TRUE)
w_inv_distances2_reduite <- lapply(dists, function(x) (1/x^2)) %>%
nb2listw(voisins_distmax, glist = ., style = "W", zero.policy = TRUE)
# Inverse de la distance et inverse de la distance au carré avec un seuil de distance
w_inv_distances_1000m <- ifelse(distances<=1000 & distances!=0, 1/distances, 0) %>%
mat2listw(style = "W", zero.policy = TRUE)
w_inv_distances_2500m <- ifelse(distances<=2500 & distances!=0, 1/distances, 0) %>%
mat2listw(style = "W", zero.policy = TRUE)
w_inv_distances_5000m <- ifelse(distances<=5000 & distances!=0, 1/distances, 0) %>%
mat2listw(style = "W", zero.policy = TRUE)
w_inv_distances2_2500m <- ifelse(distances<=2500 & distances!=0, 1/distances^2, 0) %>%
mat2listw(style = "W", zero.policy = TRUE)
w_inv_distances2_5000m <- ifelse(distances<=5000 & distances!=0, 1/distances^2, 0) %>%
mat2listw(style = "W", zero.policy = TRUE)
## Matrices des plus proches voisins de 2 à 5
w_k2 <- knn2nb(knearneigh(coords, k = 2)) %>% nb2listw(zero.policy = FALSE, style = "W")
w_k3 <- knn2nb(knearneigh(coords, k = 3)) %>% nb2listw(zero.policy = FALSE, style = "W")
w_k4 <- knn2nb(knearneigh(coords, k = 4)) %>% nb2listw(zero.policy = FALSE, style = "W")
w_k5 <- knn2nb(knearneigh(coords, k = 5)) %>% nb2listw(zero.policy = FALSE, style = "W")
## Sauvegarde des matrices
save(w_queen, w_rook,
w_rook2, w_rook3, w_rook4, w_rook5,
w_connect_2500m,
w_inv_distances, w_inv_distances2,
w_inv_distances_reduite, w_inv_distances2_reduite,
w_inv_distances_1000m, w_inv_distances_2500m,
w_inv_distances2_2500m, w_inv_distances2_5000m,
w_k2, w_k3, w_k4, w_k5,
file = "data/chap01/MatricesPonderations.Rdata")
```
:::
:::
## Variable spatialement décalée {#sec-013}
À partir des matrices de pondérations standardisées en ligne, qu'elles soient de contiguïté ou de proximité, il est possible de calculer pour une version spatialement décalée d'une variable initiale. De la sorte, pour une entité spatiale *i*, il est possible de connaître la valeur moyenne d'une variable pour ses entités voisines ou proches (dépendamment si la matrice est définie selon la contiguïté ou la proximité). Au [chapitre @sec-chap02], nous verrons que ces variables spatiales décalées sont utilisées dans plusieurs modèles d'économétrie spatiale.
::: bloc_notes
::: bloc_notes-header
::: bloc_notes-icon
:::
**Comment calculer une variable spatialement décalée avec une matrice de pondération spatiale?**
:::
::: bloc_notes-body
À la @fig-Chap01FigureVariableSpatialementDecalee, nous détaillons le calcul de la valeur d'une variable spatialement décalée pour l'entité spatiale **A** à partir d'une matrice de contiguïté (selon le partage d'un segment) standardisée en ligne. Notez que **A** est adjacente à quatre entités spatiales (b, c, d et e).
{#fig-Chap01FigureVariableSpatialementDecalee width="55%" fig-align="center"}
:::
:::
La fonction `lag.listw` du *package* `spdep` permet de créer une variable spatialement décalée en spécifiant la matrice de pondération spatiale et un vecteur numérique : `wzx <- lag.listw(listW, zx)`. Dans la syntaxe ci-dessous, nous créons une version spatiale décalée de la variable *dioxyde d'azote* (`NO2`) de la couche `sf` *LyonIris* avec une matrice de pondérations spatiales standardisées en ligne (définie selon la contiguïté avec le partage d'un segment, `w_rook`), puis nous cartographions les deux versions de la variable (initiale et spatialement décalée) à la @fig-Chap01FigureVariableSpatialementDecalee2.
```{r}
#| echo: true
#| message: false
#| warning: false
#| label: fig-Chap01FigureVariableSpatialementDecalee2
#| fig-align: center
#| fig-cap: Exemple de variable spatialement décalée
#| out-width: 85%
# Chargement des données
library(tmap)
library(spdep)
load("data/Lyon.Rdata")
# Matrice de pondération spatiale standardisée en ligne selon la contiguïté
w_rook<- nb2listw(poly2nb(LyonIris, queen = FALSE), zero.policy = TRUE, style = "W")
# Variable spatialement décalée
LyonIris$W_NO2 <- lag.listw(w_rook, LyonIris$NO2)
# Cartographie avec tmap
tmap_mode("plot")
legende_parametres <- list(text.separator = "à",
decimal.mark = ",",
big.mark = " ")
carte1 <- tm_shape(LyonIris)+
tm_borders(col = "gray25", lwd=.2)+
tm_fill(col = "NO2", palette = "Reds", n = 5, style = "quantile",
legend.format = legende_parametres,
title = "(a) Variable initiale")+
tm_layout(frame = FALSE)+tm_scale_bar(breaks=c(0,5))
carte2 <- tm_shape(LyonIris)+
tm_borders(col = "gray25", lwd=.2)+
tm_fill(col = "W_NO2", palette = "Reds", n = 5, style = "quantile",
legend.format = legende_parametres,
title = "(b) Spatialement décalée")+
tm_layout(frame = FALSE)
tmap_arrange(carte1, carte2, ncol = 2, nrow = 1)
```
## Autocorrélation spatiale {#sec-014}
L'autocorrélation spatiale permet d'estimer la corrélation d'une variable par rapport à sa localisation dans l'espace. Autrement dit, elle permet de vérifier si les entités proches ou voisines ont tendance à être (dis)semblables en fonction d'un phénomène donné (soit une variable). On distingue trois formes d'autocorrélation spatiale :
- **(a) Autocorrélation spatiale positive** : lorsque les entités spatiales voisines ou proches se ressemblent davantage que celles non contiguës ou éloignées. Cela renvoie ainsi à la première loi de la géographie : « tout interagit avec tout, mais les objets proches ont plus de chance de le faire que les objets éloignés » (traduction libre) [@tobler1970computer].
- **(b) Autocorrélation spatiale négative** : lorsque les entités spatiales voisines ou proches ont tendance à être dissemblables, comparativement à celles non contiguës ou éloignées.
- **(c) Absence d'autocorrélation spatiale** : lorsque les valeurs de la variable sont distribuées aléatoirement dans l'espace; autrement dit, lorsqu'il n'y a pas de relation entre le voisinage ou la proximité des entités spatiales et leur degré de ressemblance.
::: bloc_objectif
::: bloc_objectif-header
::: bloc_objectif-icon
:::
**Différentes mesures d'autocorrélation spatiale**
:::
::: bloc_objectif-body
On distingue habituellement les statistiques d'autocorrélation spatiale globales et locales :
- Les statistiques d'autocorrélation spatiale globales renvoient une valeur pour l'ensemble de l'espace d'étude. Succinctement, elles permettent de vérifier si les entités proches ou voisines d'une couche géographique ont tendance à être (dis)semblables en fonction d'un phénomène donné (soit une variable).
- Les mesures d'autocorrélation spatiale locales renvoient des valeurs pour chacune des entités spatiales. Succinctement, il s'agit de vérifier si chaque entité spatiale est significativement (dis)semblable de celles voisines ou proches.
Nous aborderons ici uniquement une **statistique d'autocorrélation spatiale globale**, soit le ***I*** **de Moran**, pour évaluer l'autocorrélation spatiale d'une variable continue. Pour aborder une panoplie de mesures globales ou locales, nous invitons à consulter le chapitre intitulé [*Autocorrélation spatiale*](https://serieboldr.github.io/MethodesAnalyseSpatiale/01-ManipulationDonneesSpatiales.html) [@RBoldAirMethodesAnalysesSpatiales].
:::
:::