Two-step floating catchment area accessibility for two practices and three neighbourhoods

Step one divides each practice's full-time-equivalent GPs by the population of the neighbourhoods within the threshold travel time d_0 of it, giving the practice's supply ratio. Step two gives each neighbourhood the sum of the supply ratios of the practices within d_0 of it. Each comparison such as (d_1X <= d_0) is 1 when the travel time is within the threshold and 0 otherwise, so a neighbourhood outside a practice's catchment adds nothing to its denominator and takes nothing from its ratio. The result is in GPs per head of population, and the article reports it per 10,000 people. Neighbourhoods A, B and C of the article are 1, 2 and 3 here; more practices or neighbourhoods add terms of the same pattern, which HE-CF-ACCS-001 computes for any number of sites.

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
InputsDefinitionUnit
S_XCapacity of practice X, its full-time-equivalent GPs; zero or aboveGPs
d_1XTravel time between neighbourhood 1 and practice X, in the same unit as d_0minutes
d_0Threshold travel time that defines every catchment, the same for both practices and both steps; above zerominutes
P_1Resident population of neighbourhood 1 (A in the article); zero or abovepeople
d_2XTravel time between neighbourhood 2 and practice X, in the same unit as d_0minutes
P_2Resident population of neighbourhood 2 (B in the article); zero or abovepeople
d_3XTravel time between neighbourhood 3 and practice X, in the same unit as d_0minutes
P_3Resident population of neighbourhood 3 (C in the article); zero or abovepeople
S_YCapacity of practice Y, its full-time-equivalent GPs; zero or aboveGPs
d_1YTravel time between neighbourhood 1 and practice Y, in the same unit as d_0minutes
d_2YTravel time between neighbourhood 2 and practice Y, in the same unit as d_0minutes
d_3YTravel time between neighbourhood 3 and practice Y, in the same unit as d_0minutes
Output
R_XGPs at practice X divided by the population of the neighbourhoods within d_0 of it, an intermediate outputGPs per person
R_YGPs at practice Y divided by the population of the neighbourhoods within d_0 of it, an intermediate outputGPs per person
A_1Accessibility of neighbourhood 1, the sum of the supply ratios of the practices within d_0 of itGPs per person
A_2Accessibility of neighbourhood 2, the sum of the supply ratios of the practices within d_0 of itGPs per person
A_3Accessibility of neighbourhood 3, the sum of the supply ratios of the practices within d_0 of itGPs 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_Y are the GPs at the two practices; P_1 to P_3 the neighbourhood populations; d_1X to d_3Y the travel times in minutes; d_0 the threshold in minutes; k the number of people the results are scaled to (10,000 in the article); R_X, R_Y and A_1 to A_3 are as in HE-FM-ACCS-001, in GPs per person; M is the population-weighted mean score per k people and V the population-weighted variance per k people, squared. In the code S is a vector of n capacities, P a vector of m populations and D an 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.0826

    Worked 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.2222

    Excel: 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 as fca2(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; with c(12, 0) the variance is 2.222. The matrix line 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)) / T Standard 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-9

    Test (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.0001

    Common 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.

    View source →

  • 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.

    View source →

  • 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.

    View source →

Canonical Identity

Two-step floating catchment area accessibility for two practices and three neighbourhoods | HealthEconomics.wiki