-
Notifications
You must be signed in to change notification settings - Fork 3
/
README.Rmd
1356 lines (1173 loc) · 89.8 KB
/
README.Rmd
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
---
output:
github_document:
pandoc_args: --webtex
always_allow_html: true
bibliography: Accessibility-Foodbanks-Hamilton/references.bib
---
<!-- README.md is generated from README.Rmd. Please edit that file -->
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
```
# Changes in accessibility to emergency and community food services during COVID-19 and implications for low income populations in Hamilton, Ontario
<!-- badges: start -->
<!-- badges: end -->
Christopher D. Higgins (University of Toronto Scarborough)
Antonio Páez (McMaster University)
Gyoorie Kim (University of Toronto Mississauga)
Jue Wang (University of Toronto Mississauga)
Social Science and Medicine (2021) https://doi.org/10.1016/j.socscimed.2021.114442
## Abstract
In this paper we analyze the changes in accessibility to emergency and community food services before and during the COVID-19 pandemic in the City of Hamilton, Ontario. Many of these food services are the last line of support for households facing food insecurity; as such, their relevance cannot be ignored in the midst of the economic upheaval caused by the pandemic. Our analysis is based on the application of balanced floating catchment areas and concentrates on households with lower incomes (<CAD40,000, approximately the Low Income Cutoff Value for a city of Hamilton's size). We find that accessibility was low to begin with in suburban and exurban parts of the city; furthermore, about 14\% of locations originally available in Hamilton closed during the pandemic, further reducing accessibility. The impact of closures on the level of service of the remaining facilities, and on accessibility, was disproportionate, with system-wide losses exceeding 40\%. Those losses were geographically and demographically uneven. While every part of the city faced a reduction in accessibility, inner suburbs fared worse in terms of loss of accessibility. As well, children (age $\le 18$) appear to have been impacted the most.
## Keywords
- Food insecurity
- Emergency food services
- Community food services
- Food banks
- Accessibility
- Balanced Floating Catchment Areas
- COVID-19
- Hamilton
- Ontario
- Reproducible research
```{r, setup, include=FALSE}
knitr::opts_chunk$set(
cache = TRUE, out.width = "100%", align = 'center', fig.width = 7, fig.height = 7
)
```
```{r install-data-package, include = FALSE}
# Run only once if needed to install data package
if (!require("foodbanksHamilton", character.only = TRUE)) {
devtools::install_github("https://github.com/paezha/Accessibility-Food-Banks-Hamilton", subdir = "foodbanksHamilton")
}
```
```{r load-packages, cache=FALSE, include=FALSE}
library(foodbanksHamilton) # Data package
library(kableExtra)
library(patchwork)
library(sf)
library(spdep)
library(tidyverse)
```
```{r invoke-data, include=FALSE}
data(data_da_2016)
data(dwelling_network_points_2016)
data(foodbank_locations)
data(foodbank_table)
data(hamilton_boundary)
data(modes_less40k)
data(population_age_income)
data(ttm_car)
data(ttm_transit)
data(ttm_walk)
# load updated files manually
#oad("./Accessibility-Foodbanks-Hamilton/output-data-files/ttm_transit.RData")
#load("./Accessibility-Foodbanks-Hamilton/output-data-files/foodbank_table.RData")
```
```{r remove-irrelevant-destinations, include=FALSE}
## Data preparation
# Remove entries in travel time matrices for inapplicable destinations
# As a first step, we will remove the computed travel times to the three Community Kitchen locations (IDs 1-3):
ttm_car <- ttm_car %>%
filter(!between(OBJECTID, left = 1, right = 3))
ttm_transit <- ttm_transit %>%
filter(!between(OBJECTID, left = 1, right = 3))
ttm_walk <- ttm_walk %>%
filter(!between(OBJECTID, left = 1, right = 3))
```
```{r join-low-income-households, include=FALSE}
## Data preparation
# Join proportion of low income households per DA to dwellings and total number of residential units:
dwelling_network_points_2016 <- dwelling_network_points_2016 %>%
left_join(data_da_2016 %>%
st_drop_geometry() %>%
dplyr::transmute(DAUID = GeoUID,
p_inc_less40k),
by = "DAUID")
```
```{r probability-of-low-income-per-parcel, include=FALSE}
## Data preparation
# Calculate probability that a point on the network will have low income households. This is the proportion of low income households in the DA multiplied by the total number of residential units at the point:
dwelling_network_points_2016 <- dwelling_network_points_2016 %>%
mutate(income_less40k = p_inc_less40k * Dwellings)
```
```{r number-of-residential-units-per-DA, include=FALSE}
## Data preparation
# Prepare and join population data from Transportation Tomorrow Survey
# Find number of residential units in each DA. This is needed to assign the population to parcels
residential_units <- dwelling_network_points_2016 %>%
st_drop_geometry() %>%
group_by(TAZUID) %>%
summarize(residential_units = sum(Dwellings))
```
```{r join-population-to-parcels, include=FALSE}
## Data preparation
# Join number of low income households per DA to dwellings and total number of residential units:
dwelling_network_points_2016 <- dwelling_network_points_2016 %>%
left_join(population_age_income %>%
st_drop_geometry() %>%
dplyr::transmute(TAZUID,
children,
adults,
seniors),
by = "TAZUID") %>%
left_join(residential_units,
by = "TAZUID")
```
```{r calculate-low-income-households-per-parcel, include=FALSE}
## Data preparation
# Calculate population per point on the network. This is the population in the DA divided by the total number of residential units. This gives the average number of people per residential unit. Then, multiply by the number of dwellings (residential units) at the point:
dwelling_network_points_2016 <- dwelling_network_points_2016 %>%
mutate(children = (children/residential_units) * Dwellings,
adults = (adults/residential_units) * Dwellings,
seniors = (seniors/residential_units) * Dwellings)
```
```{r join-household-data-to-travel-time-tables, include=FALSE}
## Data preparation
# Join the household data to the travel time matrices:
ttm_car <- ttm_car %>%
left_join(dwelling_network_points_2016 %>%
st_drop_geometry() %>%
dplyr::select(ID,
income_less40k,
children,
adults,
seniors,
DAUID,
TAZUID),
by = c("UID" = "ID"))
ttm_transit <- ttm_transit %>%
left_join(dwelling_network_points_2016 %>%
st_drop_geometry() %>%
dplyr::select(ID,
income_less40k,
children,
adults,
seniors,
DAUID,
TAZUID),
by = c("UID" = "ID"))
ttm_walk <- ttm_walk %>%
left_join(dwelling_network_points_2016 %>%
st_drop_geometry() %>%
dplyr::select(ID,
income_less40k,
children,
adults,
seniors,
DAUID,
TAZUID),
by = c("UID" = "ID"))
```
```{r join-foodbank-data-to-travel-time-tables, include=FALSE}
## Data preparation
# Join the foodbank data to the travel time tables:
ttm_car <- ttm_car %>%
left_join(foodbank_locations %>%
st_drop_geometry() %>%
dplyr::select(ID,
TYPE,
COVIDClose),
by = c("OBJECTID" = "ID"))
ttm_transit <- ttm_transit %>%
left_join(foodbank_locations %>%
st_drop_geometry() %>%
dplyr::select(ID,
TYPE,
COVIDClose),
by = c("OBJECTID" = "ID"))
ttm_walk <- ttm_walk %>%
left_join(foodbank_locations %>%
st_drop_geometry() %>%
dplyr::select(ID,
TYPE,
COVIDClose),
by = c("OBJECTID" = "ID"))
```
```{r drop-nas-from-travel-time-tables, include=FALSE}
## Data preparation
# Drop NAs:
ttm_car <- ttm_car %>%
drop_na(TAZUID,
income_less40k)
ttm_transit <- ttm_transit %>%
drop_na(TAZUID,
income_less40k)
ttm_walk <- ttm_walk %>%
drop_na(TAZUID,
income_less40k)
```
```{r proportion-of-trips-by-mode-by-taz, include=FALSE}
## Data preparation
# Calculate proportion of trips by mode per TAZ:
modes <- modes_less40k %>%
mutate(p_car = Driver/(Driver + Transit + Walk),
p_transit = Transit/(Driver + Transit + Walk),
p_walk = Walk/(Driver + Transit + Walk))
```
```{r fill-nas-transport-modes, include=FALSE}
## Data preparation
# Assume that TAZ with NAs have a proportion of car trips of one:
modes <- modes %>%
dplyr::mutate(p_car = replace_na(p_car, 1),
p_transit = replace_na(p_transit, 0),
p_walk = replace_na(p_walk, 0))
```
```{r join-trips-by-mode-to-travel-time-tables, include=FALSE}
## Data preparation
# Join trip-making modal proportions
ttm_car <- ttm_car %>%
left_join(modes %>%
st_drop_geometry() %>%
transmute(TAZUID,
p_car,
p_transit,
p_walk),
by = "TAZUID")
ttm_transit <- ttm_transit %>%
left_join(modes %>%
st_drop_geometry() %>%
transmute(TAZUID,
p_car,
p_transit,
p_walk),
by = "TAZUID")
ttm_walk <- ttm_walk %>%
left_join(modes %>%
st_drop_geometry() %>%
transmute(TAZUID,
p_car,
p_transit,
p_walk),
by = "TAZUID")
```
```{r join-travel-time-tables, include=FALSE}
## Data preparation
# Join Tables into Single TTM
ttm <- ttm_car %>%
rename(travel_time_car = travel_time) %>%
full_join(ttm_transit %>%
transmute(UID,
OBJECTID,
travel_time_transit = travel_time),
by = c("UID", "OBJECTID")) %>%
full_join(ttm_walk %>%
transmute(UID,
OBJECTID,
travel_time_walk = travel_time),
by = c("UID", "OBJECTID"))
```
```{r travel-time-tables-data-check, include=FALSE}
## Data preparation - 2020
# Check the NAs in travel time table:
ttm %>%
filter(is.na(travel_time_transit)) %>%
select(travel_time_transit,
p_transit) %>%
summary()
# What do NAs here mean? Most DAs missing travel time by transit do not report trips by transit in the TTS. In some DAs there are trips by transit (p_transit != 0), but no foodbank can be reached by transit (travel_time_transit is NA). How many of these cases?
ttm %>%
filter(is.na(travel_time_transit) & p_transit > 0) %>%
select(travel_time_transit,
p_transit) %>%
summary()
# It should be fine to replace the NAs with zeros, which multiplied by p_transit will return a zero (i.e., it is not possible to reach a foodbank by transit).
#ttm_2021 <- ttm_2021 %>%
# mutate(travel_time_transit = replace_na(travel_time_transit, 0))
# Check the NAs in travel time by walk:
ttm %>%
filter(is.na(travel_time_walk)) %>%
select(travel_time_walk,
p_walk) %>%
summary()
# Most DAs missing travel time by walking do not report trips by walking in the TTS. In some DAs there are trips by walking (p_walk != 0), but no foodbank can be reached by walk (travel_time_walk is NA). How many of these cases?
ttm %>%
filter(is.na(travel_time_walk) & p_walk > 0) %>%
select(travel_time_walk,
p_walk) %>%
summary()
# Like with transit, it should be fine to replace the NAs with zeros, which multiplied by p_walk will return a zero (i.e., it is not possible to reach a foodbank by walking).
#ttm_2021 <- ttm_2021 %>%
# mutate(travel_time_walk = replace_na(travel_time_walk, 0))
#Summary of the table after these operations:
summary(ttm)
```
```{r calculate-expected-travel-times-old, eval = FALSE, include=FALSE}
## Data preparation
# Calculate expected travel times by mode. These are the travel time by the mode multiplied by the probability of using the mode (which is proxied by the proportion of trips by mode in the DA from the TTS). The total expected travel time is the sum of the expected travel times by mode:
#ttm_2021 <- ttm_2021 %>%
# mutate(e_travel_time_car = travel_time_car * p_car,
# e_travel_time_transit = travel_time_transit * p_transit,
# e_travel_time_walk = travel_time_walk * p_walk,
# e_travel_time = e_travel_time_car + e_travel_time_transit + e_travel_time_walk)
```
```{r calculate-expected-travel-times, include=FALSE}
ttm_long <- ttm %>% transmute(UID, OBJECTID,
car_prob = p_car,
transit_prob = p_transit,
walk_prob = p_walk,
car_traveltime = travel_time_car,
transit_traveltime = travel_time_transit,
walk_traveltime = travel_time_walk) %>%
pivot_longer(cols = !c("UID", "OBJECTID"),
names_to = c("mode", ".value"),
names_sep = "_") %>%
group_by(UID, OBJECTID) %>%
summarize(e_travel_time = weighted.mean(traveltime, prob, na.rm = TRUE))
# income_less40k = first(income_less40k)) %>%
# filter(!is.nan(e_travel_time))
ttm <- ttm %>% left_join(ttm_long, by = c("UID", "OBJECTID")) %>%
filter(!is.nan(e_travel_time))
```
# Introduction
Food insecurity is defined as an "inadequate or uncertain access to a sufficient quantity and/or adequate quality of food" due to a household's financial limitations [@enns2020experiences]. This condition has been associated with reductions in nutritional outcomes [@bhattacharya2004poverty; @kirkpatrick2008food; @olson1999nutrition] and negative physical and mental health impacts in children and adults [@elgar2021relative; @jones2017food; @ramsey2011food; @seligman2010food; @stuff2004household]. Over at least the past four decades food banks and related services have become an essential line of defense against food insecurity in Canadian communities [@riches2002food; @holmes2018nothing; @black2020examining; @tarasuk2020relationship]. In this respect, Canada is not unlike numerous other wealthy countries where a systematic dismantling of the welfare state took place in the intervening period [@tarasuk2014food].
The emergence of COVID-19, the worst public health crisis since the 1918 flu pandemic, has exposed important social and economic fault lines, and pre-existing patterns of inequality appear to have been exacerbated. Along several other dimensions of stress [e.g., accessibility to health care facilities, @ghorbanzadeh2021spatial; @pereira2021geographic], this seems to be the case for food insecurity as well [@laborde2020poverty]. According to Statistics Canada [-@statisticscanada2020food], in the early stages of the pandemic almost 15% of individuals reported living in a household that faced food insecurity; the risk of food insecurity was substantially higher for households with children. The difference between households with and without children was significant, and 11.7% of households with children indicated that "food didn't last and [there was] no money to get more" sometimes or often, compared to 7.3% of households without children; likewise, 13% of households with children indicated that they "[c]ouldn't afford balanced meals" sometimes or often, compared to 8.8% of households without children. Additionally, Men and Tarasuk [-@men2021food] report that about 25% of individuals who experienced job insecurity (a relatively common occurrence during the pandemic) also experienced food insecurity associated with COVID-related disruptions to employment, financial hardship, and use of food charity.
The impacts of food insecurity during the pandemic are alarming, since diet-related diseases, such as obesity, heart-disease, and diabetes, were already critical public health concerns in Canada prior to COVID-19 [@boucher2017ontario]. While emergency food services are not necessarily a stable solution to food insecurity and in fact may encourage a retrenchment of neoliberal policy [@wakefield2013sweet], in reality provide a resource of last instance to households in precarious situations [@bazerghi2016role]. As a mid-size city grappling with deindustrialization, Hamilton exhibits high rates of poverty and use of emergency food services. As recently as 2019, the Hamilton Hunger Report [@hfs2019] noted that food banks in the city recorded the highest number of visitors in the past 29 years; a rate of increase greater than population growth. Most troubling, approximately 40% of all visitors were children.
It is known that urban food environments, within which people make their daily food choices, are essential in influencing eating behaviours and health outcomes, based on factors such as food availability, ease of geographic accessibility and socio-demographic variations [@paez2010relative; @vanderlee2017food; @widener2018spatial]. However, while there is a wealth of literature that has examined the topic of geographic accessibility to healthy food through the "food desert" concept, there has been little research into accessibility to emergency and community food services. Previous work has explored differences in *accessing* food banks, such as how some households utilize food banks over short periods of time while others regularly utilize food banks as longer-term resource [e.g., @enns2020experiences]. In addition, transportation and locational considerations have been raised as key issues in food bank accessibility in previous qualitative research [@smith2017food]. However, we are not aware of any research that has focused on estimating or capturing this geographic component of accessibility.
The study of place-based geographic accessibility is concerned with capturing the potential to reach destinations of value using the transportation network [@paez2012measuring]. Indeed, the Government of Canada's recent Food Policy [@foodpolicy2019] has made "access" to healthy food a priority for Canadian communities and previous research suggests that such accessibility plays a key role in user satisfaction with food bank service delivery [@holmes2018nothing]. However, as with research into the prevalence of food deserts, accessibility to food banks is unlikely to be evenly distributed, and variation throughout a city can be expected due to transportation network characteristics and the spatial distribution of service locations and the population they are meant to serve. Furthermore, policy responses to the COVID-19 pandemic likely have added to the distress of vulnerable households. Non-pharmaceutical interventions during the pandemic involving restrictions in mobility have increased the friction of travel, in particular by transit on which low income populations are more reliant [e.g., @deweese2020tale]. At the same time, the pandemic has created additional stress for the operators of food banks through disruptions in the supply chain [e.g., @mckay2021exploring] as well as concerns surrounding the delivery of service in safe conditions and possible cancellation of food service programs.
For this study, we aim to look at how the landscape of emergency food and related services (e.g. low-cost or free meal service providers) available in Hamilton, Ontario, changed during the pandemic. Did the number of open services diminish? If so, what was the accessibility to emergency and community food services before the pandemic from the perspective of low income households, and how has it changed during the pandemic with respect to geographic access and congestion at remaining sites? And finally, who are most likely to have been impacted by changes in the accessibility landscape? This paper first looks at the distribution of emergency and community food services before and during the pandemic. Then, we use the balanced floating catchment area approach of Paez et al. [-@paez2019demand] to investigate the accessibility situation. For this, we adopt a fully disaggregated approach based on parcel-level data. Socio-economic and demographic data are drawn from the latest Census of Canada (2016), whereas travel information is from the most recent regional travel survey from 2016. This paper follows reproducible research recommendations [see @brunsdon2020opening], and the research was conducted using open source tools for transportation analysis [@lovelace2021open]. The data and code needed to reproduce the analysis are available in a [public repository](https://github.com/paezha/Accessibility-Food-Banks-Hamilton).
# Food Insecurity and Emergency and Communal Food Services in Canada
Food insecurity is the inability to acquire and consume an adequate amount or good quality food, leading to inadequate nutrient intake [@kirkpatrick2008food] and poorer physical and mental health outcomes [@ramsey2011food; @seligman2010food; @stuff2004household]. In this regard, food insecurity is a major population health concern, particularly among Canadians at socio-economic disadvantage [@bazerghi2016role]. Official government surveys such as the Household Food Security Survey Module (HFSSM), the Canadian Community Health Surveys (CCHS), the Longitudinal and International Study of Adults (LISA), and official classifications determined by Health Canada in relation to socio-demographic variables offer some insight into food insecurity in Canada [@kirkpatrick2008food; @tarasuk2009household; @gundersen2018food].
Nationally, analysis of the 2011-2012 CCHS has previously revealed that food insecurity impacts approximately 12.3% of Canadian households [@tarasuk2014food]. Using the same data, Tarasuk et al. [-@tarasuk2019geographic] found higher odds of food insecurity amongst households relying on social assistance, those without a university degree or with children under the age of 18, and individuals that lived alone, renters, and those identifying as Aboriginal. While surveys revealed that only 20 to 30 percent of those experiencing food insecurity were found to frequent food banks in Canada [@tarasuk2014food], pre-pandemic research from Ottawa [@enns2020experiences] and Vancouver [@black2020examining] suggests that long-term users tend to be older, have health or mobility challenges, live in large households, and are less likely to have employment income. In terms of geography, previous research conducted at the provincial scale using data from the 2011-2012 CCHS found that the prevalence of food insecurity ranged across the country from 11.8% of households in Ontario to 41% of households in Nunavut [@tarasuk2019geographic].
Food banks - sometimes also referred to as 'food pantries' and 'food shelves' - originated as a community response to aid those with inadequate food by voluntarily offering them meals and ingredients [@riches2002food; @loopstra2012relationship]. Although in their origin food banks were meant to provide a temporary solution to accommodate those in hunger due to job retrenchments and economic downfalls since the 1980s, over time many have evolved into a community practice to secure food supplies for those in need [@loopstra2012relationship; @wakefield2013sweet]. In Canada, the number of food banks has steadily increased in the past few decades [@wakefield2013sweet]. The largest database of food banks and their use comes from the non-profit association Food Banks Canada (FBC), which conducts an annual assessment through its affiliated members. FBC's 2018 Hunger Count report [@fbc2018] (the most recent available) listed 1,830 member food banks across the country, and found that Canadians visited food banks 1.1 million times in March of 2018. Of those accessing food banks, certain population characteristics tend to be over-represented compared to national totals from the 2016 Canadian Census of Population. According to FBC's 2018 data, single-adult households represent 45% of those utilizing food banks despite making up 28% of Canada's population, 19% are single-parent households (compared to 10% nationally), and 35% of those using food bank services are children aged 0-18 even though their share of Canada's national population is approximately 20%. In addition, 59% of households accessing food banks list social or disability assistance as their primary source of income.
The COVID-19 pandemic has led to an increase in the number of households living in food insecurity in Canada. Survey results from Statistics Canada from May of 2020 suggest that 14.7% of the population was living in food insecurity in the past 30 days, up from 10.5% in 2017-2018 [@statisticscanada2020food]. Recent data from FBC [@fbc2020] showed that 52% of member food banks reported an increase in usage in March of 2020 when initial lockdown restrictions were put in place across much of the country. The pandemic also created significant staffing issues with 42% of food banks reporting a reduction in volunteers. However, 53% of food banks later reported a decrease in use into the summer of 2020 which FBC members attributed to emergency financial support programs from the federal government. Nevertheless, some of these benefit programs were temporary. Although more recent statistics on food bank use in Hamilton in 2020 and 2021 are not yet available, data from the Daily Bread Food Bank [@dbfb2020] in neighbouring Toronto for August 2020 shows visits climbing 51% year-over-year in that city, which suggests that many households in Hamilton are likely to turn to food bank services to meet their needs.
Beyond traditional conceptualizations of food banks as providers of emergency food assistance, other community food services also play an important role in decreasing food insecurity. The scope and objectives of food banks can vary by region and by country, and these organizations can include not only prepared meals and aliments for emergency food supply, but also shared spaces to connect in community gardens and community kitchens [@wakefield2013sweet]. However, the efficacy of these programs in reducing food insecurity differs by the type of service offered. For example, previous qualitative research in the Toronto region has questioned the capacity of community kitchens to improve the food security of low-income households due to their limited scale of operations, and un-subsidized kitchens were found to be particularly inaccessible to to families living in severe poverty [@tarasuk1999qualitative]. However, other food access options such as no-cost or low-cost meals provided through community meals or congregate dining play an important role in decreasing food insecurity. Research in Minnesota found that seniors experiencing food insecurity valued congregate dining for providing affordable meals and a space for social gathering [@oemichen2016investigation]. Furthermore, because seniors paid for the meal, there was no stigma attached to the use of these services compared to traditional food-purchasing assistance such as the Supplemental Nutrition Assistance Program.
While previous research has examined the characteristics of individuals and households accessing emergency and community food services, the locational or transportation accessibility aspect of food bank access is not well understood. A wealth of literature examining the food desert concept suggests that, in addition to socio-economic and demographic factors, location and transportation networks play a key role in a household's accessibility to healthy foods [@paez2010relative; @vanderlee2017food; @widener2018spatial]. For food banks specifically, previous qualitative research in Ontario by Smith-Carrier et al. [-@smith2017food] has noted that "transportation can be challenging, particularly if the food bank is situated in a remote location" (p. 32). Particularly, it appears that participants experience challenges with the "inordinate amount of time necessary to obtain food, and difficulties associated with transportation" (p. 39). Users of food banks, according to this research, rely on a variety of modes of transportation to access services. Consequently, the location of facilities matters; in the words of an interviewee: "I wish it [the food bank] was a little more centrally located. Because if I didn't have a bike I'd have to walk it all the way out there and back. I wonder about people who don't" (p. 39).
To offer greater insight into the role of transportation and location in food bank accessibility, this research examines how geographic accessibility to food banks and food services changed in Hamilton during the COVID-19 pandemic.
# Methods and Materials
## Methods
For the research in this paper we adopt the balanced floating catchment area approach of Paez et al. [-@paez2019demand]. This method for estimating accessibility is a form of the widely-used two-stage floating catchment area method [@radke2000spatial; @luo2003measures]. Floating catchment areas are used to estimate accessibility when there are potential congestion effects, and operate by calculating first the *demand* for spatially distributed services. The demand (usually the number of people who require a service) is used to calculate a level of service. In a second step, the level of service is allocated back to the population. Demand and level of service are allocated using some form of distance-decay to embody the geographical principle that, given a choice, people prefer to travel less than more when reaching destinations.
More formally, the first step of this method is as follows:
$$
L_j = \frac{S_j}{\sum_{i=1}^nP_iw_{ij}}
$$
\noindent where $S_j$ is the level of supply at location $j$, in simplest terms whether a service point is present (i.e., $S_j=1$) or not (i.e., $S_j=0$); $P_i$ is the population at location $i$ that demands the service; and $w_{ij}$ is a weight, typically a function of the distance between locations $i$ and $j$. $L_j$ is the level of service at location $j$ and it is the inverse of the number of people that need to be serviced.
The second step in this process is then summing the level of service that each population unit can reach, according to the distance-decay weight:
$$
A_i = \sum_{j=1}^JL_jw_{ji}
$$
\noindent where $A_i$ is the accessibility to the service, which is in the same units as the level of service: as the inverse of the population being serviced. When the population being serviced is low accessibility is high (i.e., there is little competition for the service), and viceversa.
Floating catchment area methods are prone to overestimation of the population and the level of service due to multiple-counting. The population at $P_i$ is allocated to *every* service point $j$ for which $w_{ij}>0$. Similarly, the level of service at $LOS_j$ is allocated to *every* population point for which $w_{ji}>0$. This inflation effect has been known for several years, and several modifications have been proposed to mitigate it [e.g., @wan2012three; @delamater2013spatial]. A definitive solution to this issue was presented by Paez et al. [-@paez2019demand]. In order to avoid the multiple-counting in the summations, the population and the level of service need to be allocated *proportionally*. This is achieved by standardizing the weights as follows:
$$
w_{ij}^i = \frac{w_{ij}}{\sum_{i=1}^nw_{ij}}
$$
\noindent and:
$$
w_{ij}^j = \frac{w_{ij}}{\sum_{j=1}^Jw_{ij}}
$$
The standardized weights satisfy the following conditions:
$$
\sum_{i=1}^nw_{ij}^i=1
$$
\noindent and:
$$
\sum_{j=1}^Jw_{ij}^j=1
$$
Since the population is allocated proportionally, its value is preserved:
$$
\sum_{i=1}^nP_iw_{ij}^i=P_i
$$
\noindent as is the level of service:
$$
\sum_{j=1}^JL_jw_{ij}^j=L_j
$$
## Study Area
With a population of around 540,000, the City of Hamilton is the fourth largest city in Ontario. It has historically been home to major manufacturing industries but de-industrialization that has occurred over the past several decades has led Hamilton to become one of the most highly divided cities in Ontario, with a significant proportion of its residents living at or below Canada's poverty level [@deluca2012code; @jakar2019turning; @latham2007determinants]. The Hamilton Community Foundation [@hcf2018] reported that based on the Low-Income Cut-Off, Hamilton recorded a poverty rate of 16.7% in 2016, which was well above the average rate of Ontario (13.7%) and the average national rate (12.8%). According to data from Hamilton Food Share [@hfs2019], approximately 23,000 individuals accessed food banks in the city in March of 2019. Within this total is 9,125 visits by children (minors up to 18 years old), up from 8,278 the year before. Feed Ontario, the province's largest collective of hunger-relief organizations, found that on a per-capita basis, the level of need in the inner core of central Hamilton was second highest in Ontario [@feedontario2019].
Geographically, the "old" City of Hamilton was amalgamated with several of its surrounding municipalities in 2001, with the city now featuring a mix of urban, suburban, exurban, and rural areas. Lower-cost housing proximate to the city's industrial north end has traditionally attracted immigrants and less-affluent residents compared to the city's wealthier suburbs. However, the decentralization of population from the inner core has led to challenges in transit connectivity to amenities and services and the proportion of auto users compared to transit users remains very high [@behan2008smart; @topalovic2012light]. In addition, the city is separated geographically by the Niagara Escarpment. With sections of rocky cliff that approach 100m in height, the escarpment presents a significant challenge for promoting active travel and transport connections between "mountain" and "lower city" neighbourhoods. Taken together, the high level of food need, population locations, and transportation network characteristics combine to inform spatial accessibility to food banks and food services in the city.
## Data
Data have been prepared for sharing in the form of an open data product [see @arribas2021open] available in a [public repository](https://github.com/paezha/Accessibility-Food-Banks-Hamilton). The contents of the data package are described next.
### Statistics Canada
Population and income statistics for 2016 were retrieved at the level of Dissemination Areas (DAs) using the package `cancensus` [@vonBergmann2021cancensus]. DAs are the smallest publicly available census geography in Canada. Income data corresponds to the count of households by different total income groupings.
### Origins: Residential parcels
We converted all recorded residential land parcels in the City of Hamilton to points on the road network. Each point includes information about the number of residential units in the parcel. Next, we define low-income households as those having a total income of less than CAD40,000, which is approximately the mid-point of the low income cut-off (LICOs) for families in Canadian cities with populations greater than 500,000 in 2016, to match other Census data [@statisticscanada2020licos]. We then "populate" each residential unit with the probability of being a low-income household based on the counts of households by income groups in the DA in which the parcel is located. While this method assumes a constant probability of low-income household status for all residential units in a DA, the parcel-level analysis affords a high level of spatial disaggregation for the accessibility analysis.
### Destinations: Food Banks and Food Service Locations
The locations of emergency and community food services were obtained from the Hamilton Public Library's Food Access Guide [@hpl2021]. The guide was updated in April of 2021 to indicate any change affected on the services due to the pandemic. This includes modified business hours, a need to make reservations before frequenting, and locations that have completely shut down in consequence. Table 1 defines each service type and the number of locations pre- and during the COVID-19 pandemic. While some food bank services have a specific target population, such as prioritizing families with young children aged between 0 and 3 or accepting only those providing proof of low-income status through housing and utility statements, all the food services indicated below are designed to accommodate those in need of food at zero to low cost. With our focus on food banks and food services that offer free or low-cost meals at particular locations, we first removed services such as Meals on Wheels and other food access services such as food box, community kitchens, student nutrition programs, and shopping and transportation. With some providers offering different food services at the same location (e.g. food bank with free and community meal services), and some of these services closing after the onset of the COVID-19 pandemic, we opted to geocode based on the service type. On the other hand, two free meal services held on different days at the same location were collapsed into a single service point for the accessibility analysis. Additional details on the operations of individual facilities is not publicly available and with the changes in operations it proved unfeasible to collect it. For this reason, the analysis to follow is of accessibility to the location of food banks and services, but not to specific services (e.g., breakfasts vs. food boxes).
```{r table-food-bank-info, echo=FALSE, results='asis'}
foodbank_table %>% kable("html",
booktabs = TRUE,
align = ("cccccc"),
col.names = c("Type",
"Description",
"Locations Pre-COVID",
"Locations During COVID",
"Additional Notes"),
caption = "\\label{tab:food-bank-info}foodbank and Food Service Information.",
escape = FALSE) %>%
kable_styling(latex_options = c("striped", "scale_down")) %>%
column_spec(2, width = "15em") %>%
column_spec(5, width = "15em")
```
### Routing and travel time tables
Travel time tables for three modes (car, transit, walking) were computed using the parcels as the origins and the locations of the community and emergency food service locations as the destinations. For routing, the package `r5r` [@pereira2021r5r] was used with a network extract for the City of Hamilton from OpenStreetMaps and the General Transit Feed Specification (GTFS) files for the Hamilton Street Railway, the local transit operator, as well as for Burlington Transit, which operates some service in the city. For transit routing purposes we used maximum travel time values of 300 min and a 2,000 m cap on walking distance: any destination that exceeded these thresholds was ignored. The departure time used for routing was 8:00AM on March 30, 2021 to reflect transit service around the morning service peak on a typical Tuesday.
### Transportation Tomorrow Survey
We used the Data Retrieval System of the Transportation Tomorrow Survey (TTS)\footnote{\url{http://dmg.utoronto.ca/}} to download cross-tabulations of: 1) primary mode of travel per trip by income by place of residence; and 2) age by income by place of residence. These data are from the 2016 Survey (the most recent available). The data are geocoded at the level of Traffic Analysis Zones (TAZ) using the most recent zoning system from 2006 and expansion factors are applied to weight the trips . Each parcel point is populated with the proportion of trips by three modes of travel: car (as driver or passenger), transit, and walk.
### Expected Travel Times
Once we obtained travel time tables with population (number of households) and proportion of trips by mode, we calculated the expected travel time $ett$ from each parcel $i$ to a food bank or food service location $j$ as follows:
$$
ett_{ij} = p^c_i\cdot tt^c_{ij} + p^t_i\cdot tt^t_{ij} + p^w_i\cdot tt^w_{ij}
$$
\noindent where $p^k_i$ is the proportion of trips by mode $k$ in the TAZ of parcel $i$, and $tt^k_{ij}$ is the travel time from parcel $i$ to the food bank. In other words, the expected travel time reflects the weighted average of travel times to the food bank, with the weights given by the expected modal split of trips made by low-income households in the TAZ per the TTS data.
# Results and Discussion
```{r accessibility-threshold-sensitivity, include=FALSE}
## Analysis
# Testing different thresholds to check how accessibility changes. Here, the thresholds are varied from 2 min to 30 min in 2 min step increments
threshold_seq <- seq(from = 2, to = 30, by = 1)
# Initialize a data frame to store results
accessibility_test <- data.frame(threshold = threshold_seq,
accessibility = numeric(length(threshold_seq)))
# Calculate the system-wide accessibility according to each threshold
for(i in 1:length(threshold_seq)){
results_test <- ttm %>%
transmute(UID, OBJECTID, travel_time = e_travel_time, population = income_less40k, supply = 1) %>%
b2sfca(threshold = i )
accessibility_test$accessibility[i] <- sum(results_test$accessibility$accessibility)
}
```
```{r results-pre-covid, include=FALSE}
## Analysis
# Calculate k-min accessibility pre-covid:
results_pre <- ttm %>%
#dplyr::filter(COVIDClose == "No") %>%
transmute(UID,
OBJECTID,
travel_time = e_travel_time,
population = income_less40k,
supply = 1) %>%
b2sfca(threshold = 15)
```
```{r results-during-covid, include=FALSE}
## Analysis
# Calculate k-min accessibility during covid:
results_covid <- ttm %>%
dplyr::filter(COVIDClose == "No") %>%
transmute(UID,
OBJECTID,
travel_time = e_travel_time,
population = income_less40k,
supply = 1) %>%
b2sfca(threshold = 15)
```
```{r, bind-accessibility-results, include=FALSE}
## Analysis
# Bind level of service results:
los <- rbind(data.frame(results_pre$los,
timing = "Pre-covid",
threshold = "30 min"),
data.frame(results_covid$los,
timing = "During covid",
threshold = "30 min")) %>%
mutate(timing = factor(timing,
levels = c("Pre-covid",
"During covid"),
ordered = TRUE))
# Bind accessibility results:
accessibility <- rbind(data.frame(results_pre$accessibility,
timing = "Pre-covid",
threshold = "30 min"),
data.frame(results_covid$accessibility,
timing = "During covid",
threshold = "30 min")) %>%
mutate(timing = factor(timing,
levels = c("Pre-covid",
"During covid"),
ordered = TRUE))
```
Figure \ref{fig:foodbanks} shows the location of food banks and services in the City of Hamilton and their status. Before the pandemic there were `r nrow(foodbank_locations)` of which `r nrow(foodbank_locations %>% filter(COVIDClose == "Yes"))` (`r round(nrow(foodbank_locations %>% filter(COVIDClose == "Yes"))/nrow(foodbank_locations) * 100, 2)`%) closed during the pandemic. As shown in the figure, food services tend to be predominantly located in the central parts of the city. This is not surprising: population density is high there, and it is also the part of the city where lower income households are more numerous in absolute and relative terms (see Figure \ref{fig:low-income-households}). Alas, this is also the part of the city where most of the closures during the pandemic happened.
```{r plot-location-foodbanks, echo=FALSE, fig.cap="\\label{fig:foodbanks}Location of food banks/services and operation status; the dotted box is an inset of the central part of the City of Hamilton"}
## Analysis
# Plot location of foodbanks
# Create a bounding box for an inset
inset_box <- st_bbox(c(xmin = -79.975,
xmax = -79.775,
ymax = 43.2,
ymin = 43.3),
crs = st_crs(4326)) %>%
st_as_sfc()
fb <- ggplot() +
geom_sf(data = hamilton_boundary,
fill = "lightgray") +
geom_sf(data = foodbank_locations,
aes(size = COVIDClose,
shape = COVIDClose)) +
geom_sf(data = inset_box,
linetype = "dotted",
color = "red",
fill = NA) +
scale_shape_manual(name = "Closed during COVID-19",
values = c("Yes" = 4, "No" = 1)) +
scale_size_manual(values = c("Yes" = 3, "No" = 2)) +
guides(size = "none") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90),
legend.position = "none")
fb_inset <- ggplot() +
geom_sf(data = hamilton_boundary %>%
st_transform(4326),
fill = "lightgray") +
geom_sf(data = foodbank_locations,
aes(size = COVIDClose,
shape = COVIDClose)) +
geom_sf(data = inset_box,
linetype = "dotted",
color = "red",
fill = NA) +
scale_shape_manual(name = "Closed during COVID-19",
values = c("Yes" = 4, "No" = 1)) +
scale_size_manual(values = c("Yes" = 3, "No" = 2)) +
xlim(-79.975, -79.775) +
ylim(43.2, 43.3) +
guides(size = "none") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90),
legend.position = "bottom")
fb / fb_inset
```
```{r plot-low-income-households, echo=FALSE, fig.cap="\\label{fig:low-income-households}Number and proportion of households with incomes less than CAD40,000."}
lih <- ggplot() +
geom_sf(data = data_da_2016,
aes(fill = income_less40k),
color = NA) +
geom_sf(data = hamilton_boundary,
fill = NA) +
geom_sf(data = inset_box,
linetype = "dotted",
color = "red",
fill = NA) +
scale_fill_viridis_c(name = "Number of households",
option = "A",
direction = -1,
breaks = c(200, 400, 600)) +
theme_minimal() +
theme(axis.text = element_blank(),
legend.position = "bottom")
p_lih <- ggplot() +
geom_sf(data = data_da_2016,
aes(fill = p_inc_less40k),
color = NA) +
geom_sf(data = hamilton_boundary,
fill = NA) +
geom_sf(data = inset_box,
linetype = "dotted",
color = "red",
fill = NA) +
scale_fill_viridis_c(name = "Proportion of households",
option = "A",
direction = -1,
breaks = c(0.25, 0.50, 0.75)) +
theme_minimal() +
theme(axis.text = element_blank(),
legend.position = "bottom")
lih / p_lih
```
To implement the accessibility calculations, we must select a distance-decay function. In this task we find limited support in the literature, which is mostly silent on the travel patterns of people who visit food banks and community food services. For this reason, we opt for a simple cumulative opportunities function as follows:
$$
w_{ij}=
\begin{cases}
1 & \text{ if } ett_{ij}\le \delta\\
0 & \text{ otherwise}
\end{cases}
$$
\noindent where $ett_{ij}$ is the multimodal expected travel time as described previously, and $\delta$ is a travel threshold. When the expected travel time exceeds this threshold, a facility is no longer considered accessible. Moreover, the weights are standardized for the balanced floating catchment area approach.
Figure \ref{fig:sensitivity-analysis} shows the results of conducting a sensitivity analysis of the system-wide accessibility as we vary the threshold (considering the situation before the pandemic). There is a clear pattern whereby more strict values of $\delta$ are associated with higher levels of system-wide accessibility: while increases in accessibility that result from decreases in the travel time window might seem counter-intuitive, this is a result of lower *congestion*, since fewer households are serviced and thus competition for the same resources is more limited. System-wide accessibility declines with higher values of $\delta$: as more households are serviced, congestion grows and the level of service declines, although this happens at a declining rate. We are not aware of any research that explains how long people are expected to travel for food banks, but we note that in developing countries, accessible sources of drinking water are those that can be reached in less than 30 minutes [round trip, see @world2019progress]. There is no reason why people in affluent countries should be expected to spend more time travelling for a basic necessity such as food. Accordingly, we adopt a 15-minute threshold for the analysis (representing a one-way trip). This threshold is also approximately where the rate of change in accessibility slows down.
```{r plot-results-sensitivity-analysis, out.width="60%", echo=FALSE, fig.cap="\\label{fig:sensitivity-analysis}Accessibility as a function of threshold"}
acc_sensitivity <- ggplot(accessibility_test,
aes(x = threshold, y = accessibility)) +
geom_line() +
ylab("Accessibility") +
xlab("Threshold (in min)") +
theme_minimal()
acc_sensitivity
```
Using the 15-minute threshold, we find that the system-wide accessibility was `r round(sum(results_pre$accessibility$accessibility), 3)` (food banks/service locations per low income household in the city) before COVID-19, but declined to `r round(sum(results_covid$accessibility$accessibility), 3)` during the pandemic. It is striking that although almost `r round((1 - nrow(foodbank_locations %>% filter(COVIDClose == "Yes"))/nrow(foodbank_locations)) * 100)`% of facilities remained in operation during the pandemic, there was a loss of accessibility greater than `r abs(round((sum(results_covid$accessibility$accessibility) - sum(results_pre$accessibility$accessibility))/sum(results_pre$accessibility$accessibility) * 100))`%, suggesting the location of emergency and community food services plays an important role in serving those in need.
```{r join-zonal-ids-to-accessibility-table, include=FALSE}
## Analysis
# Join zonal identifiers to accessibility results:
accessibility <- accessibility %>%
left_join(dwelling_network_points_2016 %>%
st_drop_geometry() %>%
dplyr::select(ID,
DAUID,
TAZUID,
children,
adults,
seniors),
by = c("UID" = "ID")) %>%
left_join(population_age_income %>%
st_drop_geometry() %>%
transmute(TAZUID),
by = "TAZUID")
```
```{r, join-geometry-to-level-of-service, include=FALSE}
## Analysis
# Join geometry:
los <- los %>%
left_join(foodbank_locations %>%
dplyr::select(ID),
by = c("OBJECTID" = "ID")) %>%
st_as_sf()
```
Turning to the location of individual facilities, the levels of service offered before and during the pandemic are shown in Figure \ref{fig:levels-of-service}. The level of service is functionally the inverse of the number of low-income households in the travel-mode weighted travel time catchment area of the facilities (this is because $S_j=1 \forall j$, i.e., each location represents a "capacity" of 1). Higher values mean that a facility is expected to service fewer households. Conversely, lower values indicate greater congestion.
The general pattern of the levels of service is similar before and during the pandemic, with lower values in the center of the city where low-income households exhibit multimodal trip patterns that favour proximate service locations. Three more peripheral facilities towards the south of the city have moderate levels of service, presumably because they are expected to service relatively suburban/exurban populations generally reliant on automobiles for travel. During the pandemic, however, the levels of service dropped, in some cases quite substantially. The pattern of the losses in level of service, moreover, is not uniform. The upper pane of Figure \ref{fig:levels-of-service-changes} shows that the peripheral facilities in the suburban/exurban parts of the city saw major declines during the pandemic as more urban locations closed and demand increased for the remaining locations. Further, the inset map shows that the levels of service also deteriorated in the central part of the city. However, the loss of level of service was not as large in the core (where most of the food banks/services are found), but instead was more marked in the inner ring around the core, where facilities may have faced greater demand from both central city and suburban populations after the closure of service locations during the pandemic.
```{r plot-levels-of-service, echo=FALSE, fig.cap="\\label{fig:levels-of-service}Levels of service at each facility pre-COVID-19 (top panel) and during COVID-19 (bottom panel)."}
## Analysis
# Plot levels of service before and during covid
# Pre-covid
los_pre <- ggplot() +
geom_sf(data = hamilton_boundary) +
geom_sf(data = los %>%
filter(timing == "Pre-covid"),
aes(color = los,
size = los),
alpha = 0.5) +
geom_sf(data = foodbank_locations,
aes(shape = COVIDClose)) +
scale_color_viridis_c(name = "Level of service \npre-COVID-19",
option = "A",
direction = -1,
breaks = c(0.0010,
0.0020,
0.0040,
0.0060,
0.0080),
labels = c("0.0010",
"0.0020",
"0.0040",
"0.0060",
"0.0080")) +
scale_shape_manual(values = c("Yes" = 4, "No" = 1)) +
guides(size = "none", shape = "none") +
theme_minimal() +
theme(axis.text = element_blank(),
legend.position = "right")
# During covid
los_covid <- ggplot() +
geom_sf(data = hamilton_boundary) +
geom_sf(data = los %>%
filter(timing == "During covid"),
aes(color = los,
size = los),
alpha = 0.5) +
geom_sf(data = foodbank_locations,
aes(shape = COVIDClose)) +
scale_color_viridis_c(name = "Level of service \nduring COVID-19",
option = "A",
direction = -1,
breaks = c(0.00100,
0.00200,
0.00400,
0.00600,
0.00800),
labels = c("0.0010",
"0.0020",
"0.0040",
"0.0060",
"0.0080")) +
scale_shape_manual(values = c("Yes" = 4, "No" = 1)) +
guides(size = "none", shape = "none") +
theme_minimal() +
theme(axis.text = element_blank(),
legend.position = "right")
los_pre / los_covid
```
```{r plot-levels-of-service-changes, echo=FALSE, fig.cap="\\label{fig:levels-of-service-changes}Changes in levels of service at each facility from pre-COVID-19 to during COVID-19."}
# This figure shows the places where the level of service deteriorated most (excluding the places that closed, where it vanished).
los_change <- los %>%
st_drop_geometry() %>%
pivot_wider(names_from = timing,
values_from = los,
values_fill = 0) %>%
filter(`During covid` > 0) %>%
mutate(los_d = `During covid` - `Pre-covid`) %>%
left_join(foodbank_locations %>%
transmute(OBJECTID = ID,
geometry),
by = "OBJECTID") %>%
st_as_sf() %>%
left_join(foodbank_locations %>% st_drop_geometry() %>% transmute(OBJECTID = ID, TYPE), by = "OBJECTID")
lc <- ggplot() +
geom_sf(data = hamilton_boundary) +
geom_sf(data = los_change,
aes(color = los_d,
size = los_d),
alpha = 0.3) +
geom_sf(data = foodbank_locations,
aes(shape = COVIDClose)) +
geom_sf(data = inset_box,
linetype = "dotted",
color = "red",
fill = NA) +
scale_color_viridis_c(name = "Change in level of service",
option = "A",
direction = 1,
breaks = c(-0.0001,
-0.0002,
-0.0004,
-0.0006,
-0.0008),
labels = c("-0.0001",
"-0.0002",
"-0.0004",
"-0.0006",
"-0.0008")) +
scale_size(trans = 'reverse') +
scale_shape_manual(values = c("Yes" = 4, "No" = 1)) +
guides(size = "none", shape = "none") +
theme_minimal() +
theme(axis.text = element_blank(),
legend.position = "none")
lc_inset <- ggplot() +
geom_sf(data = hamilton_boundary %>%
st_transform(4326)) +
geom_sf(data = los_change,
aes(color = los_d,
size = los_d),
alpha = 0.7) +
geom_sf(data = foodbank_locations,
aes(shape = COVIDClose)) +
geom_sf(data = inset_box,
linetype = "dotted",
color = "red",
fill = NA) +
scale_color_viridis_c(name = "Change in level of service",
option = "A",
direction = 1,
breaks = c(-0.0001,
-0.0002,
-0.0004,
-0.0006,
-0.0008),
labels = c("-0.0001",
"-0.0002",
"-0.0004",
"-0.0006",
"-0.0008")) +
scale_size(name = "Change in level of service",
trans = 'reverse',
breaks = c(-0.0001,
-0.0002,
-0.0004,
-0.0006,
-0.0008),
labels = c("-0.0001",
"-0.0002",
"-0.0004",
"-0.0006",
"-0.0008")) +
scale_shape_manual(values = c("Yes" = 4, "No" = 1)) +
xlim(-79.975, -79.775) +
ylim(43.2, 43.3) +
guides(color = guide_legend(title.position = "top"),
#size = FALSE,
shape = "none") +
theme_minimal() +
theme(axis.text = element_blank(),
legend.position = "bottom")
lc / lc_inset
```
To further elucidate this issue, we now turn to the results of the accessibility analysis. As with the level of service of individual facilities, the general pattern of accessibility before and during the pandemic is similar. Figure \ref{fig:accessibility} reveals that, compared with the outer rural zones, the more urban zones of the city generally exhibit higher accessibility to food banks and food service locations. However, the pattern is not particularly smooth - this is largely attributable to the weighting of travel times by mode of transportation according to the trip patterns of low-income household respondents captured by the TTS. For example, in zones where low-income households make a high proportion of trips by walking, access to food bank locations by walking is afforded a concomitantly high weight in our calculations of travel time compared to transit or car travel. From this, highly-accessible locations result from a mix of characteristics: low-income households in locations where travel options that align with zonal modal split are available to connect them to food bank locations with high levels of service within 15 minutes. This seems to track with the experience of some users of these services, as reported by Smith-Carrier et al. [-@smith2017food].
```{r aggregate-accessibility-by-taz, include=FALSE}
## Analysis
# Accessibility by TAZ:
accessibility_taz <- accessibility %>%
group_by(TAZUID,
timing) %>%
summarize(accessibility = sum(accessibility),
timing = first(timing),
.groups = "drop") %>%
left_join(population_age_income %>%
transmute(TAZUID,
children,
adults,
seniors),
by = "TAZUID") %>%
st_as_sf()
```
```{r plot-accessibility, echo=FALSE, fig.align = 'center', fig.cap="\\label{fig:accessibility}Accessibility by traffic analysis zone pre-COVID-19 (top panel) and during COVID-19 (bottom panel)."}
## Analysis
# Plot accessibility before and during covid:
acc_pre <- ggplot() +
geom_sf(data = hamilton_boundary,
fill = NA) +
geom_sf(data = accessibility_taz %>%
filter(timing == "Pre-covid"),
aes(fill = accessibility)) +
scale_fill_viridis_c(name = "Accessibility \npre-COVID-19",
option = "A",
direction = -1,
breaks = c(0.0030,
0.0024,
0.0018,
0.0012,
0.0006),
labels = c("0.0030",
"0.0024",
"0.0018",
"0.0012",
"0.0006")) +
theme_minimal() +
theme(axis.text = element_blank(),
legend.position = "right")
acc_covid <- ggplot() +
geom_sf(data = hamilton_boundary,
fill = NA) +
geom_sf(data = accessibility_taz %>%
filter(timing == "During covid"),
aes(fill = accessibility)) +
scale_fill_viridis_c(name = "Accessibility \nduring COVID-19",
option = "A",
direction = -1,
breaks = c(0.0024,
0.0018,
0.0012,
0.0006,
0.0001),
labels = c("0.0024",
"0.0018",
"0.0012",
"0.0006",
"0.0001")) +
theme_minimal() +
theme(axis.text = element_blank(),
legend.position = "right")
acc_pre / acc_covid
```
```{r accessibility-changes-by-taz, include=FALSE}
## Analysis
# Calculate accessibility change by TAZ:
accessibility_taz_change <- accessibility_taz %>%
st_drop_geometry() %>%
pivot_wider(names_from = timing,
values_from = accessibility) %>%
# Calculate changes in accessibility
mutate(acc_d = `During covid` - `Pre-covid`) %>%
# Join TAZ geometry
left_join(population_age_income %>%
transmute(TAZUID,
geometry),
by = "TAZUID") %>%
# Convert to simple features
st_as_sf()
```
We find that the accessibility landscape deteriorated substantially during the pandemic, with accessibility dropping on average by almost `r accessibility_taz_change %>% st_drop_geometry() %>% summarize(d = (.[[6]] - .[[5]])/.[[5]] * 100) %>% pull(d) %>% mean() %>% abs() %>% round()`%, but with large variations: some zones experienced changes in accessibility of only about `r accessibility_taz_change %>% st_drop_geometry() %>% summarize(d = (.[[6]] - .[[5]])/.[[5]] * 100) %>% pull(d) %>% max() %>% abs() %>% round()`%, whereas the most affected zone saw a loss of accessibility of almost `r accessibility_taz_change %>% st_drop_geometry() %>% summarize(d = (.[[6]] - .[[5]])/.[[5]] * 100) %>% pull(d) %>% min() %>% abs() %>% round()`%. Figure \ref{fig:accessibility-changes-with-local-i} shows the changes in accessibility. Every zone is worse off after the closure of facilities during the pandemic, but some parts of the city seem to have been particularly affected. To better highlight these changes, we used a local indicator of spatial autocorrelation [@anselin1995local] to explore the pattern of change in accessibility. Twenty-four TAZs are flagged as having significantly large losses of accessibility (at $p\le 0.10$, without correcting for multiple comparisons). Those zones are highlighted in the figure, where it can be seen that they form more or less compact neighborhoods. Remarkably, the largest significant drops in accessibility are not downtown, but located in two cases in the industrial north of the city, in one case in an inner suburb above the escarpment, and lastly in a more suburban/exurban region in the south-west.