Signature
R_X = S_X / ((d_1X <= d_0) * P_1 + (d_2X <= d_0) * P_2 + (d_3X <= d_0) * P_3); R_Y = S_Y / ((d_1Y <= d_0) * P_1 + (d_2Y <= d_0) * P_2 + (d_3Y <= d_0) * P_3); A_1 = (d_1X <= d_0) * R_X + (d_1Y <= d_0) * R_Y; A_2 = (d_2X <= d_0) * R_X + (d_2Y <= d_0) * R_Y; A_3 = (d_3X <= d_0) * R_X + (d_3Y <= d_0) * R_Y
| Inputs | Definition | Unit |
|---|---|---|
S_X | Capacity of practice X, its full-time-equivalent GPs; zero or above | GPs |
d_1X | Travel time between neighbourhood 1 and practice X, in the same unit as d_0 | minutes |
d_0 | Threshold travel time that defines every catchment, the same for both practices and both steps; above zero | minutes |
P_1 | Resident population of neighbourhood 1 (A in the article); zero or above | people |
d_2X | Travel time between neighbourhood 2 and practice X, in the same unit as d_0 | minutes |
P_2 | Resident population of neighbourhood 2 (B in the article); zero or above | people |
d_3X | Travel time between neighbourhood 3 and practice X, in the same unit as d_0 | minutes |
P_3 | Resident population of neighbourhood 3 (C in the article); zero or above | people |
S_Y | Capacity of practice Y, its full-time-equivalent GPs; zero or above | GPs |
d_1Y | Travel time between neighbourhood 1 and practice Y, in the same unit as d_0 | minutes |
d_2Y | Travel time between neighbourhood 2 and practice Y, in the same unit as d_0 | minutes |
d_3Y | Travel time between neighbourhood 3 and practice Y, in the same unit as d_0 | minutes |
R_X | GPs at practice X divided by the population of the neighbourhoods within d_0 of it, an intermediate output | GPs per person |
|---|---|---|
R_Y | GPs at practice Y divided by the population of the neighbourhoods within d_0 of it, an intermediate output | GPs per person |
A_1 | Accessibility of neighbourhood 1, the sum of the supply ratios of the practices within d_0 of it | GPs per person |
A_2 | Accessibility of neighbourhood 2, the sum of the supply ratios of the practices within d_0 of it | GPs per person |
A_3 | Accessibility of neighbourhood 3, the sum of the supply ratios of the practices within d_0 of it | GPs per person |
Function
Spatial accessibility index function from provider capacity, population and travel times
Maps the capacity of each provider location, the population of each residential location and the travel time or distance between every pair to an accessibility score for each residential location, in providers per head of population. Wang 2012 writes the family in one form, A_i equal to the sum over providers of S_j f(d_ij) divided by the sum over population locations of P_k f(d_kj), with f a distance decay function, so each provider's capacity is shared among the people who can reach it and each resident collects the shares within reach. HE-FM-ACCS-001 is the two-step floating catchment area (2SFCA) method of Luo and Wang, in which f is 1 within a threshold travel time and 0 beyond it, and HE-FM-ACCS-002 is the gravity form with a population demand adjustment, in which f is a negative power of travel time; Luo and Wang show that the first is a special case of the second. Both are written out for the article's two practices and three neighbourhoods, and HE-CF-ACCS-001 and HE-CF-ACCS-002 run them for any number of sites. A count of providers over the residents of one bordered area is a plain ratio of the form of HE-FM-ACR-001 and is not drafted; the time cost borne by residents who travel further is HE-FM-PTC-001, and equity of use relative to need is HE-FN-HEQ-001. Notation follows the Accessibility article.
Computational function
Computational function for two-step floating catchment area scores, mean and spread for any number of sites
Takes the GPs or other capacity of any number of provider locations, the populations of any number of residential locations, the matrix of travel times between them and a threshold, and returns each provider's supply ratio, each location's 2SFCA score, the population-weighted mean of the scores and their population-weighted variance, scaled to a stated number of people. It applies HE-FM-ACCS-001 to every provider and location at once, with SUMPRODUCT over a travel-time block in Excel and matrix operations in R, so its inputs are a matrix and two lists rather than the formula's named scalars. The mean is the check that the scores conserve total supply, and the variance, the population-weighted second moment that HE-VR-HINQ-007 takes over ranks, here taken over scores, is Wang 2012's equation 4, the inequality objective of Wang and Tang, divided by the total population (derived). The calculator line repeats the chain for the article's two practices and three neighbourhoods and adds the mean and variance; any other size is in the Excel, R and Python code.
Inputs and outputs:
S_X,S_Yare the GPs at the two practices;P_1toP_3the neighbourhood populations;d_1Xtod_3Ythe travel times in minutes;d_0the threshold in minutes;kthe number of people the results are scaled to (10,000 in the article);R_X,R_YandA_1toA_3are as in HE-FM-ACCS-001, in GPs per person;Mis the population-weighted mean score per k people andVthe population-weighted variance per k people, squared. In the codeSis a vector of n capacities,Pa vector of m populations andDan m by n matrix of travel times, rows for residential locations and columns for providers.Assumption: The assumptions of HE-FM-ACCS-001 hold (HE-AS-ACCS-001 to HE-AS-ACCS-003). A provider with nobody within the threshold has no defined ratio; the R and Python code return NA or nan for it and leave it out of every score, and the Excel guard sets its ratio to 0, so in every version its capacity drops out and the supply check falls short by that capacity. The total population must be above zero.
Worked example (Article's base case at 30 minutes): The scores are 2.667, 4.205 and 1.538 per 10,000, the mean 3.333 and the variance 1.083 (GPs per 10,000, squared), as in the article.
S_X = 8; S_Y = 4; P_1 = 10000; P_2 = 20000; P_3 = 6000; d_1X = 10; d_1Y = 40; d_2X = 20; d_2Y = 25; d_3X = 45; d_3Y = 15; d_0 = 30; k = 10000; R_X = 0.000266667; R_Y = 0.000153846; A_1 = 0.000266667; A_2 = 0.000420513; A_3 = 0.000153846; M = 3.3333; V = 1.0826Worked example (Article's consolidation at practice X): With all 12 GPs at X the mean stays at 3.333 and the variance rises to 2.222, as in the article.
S_X = 12; S_Y = 0; P_1 = 10000; P_2 = 20000; P_3 = 6000; d_1X = 10; d_1Y = 40; d_2X = 20; d_2Y = 25; d_3X = 45; d_3Y = 15; d_0 = 30; k = 10000; R_X = 0.0004; R_Y = 0; A_1 = 0.0004; A_2 = 0.0004; A_3 = 0; M = 3.3333; V = 2.2222Excel: Name a block of m rows and n columns of travel times TravelTimes, a column of m populations PopColumn, a row of n capacities SupplyRow and the threshold ThresholdCF. In a row of n cells named CatchPopRow enter
=SUMPRODUCT((INDEX(TravelTimes,0,COLUMNS($A$1:A$1))<=ThresholdCF)*PopColumn)and fill right; in a row of n cells named RatioRow enter=IF(INDEX(CatchPopRow,COLUMNS($A$1:A$1))>0,INDEX(SupplyRow,COLUMNS($A$1:A$1))/INDEX(CatchPopRow,COLUMNS($A$1:A$1)),0)and fill right. In a column of m cells named AccessColumn enter=SUMPRODUCT((INDEX(TravelTimes,ROWS($A$1:A1),0)<=ThresholdCF)*RatioRow)and fill down. A cell named MeanAccessCF holds=SUMPRODUCT(PopColumn,AccessColumn)/SUM(PopColumn)and a cell named VarAccessCF holds=SUMPRODUCT(PopColumn,(AccessColumn-MeanAccessCF)^2)/SUM(PopColumn), both in GPs per person; multiply the mean by 10,000 and the variance by 10,000 squared for the article's units. INDEX with a row or column argument of 0 returns a whole column or row, and SUMPRODUCT evaluates the comparisons as arrays without array entry, so the formulas work in every Excel version.R:
fca2 <- function(S, P, D, d0, k = 10000) { D <- matrix(D, nrow = length(P)); W <- (D <= d0) * 1; dem <- colSums(W * P); R <- ifelse(dem > 0, S / dem, NA); A <- as.vector(W %*% ifelse(is.na(R), 0, R)); M <- sum(P * A) / sum(P); list(R = k * R, A = k * A, mean = k * M, var = k^2 * sum(P * (A-M)^2) / sum(P)) }Called asfca2(c(8, 4), c(10000, 20000, 6000), rbind(c(10, 40), c(20, 25), c(45, 15)), 30)it returns R of 2.667 and 1.538, A of 2.667, 4.205 and 1.538, mean 3.333 and variance 1.083; withc(12, 0)the variance is 2.222. Thematrixline keeps one row or one column of times a matrix.Python:
def fca2(S, P, D, d0, k=10000): n, m = len(S), len(P); dem = [sum(P[i] for i in range(m) if D[i][j] <= d0) for j in range(n)]; R = [S[j] / dem[j] if dem[j] > 0 else float('nan') for j in range(n)]; A = [sum(R[j] for j in range(n) if D[i][j] <= d0 and dem[j] > 0) for i in range(m)]; T = sum(P); M = sum(p * a for p, a in zip(P, A)) / T; return [k * r for r in R], [k * a for a in A], k * M, k * k * sum(p * (a-M) ** 2 for p, a in zip(P, A)) / TStandard library only;fca2([8, 4], [10000, 20000, 6000], [[10, 40], [20, 25], [45, 15]], 30)returns the same values as the R code, and a total population of 0 raises ZeroDivisionError, where the R code returns NaN for the mean and variance.Test (Supply conserved over any number of sites): The population-weighted sum of AccessColumn equals the total of SupplyRow when every provider has someone within the threshold. Expected result TRUE. With the article's inputs, a doubled AccessColumn gives 24 against 12, a halved one 6, and a RatioRow divided by each provider's own neighbourhood only 41.33, all FALSE. Excel check
=ABS(SUMPRODUCT(PopColumn,AccessColumn)-SUM(SupplyRow))<1E-9Test (Article's consolidation variance): With SupplyRow 12 and 0 and the article's populations and times, VarAccessCF times 10,000 squared is 2.2222 within 0.0001. Expected result TRUE. The base inputs give 1.0826 and FALSE, an unweighted variance of the three scores gives 3.5556 and FALSE, and doubling (4.4444) or halving (1.1111) the cell also gives FALSE. Excel check
=ABS(VarAccessCF*10000^2-2.2222)<0.0001Common error (Unweighted mean of the scores): The simple mean of the article's three scores is 2.803 per 10,000 against the population-weighted 3.333 (computed here), so the supply check fails and a neighbourhood of 6,000 people counts as much as one of 20,000.
Common error (Provider location with nobody in reach): A provider whose catchment is empty gives a zero denominator; without the IF guard Excel returns #DIV/0! in RatioRow, and SUMPRODUCT then returns #DIV/0! for every location, including those that cannot reach that provider.
Source: Luo W, Wang F. Measures of spatial accessibility to healthcare in a GIS environment: synthesis and a case study in Chicago region. Environment and Planning B: Planning and Design. 2003;30(6):865-884. Author manuscript read (HHS Author Manuscripts, PMC8238135); the published version, doi 10.1068/b29120, not seen. Section The Evolvement of Floating Catchment Area Methods, equations (3) and (4), and section The Gravity-Based Method and a Synthesis on the population-weighted average. Wang F. Measurement, optimization, and impact of health care accessibility: a methodological review. Annals of the Association of American Geographers. 2012;102(5):1104-1112. Author manuscript read (NIHPA Author Manuscripts, PMC3547595); the published version, doi 10.1080/00045608.2012.657146, not seen. Section Optimization Models in Health Care Accessibility, the weighted mean property and equation (4), the Wang and Tang objective of minimising the population-weighted sum of squared gaps between each score and the ratio of total supply to total demand.
R_X = S_X / ((d_1X <= d_0) * P_1 + (d_2X <= d_0) * P_2 + (d_3X <= d_0) * P_3); R_Y = S_Y / ((d_1Y <= d_0) * P_1 + (d_2Y <= d_0) * P_2 + (d_3Y <= d_0) * P_3); A_1 = (d_1X <= d_0) * R_X + (d_1Y <= d_0) * R_Y; A_2 = (d_2X <= d_0) * R_X + (d_2Y <= d_0) * R_Y; A_3 = (d_3X <= d_0) * R_X + (d_3Y <= d_0) * R_Y; M = k * (P_1 * A_1 + P_2 * A_2 + P_3 * A_3) / (P_1 + P_2 + P_3); V = (P_1 * (k * A_1 - M)^2 + P_2 * (k * A_2 - M)^2 + P_3 * (k * A_3 - M)^2) / (P_1 + P_2 + P_3)
Try this function
Implementations
Excel
Two-step floating catchment area scores for two practices and three neighbourhoods from named cells
With the GPs in cells named GPsPracticeX and GPsPracticeY, the populations in PopNbhdA, PopNbhdB and PopNbhdC, the travel times in TimeAtoX, TimeAtoY, TimeBtoX, TimeBtoY, TimeCtoX and TimeCtoY and the threshold in ThresholdMinutes, the five formulas return the supply ratios in cells named RatioPracticeX and RatioPracticeY and the scores in AccessNbhdA, AccessNbhdB and AccessNbhdC, in GPs per person; multiplying by 10,000 gives the article's units. Excel treats TRUE as 1 and FALSE as 0 in multiplication, so each comparison works as the catchment indicator. For the article's inputs they return 0.000266667, 0.000153846, 0.000266667, 0.000420513 and 0.000153846. A blank travel-time cell counts as 0 minutes in the comparison and so places that neighbourhood inside the catchment; with TimeCtoX blank, C joins X's catchment and B's score falls from 4.205 to 3.761 per 10,000 (checked in Excel).
=GPsPracticeX/((TimeAtoX<=ThresholdMinutes)*PopNbhdA+(TimeBtoX<=ThresholdMinutes)*PopNbhdB+(TimeCtoX<=ThresholdMinutes)*PopNbhdC); =GPsPracticeY/((TimeAtoY<=ThresholdMinutes)*PopNbhdA+(TimeBtoY<=ThresholdMinutes)*PopNbhdB+(TimeCtoY<=ThresholdMinutes)*PopNbhdC); =(TimeAtoX<=ThresholdMinutes)*RatioPracticeX+(TimeAtoY<=ThresholdMinutes)*RatioPracticeY; =(TimeBtoX<=ThresholdMinutes)*RatioPracticeX+(TimeBtoY<=ThresholdMinutes)*RatioPracticeY; =(TimeCtoX<=ThresholdMinutes)*RatioPracticeX+(TimeCtoY<=ThresholdMinutes)*RatioPracticeY
Assumptions
Catchment membership by a hard travel-time threshold in the two-step floating catchment area
Every practice within d_0 counts fully and every practice beyond it counts not at all, whatever the travel time inside the threshold, the dichotomous treatment that Wang 2012 calls the method's major limitation and that Luo and Wang describe as an artificial line between accessible and inaccessible physicians. A time exactly equal to d_0 counts as inside, as in the set {d_ij <= d_0} of the published formula. The threshold is a choice; Luo and Wang mapped Chicago at 30 minutes and tested thresholds of 20 to 50 minutes.
One travel-time matrix for both steps and residents placed at one point per neighbourhood
The same travel time between a neighbourhood and a practice decides whose population the practice serves in step one and which practices the neighbourhood reaches in step two; Luo and Wang compute the matrix once and use it twice. Each neighbourhood's residents and each practice's GPs sit at one point, as Luo and Wang represent whole census tracts or ZIP code areas by their centroids. Every practice needs someone within d_0, or its supply ratio has a zero denominator (derived).
Potential access with equal weight for every resident in the two-step floating catchment area
The score measures the opportunity to reach care, not its use, and every resident counts once in each denominator, so need per head and travel options are taken as the same everywhere (derived). Guagliardo reports that Luo and Wang planned to add an adjustment for differences in transport options between areas, and Wang 2012 separates this place accessibility from the accessibility of individuals.
Worked examples
Article's two practices and three neighbourhoods at a 30-minute threshold
In the article's illustrative example neighbourhood A (10,000 people) contains practice X with 8 GPs, C (6,000) contains practice Y with 4 and B (20,000) has no practice; travel times to X and Y are 10 and 40 minutes for A, 20 and 25 for B and 45 and 15 for C. X's catchment holds A and B, so R_X is 8 / 30,000, or 2.667 per 10,000, and Y's holds B and C, so R_Y is 4 / 26,000, or 1.538 per 10,000. A scores 2.667, B 4.205 and C 1.538 per 10,000, as in the article.
S_X = 8; S_Y = 4; P_1 = 10000; P_2 = 20000; P_3 = 6000; d_1X = 10; d_1Y = 40; d_2X = 20; d_2Y = 25; d_3X = 45; d_3Y = 15; d_0 = 30; R_X = 0.000266667; R_Y = 0.000153846; A_1 = 0.000266667; A_2 = 0.000420513; A_3 = 0.000153846
Article's consolidation with all 12 GPs at practice X
If practice Y closes and its 4 GPs move to X, R_X is 12 / 30,000, or 4.0 per 10,000, and R_Y is 0. A and B score 4.0 per 10,000 and C scores 0 because X is 45 minutes away, as in the article. The population-weighted mean stays at 3.333 per 10,000 while the spread widens, which HE-CF-ACCS-001 measures.
S_X = 12; S_Y = 0; P_1 = 10000; P_2 = 20000; P_3 = 6000; d_1X = 10; d_1Y = 40; d_2X = 20; d_2Y = 25; d_3X = 45; d_3Y = 15; d_0 = 30; R_X = 0.0004; R_Y = 0; A_1 = 0.0004; A_2 = 0.0004; A_3 = 0
Two-step floating catchment area with a threshold that every travel time meets
With an illustrative threshold of 60 minutes every neighbourhood reaches both practices, so each catchment holds all 36,000 people and every neighbourhood scores 12 / 36,000, or 3.333 per 10,000, the GPs per head of the whole area (derived). It is the limit of Luo and Wang's finding that a larger threshold gives a smaller variance of the scores.
S_X = 8; S_Y = 4; P_1 = 10000; P_2 = 20000; P_3 = 6000; d_1X = 10; d_1Y = 40; d_2X = 20; d_2Y = 25; d_3X = 45; d_3Y = 15; d_0 = 60; R_X = 0.000222222; R_Y = 0.000111111; A_1 = 0.000333333; A_2 = 0.000333333; A_3 = 0.000333333
Common errors
Bordered GP-to-population ratios read as two-step floating catchment accessibility
Counting GPs inside each neighbourhood gives A 8.0, B 0 and C 6.667 per 10,000 in the article's example, which ranks B, with no practice, as worst served. The 2SFCA ranks B best at 4.205 per 10,000, because its residents reach both practices within 30 minutes, and lowers A and C because their practices also serve B. The bordered figure, a plain quotient of the form of HE-FM-ACR-001, ignores patients who cross area borders, the weakness Guagliardo describes for supply ratios.
Each practice's GPs divided by its own neighbourhood only in step one
Dividing X's 8 GPs by A's 10,000 people and Y's 4 GPs by C's 6,000 gives ratios of 8.0 and 6.667 per 10,000, and B, which reaches both, then scores 14.667. The scores weighted by population add up to 41.33 GPs where there are 12, a mean of 11.481 per 10,000 instead of 3.333 (computed here), because GPs who also serve B are counted again. The step one denominator is every population within d_0 of the practice.
Zero two-step floating catchment area score read as residents getting no care
After the article's consolidation neighbourhood C scores 0 because practice X is 45 minutes away, yet its residents may still travel there. The article puts the extra travel at 60 minutes per visit, GBP 15 at an illustrative GBP 15 an hour and GBP 360,000 a year over 24,000 visits, the patient time cost of HE-FM-PTC-001. A zero reflects the hard threshold, and Guagliardo notes that a study of spatial potential could not demonstrate or disprove a relationship with use.
Single threshold travel time treated as settled in the two-step floating catchment area
Moving the threshold to an illustrative 20 minutes in the article's example cuts B off from practice Y, so B scores 2.667 and C 6.667 per 10,000 instead of 4.205 and 1.538, and the order of B and C reverses (computed here). Luo and Wang ran seven thresholds of 20 to 50 minutes and found a smaller variance of the scores at larger thresholds, and Wang 2012 notes that the right catchment size cannot be settled without real utilisation data.
Sources
Luo and Wang on the two-step floating catchment area method
Luo W, Wang F. Measures of spatial accessibility to healthcare in a GIS environment: synthesis and a case study in Chicago region. Environment and Planning B: Planning and Design. 2003;30(6):865-884. Author manuscript read (HHS Author Manuscripts, PMC8238135); the published version, doi 10.1068/b29120, not seen. Section The Evolvement of Floating Catchment Area Methods, equation (3) for the physician to population ratio R_j within the catchment of physician location j, the population locations within the threshold travel time d_0, and equation (4) for the accessibility of location i as the sum of R_j over physician locations within d_0 of i, with the note that the travel-time matrix is computed once and accessed twice and that centroids represent whole tracts. Section The Gravity-Based Method and a Synthesis states that the population-weighted average of accessibility equals the physician to population ratio of the whole study area and that this applies to equation (4). Section The Case Study and Sensitivity Analysis tests seven thresholds of 20 to 50 minutes and reports a smaller variance of the scores at a larger threshold.
Wang's review on the two-step floating catchment area and its weighted mean
Wang F. Measurement, optimization, and impact of health care accessibility: a methodological review. Annals of the Association of American Geographers. 2012;102(5):1104-1112. Author manuscript read (NIHPA Author Manuscripts, PMC3547595); the published version, doi 10.1080/00045608.2012.657146, not seen. Section Health Care Accessibility Measures Synthesized, equation (2) for the 2SFCA with R_j = S_j over the population within d_0, the statement that the method's major limitation is its dichotomous approach, equation (3) with a general distance decay f(d), the statement that the best decay function or catchment size cannot be settled without analysing real utilisation, and the separation of place accessibility from individual accessibility. Section Optimization Models in Health Care Accessibility states that the weighted mean of accessibility under equations 1 to 3 equals the ratio of total supply to total demand.
Guagliardo on the two-step floating catchment area
Guagliardo MF. Spatial accessibility of primary care: concepts, methods and challenges. International Journal of Health Geographics. 2004;3:3. Full text read (PMC394340), formula images included. Subsection Two-step floating catchment area of the section Recent developments, which describes the provider-to-population ratio of each provider's 30-minute drive-time catchment, the summing of the ratios of every catchment over each population point, results in provider-to-population units, the artificially sharp catchment borders, Luo and Wang's sensitivity analysis of 20 to 50 minute thresholds, their plan to adjust for transport options and their demonstration that the method is a special case of the Joseph and Bantock improved gravity model. Section Measuring spatial accessibility describes the border-crossing weakness of supply ratios, and section Defining access states that a study of spatial potential could not demonstrate or disprove a relationship of spatial accessibility with utilisation or population health.
Canonical Identity
Stable URI · Machine-readable · Resolvable · CC BY 4.0
