Calculates spatial availability, an accessibility measured proposed by Soukhov et al. (2023) that takes into account competition effects. The accessibility levels that result from using this measure are proportional both to the demand in each origin and to the travel cost it takes to reach the destinations.
This function is generic over any kind of numeric travel cost, such as distance, time and money.
Usage
spatial_availability(
travel_matrix,
land_use_data,
opportunity,
travel_cost,
demand,
decay_function,
alpha = 1,
group_by = character(0),
fill_missing_ids = TRUE,
detailed_results = FALSE
)Arguments
- travel_matrix
A data frame. The travel matrix describing the costs (i.e. travel time, distance, monetary cost, etc.) between the origins and destinations in the study area. Must contain the columns
from_id,to_idand any others specified intravel_cost.- land_use_data
A data frame. The distribution of opportunities within the study area cells. Must contain the columns
idand any others specified inopportunity.- opportunity
A string. The name of the column in
land_use_datawith the number of opportunities/resources/services to be considered when calculating accessibility levels.- travel_cost
A string. The name of the column in
travel_matrixwith the travel cost between origins and destinations.- demand
A string. The name of the column in
land_use_datawith the number of people in each origin that will be considered potential competitors.- decay_function
A
fuctionthat converts travel cost into an impedance factor used to weight opportunities. This function should take anumericvector and also return anumericvector as output, with the same length as the input. For convenience, the package currently includes the following functions:decay_binary(),decay_exponential(),decay_power()anddecay_stepped(). See the documentation of each decay function for more details.- alpha
A
numeric. A parameter used to modulate the effect of demand by population. When less than 1, opportunities are allocated more rapidly to smaller centers relative to larger ones; values higher than 1 achieve the opposite effect.- group_by
A
charactervector. When notcharacter(0)(the default), indicates thetravel_matrixcolumns that should be used to group the accessibility estimates by. For example, iftravel_matrixincludes a departure time column, that specifies the departure time of each entry in the data frame, passing"departure_time"to this parameter results in accessibility estimates grouped by origin and by departure time.- fill_missing_ids
A
logical. When calculating grouped accessibility estimates (i.e. whenby_colis notNULL), some combinations of groups and origins may be missing. For example, if a single trip can depart from originAat 7:15am and reach destinationBwithin 55 minutes, but no trips departing fromAat 7:30am can be completed at all, this second combination will not be included in the output. WhenTRUE(the default), the function identifies which combinations would be left out and fills their respective accessibility values with 0, which incurs in a performance penalty.- detailed_results
A
logical. Whether to return spatial availability results aggregated by origin-destination pair (TRUE) or by origin (FALSE, the default). WhenTRUE, the output also includes the demand, impedance and combined balancing factors used to calculate spatial availability. Please note that the argumentfill_missing_idsdoes not affect the output whendetailed_resultsisTRUE.
Value
A data frame containing the accessibility estimates for each
origin/destination (depending if active is TRUE or FALSE) in the
travel matrix.
References
Soukhov A, P<U+00E1>ez A, Higgins CD, Mohamed M (2023). “Introducing Spatial Availability, a Singly-Constrained Measure of Competitive Accessibility.” PLOS ONE, 18(1), e0278468. ISSN 1932-6203, doi:10.1371/journal.pone.0278468 .
Examples
if (FALSE) { # identical(tolower(Sys.getenv("NOT_CRAN")), "true")
# the example below is based on Soukhov et al. (2023) paper
travel_matrix <- data.table::data.table(
from_id = rep(c("A", "B", "C"), each = 3),
to_id = as.character(rep(1:3, 3)),
travel_time = c(15, 30, 100, 30, 15, 100, 100, 100, 15)
)
land_use_data <- data.table::data.table(
id = c("A", "B", "C", "1", "2", "3"),
population = c(50000, 150000, 10000, 0, 0, 0),
jobs = c(0, 0, 0, 100000, 100000, 10000)
)
df <- spatial_availability(
travel_matrix,
land_use_data,
opportunity = "jobs",
travel_cost = "travel_time",
demand = "population",
decay_function = decay_exponential(decay_value = 0.1)
)
df
detailed_df <- spatial_availability(
travel_matrix,
land_use_data,
opportunity = "jobs",
travel_cost = "travel_time",
demand = "population",
decay_function = decay_exponential(decay_value = 0.1),
detailed_results = TRUE
)
detailed_df
}
