max_coverage
solves the binary optimisation problem known as the
"maximal covering location problem" as described by Church
(http://www.geo .ucsb.edu/~forest/G294download/MAX_COVER_RLC_CSR.pdf).
This package was implemented to make it easier to solve this problem in the
context of the research initially presented by Chan et al
(http://circ.ahajournals.org/content/127/17/1801.short) to identify ideal
locations to place AEDs.
max_coverage(existing_facility, proposed_facility, user, distance_cutoff, n_added, solver = "glpk")
existing_facility | data.frame containing the facilities that are already in existing, with columns names lat, and long. |
---|---|
proposed_facility | data.frame containing the facilities that are being proposed, with column names lat, and long. |
user | data.frame containing the users of the facilities, along with column names lat, and long. |
distance_cutoff | numeric indicating the distance cutoff (in metres) you are interested in. If a number is less than distance_cutoff, it will be 1, if it is greater than it, it will be 0. |
n_added | the maximum number of facilities to add. |
solver | character "glpk" (default) or "lpSolve". "gurobi" is currently in development, see https://github.com/njtierney/maxcovr/issues/25 |
dataframe of results
library(dplyr) # already existing locations york_selected <- york %>% filter(grade == "I") # proposed locations york_unselected <- york %>% filter(grade != "I") mc_result <- max_coverage(existing_facility = york_selected, proposed_facility = york_unselected, user = york_crime, distance_cutoff = 100, n_added = 20) mc_result#> #> ------------------------------------------- #> Model Fit: maxcovr fixed location model #> ------------------------------------------- #> model_used: max_coverage #> existing_facility: york_selected #> proposed_facility: york_unselected #> user: york_crime #> distance_cutoff: 100 #> n_added: 20 #> solver: lpSolve #> -------------------------------------------summary(mc_result)#> #> ------------------------------------------- #> Model Fit: maxcovr fixed location model #> ------------------------------------------- #> Distance Cutoff: 100m #> Facilities: #> Added: 20 #> Coverage (Previous): #> # Users: 540 (339) #> Proportion: 0.2977 (0.1869) #> Distance (m) to Facility (Previous): #> Avg: 886 (1400) #> SD: 986 (1597) #> -------------------------------------------# get the facilities chosen mc_result$facility_selected#> [[1]] #> # A tibble: 20 x 7 #> long lat object_id desig_id pref_ref name grade #> <dbl> <dbl> <int> <chr> <int> <chr> <chr> #> 1 -1.09 54.0 5978 DYO1383 462917 NA II #> 2 -1.08 54.0 5909 DYO1297 463072 NA II #> 3 -1.08 54.0 5872 DYO1244 463186 NA II #> 4 -1.08 54.0 5847 DYO1216 463242 NA II #> 5 -1.12 54.0 5759 DYO1108 463434 FORMER JUNIOR SCHOOL BUILDING … II #> 6 -1.08 54.0 5748 DYO1096 463469 NA II #> 7 -1.08 54.0 5745 DYO1093 463465 NA II #> 8 -1.08 54.0 5739 DYO1086 463457 CHURCH OF ST GEORGE AND ATTACH… II #> 9 -1.10 54.0 5642 DYO960 463695 NA II #> 10 -1.09 53.9 5606 DYO920 463771 PRESS STAND AT YORK RACECOURSE II #> 11 -1.06 54.0 5592 DYO903 463788 NA II #> 12 -1.07 54.0 5588 DYO899 463782 NA II #> 13 -1.08 54.0 5529 DYO829 463938 CHURCH OF ST THOMAS II #> 14 -1.08 54.0 5454 DYO705 464133 NUMBERS 45-51 (ODD) AND ATTACH… II #> 15 -1.03 54.0 5373 DYO1644 NA War Memorial II #> 16 -1.12 54.0 5349 DYO572 464451 POPPLETON ROAD SCHOOL II #> 17 -1.08 54.0 5328 DYO544 464508 WOODS MILL II #> 18 -1.00 54.0 3215 DYO1581 491367 STOCKTON GRANGE AND ATTACHED O… II #> 19 -1.08 54.0 3213 DYO1580 490659 NEW CHAPEL AT ST JOHN'S COLLEGE II #> 20 -1.08 54.0 4803 DYO1734 NA The Swan Public House II #># get the users affected mc_result$user_affected#> [[1]] #> # A tibble: 201 x 16 #> user_id user_chosen facility_id distance category persistent_id date lat #> <dbl> <int> <dbl> <dbl> <chr> <chr> <chr> <dbl> #> 1 1 1 66 166. anti-so… 62299914865f… 2016… 54.0 #> 2 5 1 25 536. anti-so… 6139f131b724… 2016… 54.0 #> 3 13 1 6 2334. anti-so… c2aac5cdf98e… 2016… 54.0 #> 4 14 1 2 12687. anti-so… c0908b075c68… 2016… 54.1 #> 5 15 1 24 620. anti-so… 40c8c061c48b… 2016… 54.0 #> 6 21 1 60 1286. anti-so… 45ce21c8785e… 2016… 53.9 #> 7 23 1 NA NA NA NA NA NA #> 8 24 1 NA NA NA NA NA NA #> 9 27 1 NA NA NA NA NA NA #> 10 29 1 2 375. anti-so… db6cacd76d97… 2016… 54.0 #> # … with 191 more rows, and 8 more variables: long <dbl>, street_id <chr>, #> # street_name <chr>, context <chr>, id <chr>, location_type <chr>, #> # location_subtype <chr>, outcome_status <chr> #># get the summaries mc_result$summary#> [[1]] #> # A tibble: 2 x 8 #> n_added distance_within n_cov pct_cov n_not_cov pct_not_cov dist_avg dist_sd #> <dbl> <dbl> <int> <dbl> <int> <dbl> <dbl> <dbl> #> 1 0 100 339 0.187 1475 0.813 1400. 1597. #> 2 20 100 540 0.298 1274 0.702 886. 986. #>