From a8f3c7e4ced4e63ec786bf2825e7f5f21f929dab Mon Sep 17 00:00:00 2001 From: Ian D Buller Date: Sun, 1 Sep 2024 21:49:54 -0400 Subject: [PATCH] :sparkles: Initial commit for branch "dev_denton_cuzzort" (ndi v0.1.6.9012) (#29) * Added `denton_cuzzort()` function to compute the aspatial racial or ethnic Relative Concentration (*RCO*) based on [Massey & Denton (1988)](https://doi.org/10.1093/sf/67.2.281) and Duncan, Cuzzort, & Duncan (1961; LC:60007089) --- DESCRIPTION | 4 +- NAMESPACE | 1 + NEWS.md | 5 +- R/denton.R | 9 +- R/denton_cuzzort.R | 461 +++++++++++++++++++ R/duncan.R | 5 +- R/duncan_cuzzort.R | 7 +- R/duncan_duncan.R | 7 +- R/globals.R | 5 + R/hoover.R | 4 +- R/massey.R | 6 +- R/massey_duncan.R | 27 +- R/ndi-package.R | 2 + R/utils.R | 537 +++++++++++++---------- R/white_blau.R | 4 +- README.md | 164 ++++--- cran-comments.md | 5 +- inst/CITATION | 42 +- man/denton_cuzzort.Rd | 100 +++++ man/figures/a.png | Bin 383817 -> 384987 bytes man/figures/a_holder.png | Bin 387203 -> 388563 bytes man/figures/ace.png | Bin 286207 -> 306136 bytes man/figures/acl.png | Bin 315653 -> 317536 bytes man/figures/aco.png | Bin 381635 -> 382955 bytes man/figures/ddd.png | Bin 385890 -> 387239 bytes man/figures/del.png | Bin 378401 -> 379817 bytes man/figures/djt.png | Bin 383942 -> 385164 bytes man/figures/g_inc.png | Bin 367736 -> 372913 bytes man/figures/g_re.png | Bin 376098 -> 378922 bytes man/figures/h.png | Bin 378664 -> 379917 bytes man/figures/lexis.png | Bin 318798 -> 320363 bytes man/figures/lq.png | Bin 375449 -> 376328 bytes man/figures/rce.png | Bin 307717 -> 309383 bytes man/figures/rcl.png | Bin 288988 -> 290975 bytes man/figures/rco.png | Bin 0 -> 288709 bytes man/figures/sp.png | Bin 305587 -> 307179 bytes man/figures/v.png | Bin 265021 -> 382457 bytes man/figures/xpx_star.png | Bin 374665 -> 376010 bytes man/figures/xpy_star.png | Bin 382438 -> 383671 bytes man/ndi-package.Rd | 2 + tests/testthat/test-denton_cuzzort.R | 104 +++++ vignettes/ndi2.Rmd | 67 ++- vignettes/ndi2.html | 631 +++++++++++++++------------ 43 files changed, 1593 insertions(+), 606 deletions(-) create mode 100644 R/denton_cuzzort.R create mode 100644 man/denton_cuzzort.Rd create mode 100644 man/figures/rco.png create mode 100644 tests/testthat/test-denton_cuzzort.R diff --git a/DESCRIPTION b/DESCRIPTION index 7fab9ce..45f8321 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: ndi Title: Neighborhood Deprivation Indices -Version: 0.1.6.9011 -Date: 2024-08-31 +Version: 0.1.6.9012 +Date: 2024-09-01 Authors@R: c(person(given = "Ian D.", family = "Buller", diff --git a/NAMESPACE b/NAMESPACE index f102334..ddd03a1 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -6,6 +6,7 @@ export(bell) export(bemanian_beyer) export(bravo) export(denton) +export(denton_cuzzort) export(duncan) export(duncan_cuzzort) export(duncan_duncan) diff --git a/NEWS.md b/NEWS.md index 98d562d..a37064e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,6 @@ # ndi (development version) -## ndi v0.1.6.9011 +## ndi v0.1.6.9012 ### New Features @@ -13,12 +13,13 @@ * Added `white_blau()` function to compute an index of spatial proximity (*SP*) based on [White (1986)](https://doi.org/10.2307/3644339) and Blau (1977; ISBN-13:978-0-029-03660-0) * Thank you for the feature suggestions above, [Symielle Gaston](https://orcid.org/0000-0001-9495-1592) * Added `denton()` function to compute the aspatial racial or ethnic Relative Clustering (*RCL*) based on [Massey & Denton (1988)](https://doi.org/10.1093/sf/67.2.281) +* Added `denton_cuzzort()` function to compute the aspatial racial or ethnic Relative Concentration (*RCO*) based on [Massey & Denton (1988)](https://doi.org/10.1093/sf/67.2.281) and Duncan, Cuzzort, & Duncan (1961; LC:60007089) * Added `duncan_duncan()` function to compute the aspatial racial or ethnic Relative Centralization (*RCE*) based on [Duncan & Duncan (1955b)](https://doi.org/10.1086/221609) and [Massey & Denton (1988)](https://doi.org/10.1093/sf/67.2.281) * Added `massey()` function to compute the aspatial racial or ethnic Absolute Clustering (*ACL*) based on [Massey & Denton (1988)](https://doi.org/10.1093/sf/67.2.281) * Added `massey_duncan()` function to compute the aspatial racial or ethnic Absolute Concentration (*ACO*) based on [Massey & Denton (1988)](https://doi.org/10.1093/sf/67.2.281) and Duncan, Cuzzort, & Duncan (1961; LC:60007089) #### New Function Capabilities -* Added `geo_large = 'place'` for census-designated places, `geo_large = 'cbsa'` for core-based statistical areas, `geo_large = 'csa'` for combined statistical areas, and `geo_large = 'metro'` for metropolitan divisions as the larger geographical unit in `atkinson()`, `bell()`, `bemanian_beyer()`, `denton()`, `duncan()`, `duncan_cuzzort()`, `duncan_duncan()`, `hoover()`, `james_taeuber()`, `lieberson()`, `massey()`, `massey_duncan()`, `sudano()`, `theil()`, and `white()`, `white_blau()` functions. +* Added `geo_large = 'place'` for census-designated places, `geo_large = 'cbsa'` for core-based statistical areas, `geo_large = 'csa'` for combined statistical areas, and `geo_large = 'metro'` for metropolitan divisions as the larger geographical unit in `atkinson()`, `bell()`, `bemanian_beyer()`, `denton()`, `denton_cuzzort()`, `duncan()`, `duncan_cuzzort()`, `duncan_duncan()`, `hoover()`, `james_taeuber()`, `lieberson()`, `massey()`, `massey_duncan()`, `sudano()`, `theil()`, and `white()`, `white_blau()` functions. * Added census block group computation for `anthopolos()` by specifying `geo == 'cbg'` or `geo == 'block group'` * Added `holder` argument to `atkinson()` function to toggle the computation with or without the Hölder mean. The function can now compute *A* without the Hölder mean. The default is `holder = FALSE`. * Added `crs` argument to `anthopolos()`, `bravo()`, and `white_blau()` functions to provide spatial projection of the distance-based metrics diff --git a/R/denton.R b/R/denton.R index a4f25bb..ca2cc40 100644 --- a/R/denton.R +++ b/R/denton.R @@ -153,6 +153,7 @@ denton <- function(geo_large = 'county', # Select census variables vars <- c( + TotalPop = 'B03002_001', NHoL = 'B03002_002', NHoLW = 'B03002_003', NHoLB = 'B03002_004', @@ -175,8 +176,8 @@ denton <- function(geo_large = 'county', HoLTReSOR = 'B03002_021' ) - selected_vars <- vars[c(subgroup, subgroup_ref)] - out_names <- names(selected_vars) # save for output + selected_vars <- vars[c('TotalPop', subgroup, subgroup_ref)] + out_names <- c(names(selected_vars), 'ALAND') # save for output in_subgroup <- paste0(subgroup, 'E') in_subgroup_ref <- paste0(subgroup_ref, 'E') @@ -330,7 +331,7 @@ denton <- function(geo_large = 'county', } # Compute RCL - ## From Denton & Massey (1988) https://doi.org/10.1093/sf/67.2.281 + ## From Massey & Denton (1988) https://doi.org/10.1093/sf/67.2.281 ## RCL = P_{xx}/P_{yy}-1 ## Where for i & j smaller geographical units: ## P_{xx} = \frac{\sum_{i=1}^{n}\sum_{j=1}^{n}x_{i}x_{j}c_{ij}}{X^{2}} @@ -359,7 +360,7 @@ denton <- function(geo_large = 'county', sf::st_drop_geometry() # Warning for missingness of census characteristics - missingYN <- out_dat[, c(in_subgroup, in_subgroup_ref)] %>% + missingYN <- out_dat[, c('TotalPopE', in_subgroup, in_subgroup_ref, 'ALAND')] %>% sf::st_drop_geometry() names(missingYN) <- out_names missingYN <- missingYN %>% diff --git a/R/denton_cuzzort.R b/R/denton_cuzzort.R new file mode 100644 index 0000000..abb8c0f --- /dev/null +++ b/R/denton_cuzzort.R @@ -0,0 +1,461 @@ +#' Relative Concentration based on Massey & Denton (1988) and Duncan, Cuzzort, & Duncan (1961) +#' +#' Compute the aspatial Relative Concentration (Massey & Denton) of a selected racial or ethnic subgroup(s) and U.S. geographies. +#' +#' @param geo_large Character string specifying the larger geographical unit of the data. The default is counties \code{geo_large = 'county'}. +#' @param geo_small Character string specifying the smaller geographical unit of the data. The default is census tracts \code{geo_small = 'tract'}. +#' @param year Numeric. The year to compute the estimate. The default is 2020, and the years 2009 onward are currently available. +#' @param subgroup Character string specifying the racial or ethnic subgroup(s) as the comparison population. See Details for available choices. +#' @param subgroup_ref Character string specifying the racial or ethnic subgroup(s) as the reference population. See Details for available choices. +#' @param omit_NAs Logical. If FALSE, will compute index for a larger geographical unit only if all of its smaller geographical units have values. The default is TRUE. +#' @param quiet Logical. If TRUE, will display messages about potential missing census information. The default is FALSE. +#' @param ... Arguments passed to \code{\link[tidycensus]{get_acs}} to select state, county, and other arguments for census characteristics +#' +#' @details This function will compute the aspatial Relative Concentration (\emph{RCO}) of selected racial or ethnic subgroups and U.S. geographies for a specified geographical extent (e.g., the entire U.S. or a single state) based on Massey & Denton (1988) \doi{10.1093/sf/67.2.281} and Duncan, Cuzzort, & Duncan (1961; LC:60007089). This function provides the computation of \emph{RCO} for any of the U.S. Census Bureau race or ethnicity subgroups (including Hispanic and non-Hispanic individuals). +#' +#' The function uses the \code{\link[tidycensus]{get_acs}} function to obtain U.S. Census Bureau 5-year American Community Survey characteristics used for the computation. The yearly estimates are available for 2009 onward when ACS-5 data are available (2010 onward for \code{geo_large = 'cbsa'} and 2011 onward for \code{geo_large = 'place'}, \code{geo_large = 'csa'}, or \code{geo_large = 'metro'}) but may be available from other U.S. Census Bureau surveys. The twenty racial or ethnic subgroups (U.S. Census Bureau definitions) are: +#' \itemize{ +#' \item \strong{B03002_002}: not Hispanic or Latino \code{'NHoL'} +#' \item \strong{B03002_003}: not Hispanic or Latino, white alone \code{'NHoLW'} +#' \item \strong{B03002_004}: not Hispanic or Latino, Black or African American alone \code{'NHoLB'} +#' \item \strong{B03002_005}: not Hispanic or Latino, American Indian and Alaska Native alone \code{'NHoLAIAN'} +#' \item \strong{B03002_006}: not Hispanic or Latino, Asian alone \code{'NHoLA'} +#' \item \strong{B03002_007}: not Hispanic or Latino, Native Hawaiian and Other Pacific Islander alone \code{'NHoLNHOPI'} +#' \item \strong{B03002_008}: not Hispanic or Latino, Some other race alone \code{'NHoLSOR'} +#' \item \strong{B03002_009}: not Hispanic or Latino, Two or more races \code{'NHoLTOMR'} +#' \item \strong{B03002_010}: not Hispanic or Latino, Two races including Some other race \code{'NHoLTRiSOR'} +#' \item \strong{B03002_011}: not Hispanic or Latino, Two races excluding Some other race, and three or more races \code{'NHoLTReSOR'} +#' \item \strong{B03002_012}: Hispanic or Latino \code{'HoL'} +#' \item \strong{B03002_013}: Hispanic or Latino, white alone \code{'HoLW'} +#' \item \strong{B03002_014}: Hispanic or Latino, Black or African American alone \code{'HoLB'} +#' \item \strong{B03002_015}: Hispanic or Latino, American Indian and Alaska Native alone \code{'HoLAIAN'} +#' \item \strong{B03002_016}: Hispanic or Latino, Asian alone \code{'HoLA'} +#' \item \strong{B03002_017}: Hispanic or Latino, Native Hawaiian and Other Pacific Islander alone \code{'HoLNHOPI'} +#' \item \strong{B03002_018}: Hispanic or Latino, Some other race alone \code{'HoLSOR'} +#' \item \strong{B03002_019}: Hispanic or Latino, Two or more races \code{'HoLTOMR'} +#' \item \strong{B03002_020}: Hispanic or Latino, Two races including Some other race \code{'HoLTRiSOR'} +#' \item \strong{B03002_021}: Hispanic or Latino, Two races excluding Some other race, and three or more races \code{'HoLTReSOR'} +#' } +#' +#' Use the internal \code{state} and \code{county} arguments within the \code{\link[tidycensus]{get_acs}} function to specify geographic extent of the data output. +#' +#' \emph{RCO} is a measure of concentration of racial or ethnic populations within smaller geographical units that are located within larger geographical units. \emph{RCO} is a measure of concentration of racial or ethnic populations within smaller geographical units that are located within larger geographical units. \emph{RCO} can range from -1 to 1 and represents the share of a larger geographical unit occupied by a racial or ethnic subgroup compared to a referent racial or ethnic subgroup. A value of 1 indicates that the concentration of the racial or ethnic subgroup exceeds the concentration of the referent racial or ethnic subgroup at the maximum extent possible. A value of -1 is the converse. Note: Computed as designed, but values smaller than -1 are possible if the racial or ethnic subgroup population is larger than the referent racial or ethnic subgroup population. +#' +#' Larger geographical units available include states \code{geo_large = 'state'}, counties \code{geo_large = 'county'}, census tracts \code{geo_large = 'tract'}, census-designated places \code{geo_large = 'place'}, core-based statistical areas \code{geo_large = 'cbsa'}, combined statistical areas \code{geo_large = 'csa'}, and metropolitan divisions \code{geo_large = 'metro'}. Smaller geographical units available include, counties \code{geo_small = 'county'}, census tracts \code{geo_small = 'tract'}, and census block groups \code{geo_small = 'cbg'}. If a larger geographical unit is comprised of only one smaller geographical unit (e.g., a U.S county contains only one census tract), then the \emph{RCO} value returned is NA. If the larger geographical unit is census-designated places \code{geo_large = 'place'}, core-based statistical areas \code{geo_large = 'cbsa'}, combined statistical areas \code{geo_large = 'csa'}, or metropolitan divisions \code{geo_large = 'metro'}, only the smaller geographical units completely within a larger geographical unit are considered in the \emph{V} computation (see internal \code{\link[sf]{st_within}} function for more information) and recommend specifying all states within which the interested larger geographical unit are located using the internal \code{state} argument to ensure all appropriate smaller geographical units are included in the \emph{RCO} computation. +#' +#' @return An object of class 'list'. This is a named list with the following components: +#' +#' \describe{ +#' \item{\code{rco}}{An object of class 'tbl' for the GEOID, name, and \emph{RCO} at specified larger census geographies.} +#' \item{\code{rco_data}}{An object of class 'tbl' for the raw census values at specified smaller census geographies.} +#' \item{\code{missing}}{An object of class 'tbl' of the count and proportion of missingness for each census variable used to compute \emph{RCO}.} +#' } +#' +#' @import dplyr +#' @importFrom sf st_centroid st_distance st_drop_geometry st_transform st_within +#' @importFrom stats complete.cases +#' @importFrom stringr str_trim +#' @importFrom tidycensus get_acs +#' @importFrom tidyr pivot_longer separate +#' @importFrom tigris combined_statistical_areas core_based_statistical_areas metro_divisions places +#' @importFrom units drop_units set_units +#' @importFrom utils stack +#' @export +#' +#' @seealso \code{\link[tidycensus]{get_acs}} for additional arguments for geographic extent selection (i.e., \code{state} and \code{county}). +#' +#' @examples +#' \dontrun{ +#' # Wrapped in \dontrun{} because these examples require a Census API key. +#' +#' # Index of spatial proximity of Black populations +#' ## of census tracts within counties within Georgia, U.S.A., counties (2020) +#' denton_cuzzort( +#' geo_large = 'county', +#' geo_small = 'tract', +#' state = 'GA', +#' year = 2020, +#' subgroup = 'NHoLB', +#' subgroup_ref = 'NHoLW' +#' ) +#' +#' } +#' +denton_cuzzort <- function(geo_large = 'county', + geo_small = 'tract', + year = 2020, + subgroup, + subgroup_ref, + omit_NAs = TRUE, + quiet = FALSE, + ...) { + + # Check arguments + match.arg(geo_large, choices = c('state', 'county', 'tract', 'place', 'cbsa', 'csa', 'metro')) + match.arg(geo_small, choices = c('county', 'tract', 'cbg', 'block group')) + stopifnot(is.numeric(year), year >= 2009) # all variables available 2009 onward + match.arg( + subgroup, + several.ok = TRUE, + choices = c( + 'NHoL', + 'NHoLW', + 'NHoLB', + 'NHoLAIAN', + 'NHoLA', + 'NHoLNHOPI', + 'NHoLSOR', + 'NHoLTOMR', + 'NHoLTRiSOR', + 'NHoLTReSOR', + 'HoL', + 'HoLW', + 'HoLB', + 'HoLAIAN', + 'HoLA', + 'HoLNHOPI', + 'HoLSOR', + 'HoLTOMR', + 'HoLTRiSOR', + 'HoLTReSOR' + ) + ) + match.arg( + subgroup_ref, + several.ok = TRUE, + choices = c( + 'NHoL', + 'NHoLW', + 'NHoLB', + 'NHoLAIAN', + 'NHoLA', + 'NHoLNHOPI', + 'NHoLSOR', + 'NHoLTOMR', + 'NHoLTRiSOR', + 'NHoLTReSOR', + 'HoL', + 'HoLW', + 'HoLB', + 'HoLAIAN', + 'HoLA', + 'HoLNHOPI', + 'HoLSOR', + 'HoLTOMR', + 'HoLTRiSOR', + 'HoLTReSOR' + ) + ) + + # Select census variables + vars <- c( + TotalPop = 'B03002_001', + NHoL = 'B03002_002', + NHoLW = 'B03002_003', + NHoLB = 'B03002_004', + NHoLAIAN = 'B03002_005', + NHoLA = 'B03002_006', + NHoLNHOPI = 'B03002_007', + NHoLSOR = 'B03002_008', + NHoLTOMR = 'B03002_009', + NHoLTRiSOR = 'B03002_010', + NHoLTReSOR = 'B03002_011', + HoL = 'B03002_012', + HoLW = 'B03002_013', + HoLB = 'B03002_014', + HoLAIAN = 'B03002_015', + HoLA = 'B03002_016', + HoLNHOPI = 'B03002_017', + HoLSOR = 'B03002_018', + HoLTOMR = 'B03002_019', + HoLTRiSOR = 'B03002_020', + HoLTReSOR = 'B03002_021' + ) + + selected_vars <- vars[c('TotalPop', subgroup, subgroup_ref)] + out_names <- c(names(selected_vars), 'ALAND') # save for output + in_subgroup <- paste0(subgroup, 'E') + in_subgroup_ref <- paste0(subgroup_ref, 'E') + + # Acquire RCO variables and sf geometries + out_dat <- suppressMessages(suppressWarnings( + tidycensus::get_acs( + geography = geo_small, + year = year, + output = 'wide', + variables = selected_vars, + geometry = TRUE, + keep_geo_vars = TRUE, + ... + ) + )) + + # Format output + if (geo_small == 'county') { + out_dat <- out_dat %>% + tidyr::separate(NAME.y, into = c('county', 'state'), sep = ',') + } + if (geo_small == 'tract') { + out_dat <- out_dat %>% + tidyr::separate(NAME.y, into = c('tract', 'county', 'state'), sep = ',') %>% + dplyr::mutate(tract = gsub('[^0-9\\.]', '', tract)) + } + if (geo_small == 'cbg' | geo_small == 'block group') { + out_dat <- out_dat %>% + tidyr::separate(NAME.y, into = c('cbg', 'tract', 'county', 'state'), sep = ',') %>% + dplyr::mutate( + tract = gsub('[^0-9\\.]', '', tract), + cbg = gsub('[^0-9\\.]', '', cbg) + ) + } + + # Grouping IDs for RCO computation + if (geo_large == 'state') { + out_dat <- out_dat %>% + dplyr::mutate( + oid = STATEFP, + state = stringr::str_trim(state) + ) %>% + sf::st_drop_geometry() + } + if (geo_large == 'tract') { + out_dat <- out_dat %>% + dplyr::mutate( + oid = paste0(STATEFP, COUNTYFP, TRACTCE), + state = stringr::str_trim(state), + county = stringr::str_trim(county) + ) %>% + sf::st_drop_geometry() + } + if (geo_large == 'county') { + out_dat <- out_dat %>% + dplyr::mutate( + oid = paste0(STATEFP, COUNTYFP), + state = stringr::str_trim(state), + county = stringr::str_trim(county) + ) %>% + sf::st_drop_geometry() + } + if (geo_large == 'place') { + stopifnot(is.numeric(year), year >= 2011) # Places only available 2011 onward + lgeom <- suppressMessages(suppressWarnings(tigris::places( + year = year, state = unique(out_dat$state)) + )) + wlgeom <- sf::st_within(out_dat, lgeom) + out_dat <- out_dat %>% + dplyr::mutate( + oid = lapply(wlgeom, function(x) { + tmp <- lgeom[x, 4] %>% sf::st_drop_geometry() + lapply(tmp, function(x) { if (length(x) == 0) NA else x }) + }) %>% + unlist(), + place = lapply(wlgeom, function(x) { + tmp <- lgeom[x, 5] %>% sf::st_drop_geometry() + lapply(tmp, function(x) { if (length(x) == 0) NA else x }) + }) %>% + unlist() + ) %>% + sf::st_drop_geometry() + } + if (geo_large == 'cbsa') { + stopifnot(is.numeric(year), year >= 2010) # CBSAs only available 2010 onward + lgeom <- suppressMessages(suppressWarnings(tigris::core_based_statistical_areas(year = year))) + wlgeom <- sf::st_within(out_dat, lgeom) + out_dat <- out_dat %>% + dplyr::mutate( + oid = lapply(wlgeom, function(x) { + tmp <- lgeom[x, 3] %>% sf::st_drop_geometry() + lapply(tmp, function(x) { if (length(x) == 0) NA else x }) + }) %>% + unlist(), + cbsa = lapply(wlgeom, function(x) { + tmp <- lgeom[x, 4] %>% sf::st_drop_geometry() + lapply(tmp, function(x) { if (length(x) == 0) NA else x }) + }) %>% + unlist() + ) %>% + sf::st_drop_geometry() + } + if (geo_large == 'csa') { + stopifnot(is.numeric(year), year >= 2011) # CSAs only available 2011 onward + lgeom <- suppressMessages(suppressWarnings(tigris::combined_statistical_areas(year = year))) + wlgeom <- sf::st_within(out_dat, lgeom) + out_dat <- out_dat %>% + dplyr::mutate( + oid = lapply(wlgeom, function(x) { + tmp <- lgeom[x, 2] %>% sf::st_drop_geometry() + lapply(tmp, function(x) { if (length(x) == 0) NA else x }) + }) %>% + unlist(), + csa = lapply(wlgeom, function(x) { + tmp <- lgeom[x, 3] %>% sf::st_drop_geometry() + lapply(tmp, function(x) { if (length(x) == 0) NA else x }) + }) %>% + unlist() + ) %>% + sf::st_drop_geometry() + } + if (geo_large == 'metro') { + stopifnot(is.numeric(year), year >= 2011) # Metropolitan Divisions only available 2011 onward + lgeom <- suppressMessages(suppressWarnings(tigris::metro_divisions(year = year))) + wlgeom <- sf::st_within(out_dat, lgeom) + out_dat <- out_dat %>% + dplyr::mutate( + oid = lapply(wlgeom, function(x) { + tmp <- lgeom[x, 4] %>% sf::st_drop_geometry() + lapply(tmp, function(x) { if (length(x) == 0) NA else x }) + }) %>% + unlist(), + metro = lapply(wlgeom, function(x) { + tmp <- lgeom[x, 5] %>% sf::st_drop_geometry() + lapply(tmp, function(x) { if (length(x) == 0) NA else x }) + }) %>% + unlist() + ) %>% + sf::st_drop_geometry() + } + + # Count of racial or ethnic subgroup populations + ## Count of racial or ethnic comparison subgroup population + if (length(in_subgroup) == 1) { + out_dat <- out_dat %>% + dplyr::mutate(subgroup = as.data.frame(.)[, in_subgroup]) + } else { + out_dat <- out_dat %>% + dplyr::mutate(subgroup = rowSums(as.data.frame(.)[, in_subgroup])) + } + ## Count of racial or ethnic reference subgroup population + if (length(in_subgroup_ref) == 1) { + out_dat <- out_dat %>% + dplyr::mutate(subgroup_ref = as.data.frame(.)[, in_subgroup_ref]) + } else { + out_dat <- out_dat %>% + dplyr::mutate(subgroup_ref = rowSums(as.data.frame(.)[, in_subgroup_ref])) + } + + # Compute RCO + ## From Massey & Denton (1988) https://doi.org/10.1093/sf/67.2.281 + ## RCO=\frac{\left(\sum_{i=1}^{n}\frac{x_{i}a_{i}}{X}/\sum_{i=1}^{n}\frac{y_{i}a_{i}}{Y}\right)-1} + ## {\left(\sum_{i=1}^{n_{1}}\frac{t_{i}a_{i}}{T_{1}}/\sum_{i=n^{2}}^{n}\frac{t_{i}a_{i}}{T_{2}}\right)-1} + ## Where for i smaller geographical units are ordered by geographic size from smallest to largest + ## a_{i} denotes the land area of smaller geographical unit i + ## x_{i} denotes the racial or ethnic subgroup population of smaller geographical unit i + ## X denotes the racial or ethnic subgroup population of a larger geographical unit + ## y_{i} denotes the referent racial or ethnic subgroup population of smaller geographical unit i + ## Y denotes the referent racial or ethnic subgroup population of a larger geographical unit + ## n_{1} denotes the rank of the smaller geographic unit where the cumulative total population of + ## smaller geographical units equals the total racial or ethnic subgroup population of a + ## larger geographical unit, summing from the smallest unit up + ## n_{2} denotes the rank of the smaller geographic unit where the cumulative total population of + ## smaller geographical units equals a total racial or ethnic subgroup population + ## totaling from the largest unit down + ## t_{i} denotes the total population of smaller geographical unit i + ## T_{1} denotes the total population of smaller geographical units from 1 to n_{1} + ## T_{2} denotes the total population of smaller geographical units from n_{2} to n + + ## Compute + out_tmp <- out_dat %>% + .[.$oid != 'NANA', ] %>% + split(., f = list(.$oid)) %>% + lapply(., FUN = rco_fun, omit_NAs = omit_NAs) %>% + utils::stack(.) %>% + dplyr::mutate( + RCO = values, + oid = ind + ) %>% + dplyr::select(RCO, oid) %>% + sf::st_drop_geometry() + + # Warning for missingness of census characteristics + missingYN <- out_dat[, c('TotalPopE', in_subgroup, in_subgroup_ref, 'ALAND')] %>% + sf::st_drop_geometry() + names(missingYN) <- out_names + missingYN <- missingYN %>% + tidyr::pivot_longer( + cols = dplyr::everything(), + names_to = 'variable', + values_to = 'val' + ) %>% + dplyr::group_by(variable) %>% + dplyr::summarise( + total = dplyr::n(), + n_missing = sum(is.na(val)), + percent_missing = paste0(round(mean(is.na(val)) * 100, 2), ' %') + ) + + if (quiet == FALSE) { + # Warning for missing census data + if (sum(missingYN$n_missing) > 0) { + message('Warning: Missing census data') + } + } + + # Format output + out <- out_dat %>% + sf::st_drop_geometry() %>% + dplyr::left_join(out_tmp, by = dplyr::join_by(oid)) + if (geo_large == 'state') { + out <- out %>% + dplyr::select(oid, state, RCO) %>% + unique(.) %>% + dplyr::mutate(GEOID = oid) %>% + dplyr::select(GEOID, state, RCO) + } + if (geo_large == 'county') { + out <- out %>% + dplyr::select(oid, state, county, RCO) %>% + unique(.) %>% + dplyr::mutate(GEOID = oid) %>% + dplyr::select(GEOID, state, county, RCO) + } + if (geo_large == 'tract') { + out <- out %>% + dplyr::select(oid, state, county, tract, RCO) %>% + unique(.) %>% + dplyr::mutate(GEOID = oid) %>% + dplyr::select(GEOID, state, county, tract, RCO) + } + if (geo_large == 'place') { + out <- out %>% + dplyr::select(oid, place, RCO) %>% + unique(.) %>% + dplyr::mutate(GEOID = oid) %>% + dplyr::select(GEOID, place, RCO) + } + if (geo_large == 'cbsa') { + out <- out %>% + dplyr::select(oid, cbsa, RCO) %>% + unique(.) %>% + dplyr::mutate(GEOID = oid) %>% + dplyr::select(GEOID, cbsa, RCO) + } + if (geo_large == 'csa') { + out <- out %>% + dplyr::select(oid, csa, RCO) %>% + unique(.) %>% + dplyr::mutate(GEOID = oid) %>% + dplyr::select(GEOID, csa, RCO) + } + if (geo_large == 'metro') { + out <- out %>% + dplyr::select(oid, metro, RCO) %>% + unique(.) %>% + dplyr::mutate(GEOID = oid) %>% + dplyr::select(GEOID, metro, RCO) + } + + out <- out %>% + .[.$GEOID != 'NANA', ] %>% + dplyr::filter(!is.na(GEOID)) %>% + dplyr::distinct(GEOID, .keep_all = TRUE) %>% + dplyr::arrange(GEOID) %>% + dplyr::as_tibble() + + out_dat <- out_dat %>% + dplyr::arrange(GEOID) %>% + dplyr::as_tibble() + + out <- list(rco = out, rco_data = out_dat, missing = missingYN) + + return(out) +} diff --git a/R/duncan.R b/R/duncan.R index 34d717a..85f02ad 100644 --- a/R/duncan.R +++ b/R/duncan.R @@ -149,6 +149,7 @@ duncan <- function(geo_large = 'county', # Select census variables vars <- c( + TotalPop = 'B03002_001', NHoL = 'B03002_002', NHoLW = 'B03002_003', NHoLB = 'B03002_004', @@ -171,7 +172,7 @@ duncan <- function(geo_large = 'county', HoLTReSOR = 'B03002_021' ) - selected_vars <- vars[c(subgroup, subgroup_ref)] + selected_vars <- vars[c('TotalPop', subgroup, subgroup_ref)] out_names <- names(selected_vars) # save for output in_subgroup <- paste0(subgroup, 'E') in_subgroup_ref <- paste0(subgroup_ref, 'E') @@ -355,7 +356,7 @@ duncan <- function(geo_large = 'county', dplyr::select(D, oid) # Warning for missingness of census characteristics - missingYN <- out_dat[, c(in_subgroup, in_subgroup_ref)] + missingYN <- out_dat[, c('TotalPopE', in_subgroup, in_subgroup_ref)] names(missingYN) <- out_names missingYN <- missingYN %>% tidyr::pivot_longer( diff --git a/R/duncan_cuzzort.R b/R/duncan_cuzzort.R index da85b50..fb37a28 100644 --- a/R/duncan_cuzzort.R +++ b/R/duncan_cuzzort.R @@ -124,6 +124,7 @@ duncan_cuzzort <- function(geo_large = 'county', # Select census variables vars <- c( + TotalPop = 'B03002_001', NHoL = 'B03002_002', NHoLW = 'B03002_003', NHoLB = 'B03002_004', @@ -146,8 +147,8 @@ duncan_cuzzort <- function(geo_large = 'county', HoLTReSOR = 'B03002_021' ) - selected_vars <- vars[subgroup] - out_names <- names(selected_vars) # save for output + selected_vars <- vars[c('TotalPop', subgroup)] + out_names <- c(names(selected_vars), 'ALAND') # save for output in_subgroup <- paste0(subgroup, 'E') # Acquire ACE variables and sf geometries @@ -321,7 +322,7 @@ duncan_cuzzort <- function(geo_large = 'county', sf::st_drop_geometry() # Warning for missingness of census characteristics - missingYN <- out_dat[, in_subgroup] %>% + missingYN <- out_dat[, c('TotalPopE', in_subgroup, 'ALAND')] %>% sf::st_drop_geometry() names(missingYN) <- out_names missingYN <- missingYN %>% diff --git a/R/duncan_duncan.R b/R/duncan_duncan.R index 5dc092a..051cc09 100644 --- a/R/duncan_duncan.R +++ b/R/duncan_duncan.R @@ -153,6 +153,7 @@ duncan_duncan <- function(geo_large = 'county', # Select census variables vars <- c( + TotalPop = 'B03002_001', NHoL = 'B03002_002', NHoLW = 'B03002_003', NHoLB = 'B03002_004', @@ -175,8 +176,8 @@ duncan_duncan <- function(geo_large = 'county', HoLTReSOR = 'B03002_021' ) - selected_vars <- vars[c(subgroup, subgroup_ref)] - out_names <- names(selected_vars) # save for output + selected_vars <- vars[c('TotalPop', subgroup, subgroup_ref)] + out_names <- c(names(selected_vars), 'ALAND') # save for output in_subgroup <- paste0(subgroup, 'E') in_subgroup_ref <- paste0(subgroup_ref, 'E') @@ -359,7 +360,7 @@ duncan_duncan <- function(geo_large = 'county', sf::st_drop_geometry() # Warning for missingness of census characteristics - missingYN <- out_dat[, c(in_subgroup, in_subgroup_ref)] %>% + missingYN <- out_dat[, c('TotalPopE', in_subgroup, in_subgroup_ref, 'ALAND')] %>% sf::st_drop_geometry() names(missingYN) <- out_names missingYN <- missingYN %>% diff --git a/R/globals.R b/R/globals.R index 520fa99..60f97c5 100644 --- a/R/globals.R +++ b/R/globals.R @@ -249,6 +249,9 @@ globalVariables( 'ind', 'oid', 'cbg', + 'subgroup', + 'subgroup_ixn', + 'subgroup_ref', 'RI', 'EI', 'V', @@ -273,6 +276,8 @@ globalVariables( 'ACL', 'RCL', 'ACO', + 'RCL', + 'RCO', 'ALAND', 'TotalPopE', 'n_1', diff --git a/R/hoover.R b/R/hoover.R index c893d02..48193ba 100644 --- a/R/hoover.R +++ b/R/hoover.R @@ -142,7 +142,7 @@ hoover <- function(geo_large = 'county', HoLTReSOR = 'B03002_021' ) - selected_vars <- vars[subgroup] + selected_vars <- vars[c('TotalPop', subgroup)] out_names <- c(names(selected_vars), 'ALAND') # save for output in_subgroup <- paste0(subgroup, 'E') @@ -312,7 +312,7 @@ hoover <- function(geo_large = 'county', dplyr::select(DEL, oid) # Warning for missingness of census characteristics - missingYN <- out_dat[ , c(in_subgroup, 'ALAND')] + missingYN <- out_dat[ , c('TotalPopE', in_subgroup, 'ALAND')] names(missingYN) <- out_names missingYN <- missingYN %>% tidyr::pivot_longer(cols = dplyr::everything(), names_to = 'variable', values_to = 'val') %>% diff --git a/R/massey.R b/R/massey.R index accc512..0bb4e90 100644 --- a/R/massey.R +++ b/R/massey.R @@ -148,7 +148,7 @@ massey <- function(geo_large = 'county', ) selected_vars <- vars[c('TotalPop', subgroup)] - out_names <- names(selected_vars) # save for output + out_names <- c(names(selected_vars), 'ALAND') # save for output in_subgroup <- paste0(subgroup, 'E') # Acquire ACL variables and sf geometries @@ -293,7 +293,7 @@ massey <- function(geo_large = 'county', } # Compute ACL - ## From Denton & Massey (1988) https://doi.org/10.1093/sf/67.2.281 + ## From Massey & Denton (1988) https://doi.org/10.1093/sf/67.2.281 ## ACL = \frac{\sum_{i=1}^{n}\frac{x_{i}}{X}\sum_{i=1}^{n}c_{ij}x_{j}-\frac{X}{n^{2}}\sum_{i=1}^{n}\sum_{ij=1}^{n}c_{ij}} ## {\sum_{i=1}^{n}\frac{x_{i}}{X}\sum_{i=1}^{n}c_{ij}t_{j}-\frac{X}{n^{2}}\sum_{i=1}^{n}\sum_{ij=1}^{n}c_{ij}} ## Where for i & j smaller geographical units: @@ -320,7 +320,7 @@ massey <- function(geo_large = 'county', sf::st_drop_geometry() # Warning for missingness of census characteristics - missingYN <- out_dat[, c('TotalPopE', in_subgroup)] %>% + missingYN <- out_dat[, c('TotalPopE', in_subgroup, 'ALAND')] %>% sf::st_drop_geometry() names(missingYN) <- out_names missingYN <- missingYN %>% diff --git a/R/massey_duncan.R b/R/massey_duncan.R index 85c463d..e5b9bd0 100644 --- a/R/massey_duncan.R +++ b/R/massey_duncan.R @@ -144,7 +144,7 @@ massey_duncan <- function(geo_large = 'county', ) selected_vars <- vars[c('TotalPop', subgroup)] - out_names <- names(selected_vars) # save for output + out_names <- c(names(selected_vars), 'ALAND') # save for output in_subgroup <- paste0(subgroup, 'E') # Acquire ACO variables and sf geometries @@ -185,7 +185,8 @@ massey_duncan <- function(geo_large = 'county', dplyr::mutate( oid = STATEFP, state = stringr::str_trim(state) - ) + ) %>% + sf::st_drop_geometry() } if (geo_large == 'tract') { out_dat <- out_dat %>% @@ -193,7 +194,8 @@ massey_duncan <- function(geo_large = 'county', oid = paste0(STATEFP, COUNTYFP, TRACTCE), state = stringr::str_trim(state), county = stringr::str_trim(county) - ) + ) %>% + sf::st_drop_geometry() } if (geo_large == 'county') { out_dat <- out_dat %>% @@ -201,7 +203,8 @@ massey_duncan <- function(geo_large = 'county', oid = paste0(STATEFP, COUNTYFP), state = stringr::str_trim(state), county = stringr::str_trim(county) - ) + ) %>% + sf::st_drop_geometry() } if (geo_large == 'place') { stopifnot(is.numeric(year), year >= 2011) # Places only available 2011 onward @@ -221,7 +224,8 @@ massey_duncan <- function(geo_large = 'county', lapply(tmp, function(x) { if (length(x) == 0) NA else x }) }) %>% unlist() - ) + ) %>% + sf::st_drop_geometry() } if (geo_large == 'cbsa') { stopifnot(is.numeric(year), year >= 2010) # CBSAs only available 2010 onward @@ -239,7 +243,8 @@ massey_duncan <- function(geo_large = 'county', lapply(tmp, function(x) { if (length(x) == 0) NA else x }) }) %>% unlist() - ) + ) %>% + sf::st_drop_geometry() } if (geo_large == 'csa') { stopifnot(is.numeric(year), year >= 2011) # CSAs only available 2011 onward @@ -257,7 +262,8 @@ massey_duncan <- function(geo_large = 'county', lapply(tmp, function(x) { if (length(x) == 0) NA else x }) }) %>% unlist() - ) + ) %>% + sf::st_drop_geometry() } if (geo_large == 'metro') { stopifnot(is.numeric(year), year >= 2011) # Metropolitan Divisions only available 2011 onward @@ -275,7 +281,8 @@ massey_duncan <- function(geo_large = 'county', lapply(tmp, function(x) { if (length(x) == 0) NA else x }) }) %>% unlist() - ) + ) %>% + sf::st_drop_geometry() } # Count of racial or ethnic subgroup populations @@ -289,7 +296,7 @@ massey_duncan <- function(geo_large = 'county', } # Compute ACO - ## From Denton & Massey (1988) https://doi.org/10.1093/sf/67.2.281 + ## From Massey & Denton (1988) https://doi.org/10.1093/sf/67.2.281 ## ACO = 1-\frac{\sum_{i=1}^{n}\frac{x_{i}a_{i}}{X}-\sum_{i=1}^{n_{1}}\frac{t_{i}a_{i}}{T_{1}}} ## {\sum_{i=n^{2}}^{n}\frac{t_{i}a_{i}}{T_{2}}-\sum_{i=1}^{n_{1}}\frac{t_{i}a_{i}}{T_{1}}} ## Where for i smaller geographical units are ordered by geographic size from smallest to largest @@ -320,7 +327,7 @@ massey_duncan <- function(geo_large = 'county', sf::st_drop_geometry() # Warning for missingness of census characteristics - missingYN <- out_dat[, c('TotalPopE', in_subgroup)] %>% + missingYN <- out_dat[, c('TotalPopE', in_subgroup, 'ALAND')] %>% sf::st_drop_geometry() names(missingYN) <- out_names missingYN <- missingYN %>% diff --git a/R/ndi-package.R b/R/ndi-package.R index d41a11a..8a9be5d 100644 --- a/R/ndi-package.R +++ b/R/ndi-package.R @@ -24,6 +24,8 @@ #' #' \code{\link{denton}} Computes the aspatial Relative Clustering (\emph{RCL}) based on Massey & Denton (1988) \doi{10.1093/sf/67.2.281}. #' +#' \code{\link{denton_cuzzort}} Computes the aspatial Relative Concentration (\emph{RCO}) based on Massey & Denton (1988) \doi{10.1093/sf/67.2.281} and Duncan, Cuzzort, & Duncan (1961; LC:60007089). +#' #' \code{\link{duncan}} Computes the aspatial Dissimilarity Index (\emph{D}) based on Duncan & Duncan (1955a) \doi{10.2307/2088328}. #' #' \code{\link{duncan_cuzzort}} Computes the aspatial Absolute Centralization (\emph{ACE}) based on Duncan, Cuzzort, & Duncan (1961; LC:60007089) and Massey & Denton (1988) \doi{10.1093/sf/67.2.281}. diff --git a/R/utils.R b/R/utils.R index ff320b6..a75f6b8 100644 --- a/R/utils.R +++ b/R/utils.R @@ -1,29 +1,13 @@ -# Internal function for the Dissimilarity Index -## Duncan & Duncan (1955) https://doi.org/10.2307/2088328 -## Returns NA value if only one smaller geography in a larger geography -ddd_fun <- function(x, omit_NAs) { - xx <- x[ , c('subgroup', 'subgroup_ref')] - if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } - if (nrow(x) < 2 || any(xx < 0) || any(is.na(xx))) { - NA - } else { - x_i <- xx$subgroup - n_i <- sum(x_i, na.rm = TRUE) - y_i <- xx$subgroup_ref - m_i <- sum(y_i, na.rm = TRUE) - D <- 0.5 * sum(abs((x_i/n_i) - (y_i/m_i)), na.rm = TRUE) - return(D) - } -} - # Internal function for the Atkinson Index ## Atkinson (1970) https://doi.org/10.1016/0022-0531(70)90039-6 -## Returns NA value if only one smaller geography in a larger geography +## Returns NA value if only one smaller geography with population in a larger geography ## If denoting the Hölder mean a_fun <- function(x, epsilon, omit_NAs, holder) { - xx <- x[ , c('TotalPopE', 'subgroup')] + xx <- x %>% + dplyr::select(TotalPopE, subgroup) %>% + dplyr::filter(TotalPopE > 0) if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } - if (nrow(x) < 2 || any(xx < 0) || any(is.na(xx))) { + if (nrow(xx) < 2 || any(xx < 0) || any(is.na(xx))) { NA } else { if (holder == TRUE) { @@ -50,116 +34,160 @@ a_fun <- function(x, epsilon, omit_NAs, holder) { } } -# Internal function for the aspatial Interaction Index -## Bell (1954) https://doi.org/10.2307/2574118 -## Returns NA value if only one smaller geography in a larger geography -xpy_star_fun <- function(x, omit_NAs) { - xx <- x[ , c('TotalPopE', 'subgroup', 'subgroup_ixn')] - if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } - if (nrow(x) < 2 || any(xx < 0) || any(is.na(xx))) { +# Internal function for Absolute Centralization +## Duncan, Cuzzort, & Duncan (1961; LC:60007089) +## Returns NA value if only one smaller geography with population in a larger geography +ace_fun <- function(x, lgeom, crs, omit_NAs) { + xx <- x %>% + dplyr::select(TotalPopE, subgroup, ALAND, oid) %>% + dplyr::filter(TotalPopE > 0) + if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(sf::st_drop_geometry(xx)), ] } + if (nrow(sf::st_drop_geometry(xx)) < 2 || any(sf::st_drop_geometry(xx) < 0) || any(is.na(sf::st_drop_geometry(xx)))) { NA } else { + L <- lgeom %>% + dplyr::filter(GEOID == unique(xx$oid)) %>% + sf::st_transform(crs = crs) + C <- L %>% + sf::st_geometry() %>% + sf::st_centroid() + A <- L %>% + sf::st_drop_geometry() + xx <- xx %>% + sf::st_transform(crs = crs) %>% + dplyr::mutate(d = sf::st_distance(sf::st_geometry(.), C)) %>% + dplyr::arrange(d) %>% + sf::st_drop_geometry() x_i <- xx$subgroup - X <- sum(x_i, na.rm = TRUE) - y_i <- xx$subgroup_ixn - t_i <- xx$TotalPopE - xPy_star <- sum((x_i / X) * (y_i / t_i), na.rm = TRUE) - return(xPy_star) + x_n <- sum(x_i, na.rm = TRUE) + X_i <- cumsum(x_i / x_n) + a_i <- xx$ALAND + A_i <- cumsum(a_i / A$ALAND) + I_i <- matrix(c(seq(1, (length(x_i)-1), 1), seq(2, length(x_i), 1)), ncol = 2) + Xi_1Ai <- sum(X_i[I_i[, 1]] * A_i[I_i[, 2]], na.rm = TRUE) + XiA1_1 <- sum(X_i[I_i[, 2]] * A_i[I_i[, 1]], na.rm = TRUE) + ACE <- Xi_1Ai - XiA1_1 + return(ACE) } } -# Internal function for the aspatial Isolation Index -## Lieberson (1981) ISBN-13:978-1-032-53884-6 -## Returns NA value if only one smaller geography in a larger geography -xpx_star_fun <- function(x, omit_NAs) { - xx <- x[ , c('TotalPopE', 'subgroup')] - if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } - if (nrow(x) < 2 || any(xx < 0) || any(is.na(xx))) { +# Internal function for Absolute Clustering +## From Massey & Denton (1988) https://doi.org/10.1093/sf/67.2.281 +## Returns NA value if only one smaller geography with population in a larger geography +acl_fun <- function(x, crs, omit_NAs) { + xx <- x %>% + dplyr::select(TotalPopE, subgroup, ALAND) %>% + dplyr::filter(TotalPopE > 0) + if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(sf::st_drop_geometry(xx)), ] } + if (nrow(sf::st_drop_geometry(xx)) < 2 || any(sf::st_drop_geometry(xx) < 0) || any(is.na(sf::st_drop_geometry(xx)))) { NA } else { + xx <- xx %>% sf::st_transform(crs = crs) + d_ij <- suppressWarnings(sf::st_distance(sf::st_centroid(xx), sf::st_centroid(xx))) + diag(d_ij) <- sqrt(0.6 * xx$ALAND) + c_ij <- -d_ij %>% + units::set_units(value = km) %>% + units::drop_units() %>% + exp() x_i <- xx$subgroup X <- sum(x_i, na.rm = TRUE) + n <- length(x_i) t_i <- xx$TotalPopE - xPx_star <- sum((x_i / X) * (x_i / t_i), na.rm = TRUE) - return(xPx_star) + num <- (sum(x_i / X, na.rm = TRUE) * sum(c_ij * x_i, na.rm = TRUE)) - ((X / n^2) * sum(c_ij, na.rm = TRUE)) + denom <- (sum(x_i / X, na.rm = TRUE) * sum(c_ij * t_i, na.rm = TRUE)) - ((X / n^2) * sum(c_ij, na.rm = TRUE)) + ACL <- num / denom + return(ACL) } } -# Internal function for the aspatial Correlation Ratio -## White (1986) https://doi.org/10.2307/3644339 -## Returns NA value if only one smaller geography in a larger geography -v_fun <- function(x, omit_NAs) { - xx <- x[ , c('TotalPopE', 'subgroup')] +# Internal function for Absolute Concentration +## From Massey & Denton (1988) https://doi.org/10.1093/sf/67.2.281 +## Returns NA value if only one smaller geography with population in a larger geography +aco_fun <- function(x, omit_NAs) { + xx <- x %>% + dplyr::select(TotalPopE, subgroup, ALAND) %>% + dplyr::filter(TotalPopE > 0) if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } - if (nrow(x) < 2 || any(xx < 0) || any(is.na(xx))) { + if (nrow(xx) < 2 || any(xx < 0) || any(is.na(xx))) { NA } else { + a_i <- xx$ALAND x_i <- xx$subgroup X <- sum(x_i, na.rm = TRUE) - t_i <- xx$TotalPopE - N <- sum(t_i, na.rm = TRUE) - xPx_star <- sum((x_i / X) * (x_i / t_i), na.rm = TRUE) - P <- X / N - V <- (xPx_star - P) / (1 - P) - return(V) - } -} - -# Internal function for the aspatial Location Quotient -## Sudano et al. (2013) https://doi.org/10.1016/j.healthplace.2012.09.015 -## Returns NA value if only one smaller geography in a larger geography -lq_fun <- function(x, omit_NAs) { - xx <- x[ , c('TotalPopE', 'subgroup', 'GEOID')] - if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } - if (nrow(x) < 2 || any(xx < 0) || any(is.na(xx))) { - NA - } else { - x_i <- xx$subgroup # x_im - t_i <- xx$TotalPopE # X_i - p_i <- x_i / t_i # p_im - X <- sum(x_i, na.rm = TRUE) # X_m - N <- sum(t_i, na.rm = TRUE) # X - if (anyNA(p_i)) { p_i[is.na(p_i)] <- 0 } - LQ <- p_i / (X / N) # (x_im/X_i)/(X_m/X) - df <- data.frame(LQ = LQ, GEOID = xx$GEOID) - return(df) + xx_tmp <- xx %>% + dplyr::arrange(ALAND) %>% + dplyr::mutate( + t_cs = cumsum(TotalPopE), + n_1 = t_cs <= X, + ) + if (!(TRUE %in% xx_tmp$n_1)) { + xx_1 <- xx_tmp %>% + dplyr::slice(1) + } else { + xx_1 <- xx_tmp %>% + dplyr::filter(n_1 == TRUE) + } + T_1 <- xx_1 %>% + dplyr::summarise( + T_1 = sum(TotalPopE, na.rm = TRUE) + ) %>% + unlist() + xx_tmp <- xx %>% + dplyr::arrange(-ALAND) %>% + dplyr::mutate( + t_cs = cumsum(TotalPopE), + n_2 = t_cs <= X, + ) + if (!(TRUE %in% xx_tmp$n_2)) { + xx_2 <- xx_tmp %>% + dplyr::slice(1) + } else { + xx_2 <- xx_tmp %>% + dplyr::filter(n_2 == TRUE) + } + T_2 <- xx_2 %>% + dplyr::summarise( + T_2 = sum(TotalPopE, na.rm = TRUE) + ) %>% + unlist() + num <- sum((x_i * a_i) / X, na.rm = TRUE) - sum((xx_1$TotalPopE * xx_1$ALAND) / T_1, na.rm = TRUE) + denom <- sum((xx_2$TotalPopE * xx_2$ALAND) / T_2, na.rm = TRUE) - sum((xx_1$TotalPopE * xx_1$ALAND) / T_1, na.rm = TRUE) + ACO_tmp <- (num / denom) + if (is.infinite(ACO_tmp) | is.na(ACO_tmp)) { ACO_tmp <- 0 } + ACO <- 1 - ACO_tmp + return(ACO) } } -# Internal function for the aspatial Local Exposure & Isolation metric -# Bemanian & Beyer (2017) https://doi.org/10.1158/1055-9965.EPI-16-0926 -## Returns NA value if only one smaller geography in a larger geography -lexis_fun <- function(x, omit_NAs) { - xx <- x[ , c('TotalPopE', 'subgroup', 'subgroup_ixn', 'GEOID')] +# Internal function for the Dissimilarity Index +## Duncan & Duncan (1955) https://doi.org/10.2307/2088328 +## Returns NA value if only one smaller geography with population in a larger geography +ddd_fun <- function(x, omit_NAs) { + xx <- x %>% + dplyr::select(TotalPopE, subgroup, subgroup_ref) %>% + dplyr::filter(TotalPopE > 0) if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } - if (nrow(x) < 2 || any(xx < 0) || any(is.na(xx))) { + if (nrow(xx) < 2 || any(xx < 0) || any(is.na(xx))) { NA } else { - p_im <- xx$subgroup / xx$TotalPopE - if (anyNA(p_im)) { p_im[is.na(p_im)] <- 0 } - p_in <- xx$subgroup_ixn / xx$TotalPopE - if (anyNA(p_in)) { p_in[is.na(p_in) ] <- 0 } x_i <- xx$subgroup - X <- sum(x_i, na.rm = TRUE) - y_i <- xx$subgroup_ixn - Y <- sum(y_i, na.rm = TRUE) - t_i <- xx$TotalPopE - N <- sum(t_i, na.rm = TRUE) - P_m <- X / N - P_n <- Y / N - LExIs <- car::logit(p_im * p_in) - car::logit(P_m * P_n) - df <- data.frame(LExIs = LExIs, GEOID = xx$GEOID) - return(df) + n_i <- sum(x_i, na.rm = TRUE) + y_i <- xx$subgroup_ref + m_i <- sum(y_i, na.rm = TRUE) + D <- 0.5 * sum(abs((x_i/n_i) - (y_i/m_i)), na.rm = TRUE) + return(D) } } # Internal function for the aspatial Delta ## Hoover (1941) https://10.1017/S0022050700052980 -## Returns NA value if only one smaller geography in a larger geography +## Returns NA value if only one smaller geography with population in a larger geography del_fun <- function(x, omit_NAs) { - xx <- x[ , c('subgroup', 'ALAND')] + xx <- x %>% + dplyr::select(TotalPopE, subgroup, ALAND) %>% + dplyr::filter(TotalPopE > 0) if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } - if (nrow(x) < 2 || any(xx < 0) || any(is.na(xx))) { + if (nrow(xx) < 2 || any(xx < 0) || any(is.na(xx))) { NA } else { x_i <- xx$subgroup @@ -171,43 +199,37 @@ del_fun <- function(x, omit_NAs) { } } -# Internal function for an index of spatial proximity -## White (1986) https://doi.org/10.2307/3644339 -## Returns NA value if only one smaller geography in a larger geography -sp_fun <- function(x, crs, omit_NAs) { - xx <- x[ , c('TotalPopE', 'subgroup', 'subgroup_ref', 'ALAND')] - if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(sf::st_drop_geometry(xx)), ] } - if (nrow(sf::st_drop_geometry(x)) < 2 || any(sf::st_drop_geometry(xx) < 0) || any(is.na(sf::st_drop_geometry(xx)))) { +# Internal function for the Dissimilarity Index +## James & Taeuber (1985) https://doi.org/10.2307/270845 +## Returns NA value if only one smaller geography with population in a larger geography +djt_fun <- function(x, omit_NAs) { + xx <- x %>% + dplyr::select(TotalPopE, subgroup) %>% + dplyr::filter(TotalPopE > 0) + if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } + if (nrow(xx) < 2 || any(xx < 0) || any(is.na(xx))) { NA } else { - xx <- xx %>% sf::st_transform(crs = crs) - d_ij <- suppressWarnings(sf::st_distance(sf::st_centroid(xx), sf::st_centroid(xx))) - diag(d_ij) <- sqrt(0.6 * xx$ALAND) - c_ij <- -d_ij %>% - units::set_units(value = km) %>% - units::drop_units() %>% - exp() x_i <- xx$subgroup X <- sum(x_i, na.rm = TRUE) - y_i <- xx$subgroup_ref - Y <- sum(y_i, na.rm = TRUE) t_i <- xx$TotalPopE N <- sum(t_i, na.rm = TRUE) - P_xx <- sum((x_i * x_i * c_ij) / X^2, na.rm = TRUE) - P_xy <- sum((x_i * y_i * c_ij) / (X * Y), na.rm = TRUE) - P_tt <- sum((t_i * t_i * c_ij) / N^2, na.rm = TRUE) - SP <- ((X * P_xx) + (Y * P_xy)) / (N * P_tt) - return(SP) + p_i <- x_i / t_i + P <- X / N + D <- sum(t_i * abs(p_i - P), na.rm = TRUE) / (2 * N * P * (1 - P)) + return(D) } } # Internal function for the Gini Index ## Gini (1921) https://doi.org/10.2307/2223319 -## Returns NA value if only one smaller geography in a larger geography +## Returns NA value if only one smaller geography with population in a larger geography g_fun <- function(x, omit_NAs) { - xx <- x[ , c('TotalPopE', 'subgroup')] + xx <- x %>% + dplyr::select(TotalPopE, subgroup) %>% + dplyr::filter(TotalPopE > 0) if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } - if (nrow(x) < 2 || any(xx < 0) || any(is.na(xx))) { + if (nrow(xx) < 2 || any(xx < 0) || any(is.na(xx))) { NA } else { x_i <- xx$subgroup @@ -224,37 +246,19 @@ g_fun <- function(x, omit_NAs) { } } -# Internal function for the Dissimilarity Index -## James & Taeuber (1985) https://doi.org/10.2307/270845 -## Returns NA value if only one smaller geography in a larger geography -djt_fun <- function(x, omit_NAs) { - xx <- x[ , c('TotalPopE', 'subgroup')] - if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } - if (nrow(x) < 2 || any(xx < 0) || any(is.na(xx))) { - NA - } else { - x_i <- xx$subgroup - X <- sum(x_i, na.rm = TRUE) - t_i <- xx$TotalPopE - N <- sum(t_i, na.rm = TRUE) - p_i <- x_i / t_i - P <- X / N - D <- sum(t_i * abs(p_i - P), na.rm = TRUE) / (2 * N * P * (1 - P)) - return(D) - } -} - # Internal function for Entropy ## Theil (1972) https://doi.org/10.1080/0022250X.1971.9989795 -## Returns NA value if only one smaller geography in a larger geography +## Returns NA value if only one smaller geography with population in a larger geography ## Note: Differs from Massey & Denton (1988) https://doi.org/10.1093/sf/67.2.281 ## by taking the absolute value of (E-E_{i}) so extent of the output is ## {0, 1} as designed by Theil (1972) instead of {-Inf, Inf} as described in ## Massey & Denton (1988) h_fun <- function(x, omit_NAs) { - xx <- x[ , c('TotalPopE', 'subgroup')] + xx <- x %>% + dplyr::select(TotalPopE, subgroup) %>% + dplyr::filter(TotalPopE > 0) if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } - if (nrow(x) < 2 || any(xx < 0) || any(is.na(xx))) { + if (nrow(xx) < 2 || any(xx < 0) || any(is.na(xx))) { NA } else { x_i <- xx$subgroup @@ -276,48 +280,67 @@ h_fun <- function(x, omit_NAs) { } } -# Internal function for Absolute Centralization -## Duncan, Cuzzort, & Duncan (1961; LC:60007089) -## Returns NA value if only one smaller geography in a larger geography -ace_fun <- function(x, lgeom, crs, omit_NAs) { - xx <- x[ , c('oid', 'subgroup', 'ALAND')] - if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(sf::st_drop_geometry(xx)), ] } - if (nrow(sf::st_drop_geometry(x)) < 2 || any(sf::st_drop_geometry(xx) < 0) || any(is.na(sf::st_drop_geometry(xx)))) { +# Internal function for the aspatial Local Exposure & Isolation metric +# Bemanian & Beyer (2017) https://doi.org/10.1158/1055-9965.EPI-16-0926 +## Returns NA value if only one smaller geography with population in a larger geography +lexis_fun <- function(x, omit_NAs) { + xx <- x %>% + dplyr::select(TotalPopE, subgroup, subgroup_ixn, GEOID) %>% + dplyr::filter(TotalPopE > 0) + if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } + if (nrow(xx) < 2 || any(xx < 0) || any(is.na(xx))) { NA } else { - L <- lgeom %>% - dplyr::filter(GEOID == unique(xx$oid)) %>% - sf::st_transform(crs = crs) - C <- L %>% - sf::st_geometry() %>% - sf::st_centroid() - A <- L %>% - sf::st_drop_geometry() - xx <- xx %>% - sf::st_transform(crs = crs) %>% - dplyr::mutate(d = sf::st_distance(sf::st_geometry(.), C)) %>% - dplyr::arrange(d) %>% - sf::st_drop_geometry() + p_im <- xx$subgroup / xx$TotalPopE + if (anyNA(p_im)) { p_im[is.na(p_im)] <- 0 } + p_in <- xx$subgroup_ixn / xx$TotalPopE + if (anyNA(p_in)) { p_in[is.na(p_in) ] <- 0 } x_i <- xx$subgroup - x_n <- sum(x_i, na.rm = TRUE) - X_i <- cumsum(x_i / x_n) - a_i <- xx$ALAND - A_i <- cumsum(a_i / A$ALAND) - I_i <- matrix(c(seq(1, (length(x_i)-1), 1), seq(2, length(x_i), 1)), ncol = 2) - Xi_1Ai <- sum(X_i[I_i[, 1]] * A_i[I_i[, 2]], na.rm = TRUE) - XiA1_1 <- sum(X_i[I_i[, 2]] * A_i[I_i[, 1]], na.rm = TRUE) - ACE <- Xi_1Ai - XiA1_1 - return(ACE) + X <- sum(x_i, na.rm = TRUE) + y_i <- xx$subgroup_ixn + Y <- sum(y_i, na.rm = TRUE) + t_i <- xx$TotalPopE + N <- sum(t_i, na.rm = TRUE) + P_m <- X / N + P_n <- Y / N + LExIs <- car::logit(p_im * p_in) - car::logit(P_m * P_n) + df <- data.frame(LExIs = LExIs, GEOID = xx$GEOID) + return(df) + } +} + +# Internal function for the aspatial Location Quotient +## Sudano et al. (2013) https://doi.org/10.1016/j.healthplace.2012.09.015 +## Returns NA value if only one smaller geography with population in a larger geography +lq_fun <- function(x, omit_NAs) { + xx <- x %>% + dplyr::select(TotalPopE, subgroup, GEOID) %>% + dplyr::filter(TotalPopE > 0) + if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } + if (nrow(xx) < 2 || any(xx < 0) || any(is.na(xx))) { + NA + } else { + x_i <- xx$subgroup # x_im + t_i <- xx$TotalPopE # X_i + p_i <- x_i / t_i # p_im + X <- sum(x_i, na.rm = TRUE) # X_m + N <- sum(t_i, na.rm = TRUE) # X + if (anyNA(p_i)) { p_i[is.na(p_i)] <- 0 } + LQ <- p_i / (X / N) # (x_im/X_i)/(X_m/X) + df <- data.frame(LQ = LQ, GEOID = xx$GEOID) + return(df) } } # Internal function for Relative Centralization ## Duncan & Duncan (1955) https://doi.org/10.1086/221609 -## Returns NA value if only one smaller geography in a larger geography +## Returns NA value if only one smaller geography with population in a larger geography rce_fun <- function(x, lgeom, crs, omit_NAs) { - xx <- x[ , c('oid', 'subgroup', 'subgroup_ref')] + xx <- x %>% + dplyr::select(TotalPopE, subgroup, subgroup_ref, oid) %>% + dplyr::filter(TotalPopE > 0) if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(sf::st_drop_geometry(xx)), ] } - if (nrow(sf::st_drop_geometry(x)) < 2 || any(sf::st_drop_geometry(xx) < 0) || any(is.na(sf::st_drop_geometry(xx)))) { + if (nrow(sf::st_drop_geometry(xx)) < 2 || any(sf::st_drop_geometry(xx) < 0) || any(is.na(sf::st_drop_geometry(xx)))) { NA } else { C <- lgeom %>% @@ -344,13 +367,15 @@ rce_fun <- function(x, lgeom, crs, omit_NAs) { } } -# Internal function for Absolute Clustering -## From Denton & Massey (1988) https://doi.org/10.1093/sf/67.2.281 -## Returns NA value if only one smaller geography in a larger geography -acl_fun <- function(x, crs, omit_NAs) { - xx <- x[ , c('TotalPopE', 'subgroup', 'ALAND')] +# Internal function for Relative Clustering +## From Massey & Denton (1988) https://doi.org/10.1093/sf/67.2.281 +## Returns NA value if only one smaller geography with population in a larger geography +rcl_fun <- function(x, crs, omit_NAs) { + xx <- x %>% + dplyr::select(TotalPopE, subgroup, subgroup_ref, ALAND) %>% + dplyr::filter(TotalPopE > 0) if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(sf::st_drop_geometry(xx)), ] } - if (nrow(sf::st_drop_geometry(x)) < 2 || any(sf::st_drop_geometry(xx) < 0) || any(is.na(sf::st_drop_geometry(xx)))) { + if (nrow(sf::st_drop_geometry(xx)) < 2 || any(sf::st_drop_geometry(xx) < 0) || any(is.na(sf::st_drop_geometry(xx)))) { NA } else { xx <- xx %>% sf::st_transform(crs = crs) @@ -362,22 +387,24 @@ acl_fun <- function(x, crs, omit_NAs) { exp() x_i <- xx$subgroup X <- sum(x_i, na.rm = TRUE) - n <- length(x_i) - t_i <- xx$TotalPopE - num <- (sum(x_i / X, na.rm = TRUE) * sum(c_ij * x_i, na.rm = TRUE)) - ((X / n^2) * sum(c_ij, na.rm = TRUE)) - denom <- (sum(x_i / X, na.rm = TRUE) * sum(c_ij * t_i, na.rm = TRUE)) - ((X / n^2) * sum(c_ij, na.rm = TRUE)) - ACL <- num / denom - return(ACL) + y_i <- xx$subgroup_ref + Y <- sum(y_i, na.rm = TRUE) + P_xx <- sum((x_i * x_i * c_ij) / X^2, na.rm = TRUE) + P_yy <- sum((y_i * y_i * c_ij) / Y^2, na.rm = TRUE) + RCL <- (P_xx / P_yy) - 1 + return(RCL) } } -# Internal function for Relative Clustering -## From Denton & Massey (1988) https://doi.org/10.1093/sf/67.2.281 -## Returns NA value if only one smaller geography in a larger geography -rcl_fun <- function(x, crs, omit_NAs) { - xx <- x[ , c('subgroup', 'subgroup_ref', 'ALAND')] +# Internal function for an index of spatial proximity +## White (1986) https://doi.org/10.2307/3644339 +## Returns NA value if only one smaller geography with population in a larger geography +sp_fun <- function(x, crs, omit_NAs) { + xx <- x %>% + dplyr::select(TotalPopE, subgroup, subgroup_ref, ALAND) %>% + dplyr::filter(TotalPopE > 0) if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(sf::st_drop_geometry(xx)), ] } - if (nrow(sf::st_drop_geometry(x)) < 2 || any(sf::st_drop_geometry(xx) < 0) || any(is.na(sf::st_drop_geometry(xx)))) { + if (nrow(sf::st_drop_geometry(xx)) < 2 || any(sf::st_drop_geometry(xx) < 0) || any(is.na(sf::st_drop_geometry(xx)))) { NA } else { xx <- xx %>% sf::st_transform(crs = crs) @@ -391,28 +418,33 @@ rcl_fun <- function(x, crs, omit_NAs) { X <- sum(x_i, na.rm = TRUE) y_i <- xx$subgroup_ref Y <- sum(y_i, na.rm = TRUE) + t_i <- xx$TotalPopE + N <- sum(t_i, na.rm = TRUE) P_xx <- sum((x_i * x_i * c_ij) / X^2, na.rm = TRUE) - P_yy <- sum((y_i * y_i * c_ij) / Y^2, na.rm = TRUE) - RCL <- (P_xx / P_yy) - 1 - return(RCL) + P_xy <- sum((x_i * y_i * c_ij) / (X * Y), na.rm = TRUE) + P_tt <- sum((t_i * t_i * c_ij) / N^2, na.rm = TRUE) + SP <- ((X * P_xx) + (Y * P_xy)) / (N * P_tt) + return(SP) } } -# Internal function for Absolute Concentration -## From Denton & Massey (1988) https://doi.org/10.1093/sf/67.2.281 -## Returns NA value if only one smaller geography in a larger geography -aco_fun <- function(x, omit_NAs) { - # x <- out_tmp[[12]] - xx <- x[ , c('TotalPopE', 'subgroup', 'ALAND')] - if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(sf::st_drop_geometry(xx)), ] } - if (nrow(sf::st_drop_geometry(x)) < 2 || any(sf::st_drop_geometry(xx) < 0) || any(is.na(sf::st_drop_geometry(xx)))) { +# Internal function for Relative Concentration +## From Massey & Denton (1988) https://doi.org/10.1093/sf/67.2.281 +## Returns NA value if only one smaller geography with population in a larger geography +rco_fun <- function(x, omit_NAs) { + xx <- x %>% + dplyr::select(TotalPopE, subgroup, subgroup_ref, ALAND) %>% + dplyr::filter(TotalPopE > 0) + if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } + if (nrow(xx) < 2 || any(xx < 0) || any(is.na(xx))) { NA } else { a_i <- xx$ALAND x_i <- xx$subgroup X <- sum(x_i, na.rm = TRUE) + y_i <- xx$subgroup_ref + Y <- sum(y_i, na.rm = TRUE) xx_tmp <- xx %>% - sf::st_drop_geometry(xx) %>% dplyr::arrange(ALAND) %>% dplyr::mutate( t_cs = cumsum(TotalPopE), @@ -425,18 +457,12 @@ aco_fun <- function(x, omit_NAs) { xx_1 <- xx_tmp %>% dplyr::filter(n_1 == TRUE) } - if (nrow(xx_1) == 1 & 0 %in% xx_1$TotalPopE) { - xx_1 <- xx_tmp %>% - dplyr::filter(TotalPopE > 0) %>% - dplyr::slice(1) - } T_1 <- xx_1 %>% dplyr::summarise( - T_1 = sum(TotalPopE) + T_1 = sum(TotalPopE, na.rm = TRUE) ) %>% unlist() xx_tmp <- xx %>% - sf::st_drop_geometry(xx) %>% dplyr::arrange(-ALAND) %>% dplyr::mutate( t_cs = cumsum(TotalPopE), @@ -449,21 +475,80 @@ aco_fun <- function(x, omit_NAs) { xx_2 <- xx_tmp %>% dplyr::filter(n_2 == TRUE) } - if (nrow(xx_2) == 1 & 0 %in% xx_2$TotalPopE) { - xx_2 <- xx_tmp %>% - dplyr::filter(TotalPopE > 0) %>% - dplyr::slice(1) - } T_2 <- xx_2 %>% dplyr::summarise( - T_2 = sum(TotalPopE) + T_2 = sum(TotalPopE, na.rm = TRUE) ) %>% unlist() - num <- sum((x_i * a_i) / X, na.rm = TRUE) - sum((xx_1$TotalPopE * xx_1$ALAND) / T_1, na.rm = TRUE) - denom <- sum((xx_2$TotalPopE * xx_2$ALAND) / T_2, na.rm = TRUE) - sum((xx_1$TotalPopE * xx_1$ALAND) / T_1, na.rm = TRUE) - ACO_tmp <- (num / denom) - if (is.infinite(ACO_tmp) | is.na(ACO_tmp)) { ACO_tmp <- 0 } - ACO <- 1 - ACO_tmp - return(ACO) + num <- sum((x_i * a_i) / X, na.rm = TRUE) / sum((y_i * a_i) / Y, na.rm = TRUE) + denom <- sum((xx_1$TotalPopE * xx_1$ALAND) / T_1, na.rm = TRUE) / sum((xx_2$TotalPopE * xx_2$ALAND) / T_2, na.rm = TRUE) + RCO <- (num - 1) / (denom - 1) + if (is.na(RCO)) { RCO <- 0 } + if (is.infinite(RCO) & sign(RCO) == -1 ) { RCO <- -1 } + if (is.infinite(RCO) & sign(RCO) == 1) { RCO <- 1 } + # if (is.finite(RCO) & RCO < -1) { RCO <- -1 } + # if (is.finite(RCO) & RCO > -1) { RCO <- 1 } + return(RCO) + } +} + +# Internal function for the aspatial Correlation Ratio +## White (1986) https://doi.org/10.2307/3644339 +## Returns NA value if only one smaller geography with population in a larger geography +v_fun <- function(x, omit_NAs) { + xx <- x %>% + dplyr::select(TotalPopE, subgroup) %>% + dplyr::filter(TotalPopE > 0) + if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } + if (nrow(xx) < 2 || any(xx < 0) || any(is.na(xx))) { + NA + } else { + x_i <- xx$subgroup + X <- sum(x_i, na.rm = TRUE) + t_i <- xx$TotalPopE + N <- sum(t_i, na.rm = TRUE) + xPx_star <- sum((x_i / X) * (x_i / t_i), na.rm = TRUE) + P <- X / N + V <- (xPx_star - P) / (1 - P) + return(V) + } +} + +# Internal function for the aspatial Isolation Index +## Lieberson (1981) ISBN-13:978-1-032-53884-6 +## Returns NA value if only one smaller geography with population in a larger geography +xpx_star_fun <- function(x, omit_NAs) { + xx <- x %>% + dplyr::select(TotalPopE, subgroup) %>% + dplyr::filter(TotalPopE > 0) + if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } + if (nrow(xx) < 2 || any(xx < 0) || any(is.na(xx))) { + NA + } else { + x_i <- xx$subgroup + X <- sum(x_i, na.rm = TRUE) + t_i <- xx$TotalPopE + xPx_star <- sum((x_i / X) * (x_i / t_i), na.rm = TRUE) + return(xPx_star) + } +} + +# Internal function for the aspatial Interaction Index +## Bell (1954) https://doi.org/10.2307/2574118 +## Returns NA value if only one smaller geography with population in a larger geography +xpy_star_fun <- function(x, omit_NAs) { + xx <- x %>% + dplyr::select(TotalPopE, subgroup, subgroup_ixn) %>% + dplyr::filter(TotalPopE > 0) + if (omit_NAs == TRUE) { xx <- xx[stats::complete.cases(xx), ] } + if (nrow(xx) < 2 || any(xx < 0) || any(is.na(xx))) { + NA + } else { + x_i <- xx$subgroup + X <- sum(x_i, na.rm = TRUE) + y_i <- xx$subgroup_ixn + t_i <- xx$TotalPopE + xPy_star <- sum((x_i / X) * (y_i / t_i), na.rm = TRUE) + return(xPy_star) } } diff --git a/R/white_blau.R b/R/white_blau.R index 5b81caa..15041b8 100644 --- a/R/white_blau.R +++ b/R/white_blau.R @@ -177,7 +177,7 @@ white_blau <- function(geo_large = 'county', ) selected_vars <- vars[c('TotalPop', subgroup, subgroup_ref)] - out_names <- names(selected_vars) # save for output + out_names <- c(names(selected_vars), 'ALAND') # save for output in_subgroup <- paste0(subgroup, 'E') in_subgroup_ref <- paste0(subgroup_ref, 'E') @@ -361,7 +361,7 @@ white_blau <- function(geo_large = 'county', sf::st_drop_geometry() # Warning for missingness of census characteristics - missingYN <- out_dat[, c('TotalPopE', in_subgroup, in_subgroup_ref)] %>% + missingYN <- out_dat[, c('TotalPopE', in_subgroup, in_subgroup_ref, 'ALAND')] %>% sf::st_drop_geometry() names(missingYN) <- out_names missingYN <- missingYN %>% diff --git a/README.md b/README.md index 17c2a1a..73421d9 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ [![DOI](https://zenodo.org/badge/521439746.svg)](https://zenodo.org/badge/latestdoi/521439746) -**Date repository last updated**: 2024-08-31 +**Date repository last updated**: 2024-09-01 ### Overview @@ -67,6 +67,10 @@ To install the development version from GitHub: Compute the aspatial racial or ethnic Relative Clustering (RCL) based on Massey & Denton (1988) +denton_cuzzort +Compute the aspatial racial or ethnic Relative Concentration (RCO) based on Massey & Denton (1988) and Duncan, Cuzzort, & Duncan (1961; LC:60007089) + + duncan Compute the aspatial racial or ethnic Dissimilarity Index (D) based on Duncan & Duncan (1955a) @@ -261,6 +265,7 @@ ggplot() + 'Neighborhood Deprivation Index\nContinuous (Messer, non-imputed)', subtitle = 'Washington, D.C. tracts as the referent' ) +ggsave(file.path('man', 'figures', 'messer1.png'), height = 7, width = 7) ## Categorical Index (Quartiles) ### Rename '9-NDI not avail' level as NA for plotting @@ -293,6 +298,7 @@ ggplot() + 'Neighborhood Deprivation Index\nQuartiles (Messer, non-imputed)', subtitle = 'Washington, D.C. tracts as the referent' ) +ggsave(file.path('man', 'figures', 'messer2.png'), height = 7, width = 7) ``` ![](man/figures/messer1.png) @@ -358,6 +364,7 @@ ggplot() + 'Neighborhood Deprivation Index\nContinuous (Powell-Wiley, non-imputed)', subtitle = 'Washington, D.C. tracts as the referent' ) +ggsave(file.path('man', 'figures', 'powell_wiley1.png'), height = 7, width = 7) ## Non-imputed missing tracts (Categorical quintiles) ### Rename '9-NDI not avail' level as NA for plotting @@ -390,6 +397,7 @@ ggplot() + Population-weighted Quintiles (Powell-Wiley, non-imputed)', subtitle = 'Washington, D.C. tracts as the referent' ) +ggsave(file.path('man', 'figures', 'powell_wiley2.png'), height = 7, width = 7) ``` ![](man/figures/powell_wiley1.png) @@ -413,6 +421,7 @@ ggplot() + 'Neighborhood Deprivation Index\nContinuous (Powell-Wiley, imputed)', subtitle = 'Washington, D.C. tracts as the referent' ) +ggsave(file.path('man', 'figures', 'powell_wiley3.png'), height = 7, width = 7) ## Imputed missing tracts (Categorical quintiles) ### Rename '9-NDI not avail' level as NA for plotting @@ -444,6 +453,7 @@ ggplot() + 'Neighborhood Deprivation Index\nPopulation-weighted Quintiles (Powell-Wiley, imputed)', subtitle = 'Washington, D.C. tracts as the referent' ) +ggsave(file.path('man', 'figures', 'powell_wiley4.png'), height = 7, width = 7) ``` ![](man/figures/powell_wiley3.png) @@ -478,7 +488,11 @@ table(NDI_2020_DC$NDIQuart, NDI_2020_DC$NDIQuint) # Racial Isolation Index based on Anthopolos et al. (2011) ## Selected subgroup: Not Hispanic or Latino, Black or African American alone -RI_2020_DC <- anthopolos(state = 'DC', year = 2020, subgroup = 'NHoLB') +RI_2020_DC <- anthopolos( + state = 'DC', + year = 2020, + subgroup = 'NHoLB' +) # Obtain the 2020 census tracts from the 'tigris' package tract_2020_DC <- tracts(state = 'DC', year = 2020, cb = TRUE) @@ -500,10 +514,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Racial Isolation Index\n - Not Hispanic or Latino, Black or African American alone (Anthopolos)', + 'Racial Isolation Index\nNot Hispanic or Latino, Black or African American alone (Anthopolos)', subtitle = 'Washington, D.C. tracts (not corrected for edge effects)' ) +ggsave(file.path('man', 'figures', 'ri.png'), height = 7, width = 7) ``` ![](man/figures/ri.png) @@ -546,10 +560,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Atkinson Index (Atkinson)\n - Washington, D.C. census block groups to tracts', + 'Atkinson Index (Atkinson)\nCensus block groups within tracts of Washington, D.C.', subtitle = expression(paste('Black non-Hispanic (', epsilon, ' = 0.5)')) ) +ggsave(file.path('man', 'figures', 'a.png'), height = 7, width = 7) ``` ![](man/figures/a.png) @@ -594,10 +608,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Atkinson Index (Atkinson) with Hölder mean\n - Washington, D.C. census block groups to tracts', + 'Atkinson Index (Atkinson) with Hölder mean\nCensus block groups within tracts of Washington, D.C.', subtitle = expression(paste('Black non-Hispanic (', epsilon, ' = 0.5)')) ) +ggsave(file.path('man', 'figures', 'a_holder.png'), height = 7, width = 7) ``` ![](man/figures/a_holder.png) @@ -641,10 +655,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Interaction Index (Bell)\n - Washington, D.C. census block groups to tracts', + 'Interaction Index (Bell)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Black non-Hispanic vs. white non-Hispanic' ) +ggsave(file.path('man', 'figures', 'xpy_star.png'), height = 7, width = 7) ``` ![](man/figures/xpy_star.png) @@ -693,10 +707,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Local Exposure and Isolation (Bemanian & Beyer)\n - Washington, D.C. census block groups to tracts', + 'Local Exposure and Isolation (Bemanian & Beyer)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Black non-Hispanic vs. white non-Hispanic' ) +ggsave(file.path('man', 'figures', 'lexis.png'), height = 7, width = 7) ``` ![](man/figures/lexis.png) @@ -708,7 +722,11 @@ ggplot() + # Educational Isolation Index based on Bravo et al. (2021) ## Selected subgroup: without four-year college degree -EI_2020_DC <- bravo(state = 'DC', year = 2020, subgroup = c('LtHS', 'HSGiE', 'SCoAD')) +EI_2020_DC <- bravo( + state = 'DC', + year = 2020, + subgroup = c('LtHS', 'HSGiE', 'SCoAD') +) # Obtain the 2020 census tracts from the 'tigris' package tract_2020_DC <- tracts(state = 'DC', year = 2020, cb = TRUE) @@ -733,6 +751,7 @@ ggplot() + 'Educational Isolation Index\nWithout a four-year college degree (Bravo)', subtitle = 'Washington, D.C. tracts (not corrected for edge effects)' ) +ggsave(file.path('man', 'figures', 'ei.png'), height = 7, width = 7) ``` ![](man/figures/ei.png) @@ -781,14 +800,66 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Relative Clustering (Massey & Denton)\n - Washington, D.C. census block groups to tracts', + 'Relative Clustering (Massey & Denton)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Black non-Hispanic vs. white non-Hispanic' ) +ggsave(file.path('man', 'figures', 'rcl.png'), height = 7, width = 7) ``` ![](man/figures/rcl.png) +```r +# --------------------------------------------------------- # +# Compute aspatial Relative Concentration (Massey & Denton) # +# --------------------------------------------------------- # + +# Relative Concentration based on Massey & Denton (1988) and Duncan, Cuzzort, & Duncan (1961) +## Selected subgroup: Not Hispanic or Latino, Black or African American alone +## Selected subgroup reference: Not Hispanic or Latino, white alone +## Selected large geography: census tract +## Selected small geography: census block group +RCO_2020_DC <- denton_cuzzort( + geo_large = 'tract', + geo_small = 'cbg', + state = 'DC', + year = 2020, + subgroup = 'NHoLB', + subgroup_ref = 'NHoLW' +) + +# Obtain the 2020 census tracts from the 'tigris' package +tract_2020_DC <- tracts(state = 'DC', year = 2020, cb = TRUE) + +# Join the RCO (Massey & Denton) values to the census tract geometry +RCO_2020_DC <- tract_2020_DC %>% + left_join(RCO_2020_DC$rco, by = 'GEOID') + +ggplot() + + geom_sf( + data = RCO_2020_DC, + aes(fill = RCO), + color = 'white' + ) + + theme_bw() + + scale_fill_gradient2( + low = '#998ec3', + mid = '#f7f7f7', + high = '#f1a340', + midpoint = 0 + ) + + labs( + fill = 'Index (Continuous)', + caption = 'Source: U.S. Census ACS 2016-2020 estimates' + ) + + ggtitle( + 'Relative Concentration (Massey & Denton)\nCensus block groups within tracts of Washington, D.C.', + subtitle = 'Black non-Hispanic vs. white non-Hispanic' + ) +ggsave(file.path('man', 'figures', 'rco.png'), height = 7, width = 7) +``` + +![](man/figures/rco.png) + ```r # ----------------------------------------------------------------------- # # Compute aspatial racial or ethnic Dissimilarity Index (Duncan & Duncan) # @@ -828,10 +899,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Dissimilarity Index (Duncan & Duncan)\n - Washington, D.C. census block groups to tracts', + 'Dissimilarity Index (Duncan & Duncan)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Black non-Hispanic vs. white non-Hispanic' ) +ggsave(file.path('man', 'figures', 'ddd.png'), height = 7, width = 7) ``` ![](man/figures/ddd.png) @@ -879,10 +950,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Absolute Centralization (Duncan & Cuzzort)\n - Washington, D.C. census block groups to tracts', + 'Absolute Centralization (Duncan & Cuzzort)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Black non-Hispanic' ) +ggsave(file.path('man', 'figures', 'ace.png'), height = 7, width = 7) ``` ![](man/figures/ace.png) @@ -932,10 +1003,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Relative Centralization (Duncan & Duncan)\n - Washington, D.C. census block groups to tracts', + 'Relative Centralization (Duncan & Duncan)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Black non-Hispanic vs. white non-Hispanic' ) +ggsave(file.path('man', 'figures', 'rce.png'), height = 7, width = 7) ``` ![](man/figures/rce.png) @@ -977,10 +1048,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Gini Index\n - Washington, D.C. census block groups to tracts', + 'Gini Index (Gini)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Black non-Hispanic' ) +ggsave(file.path('man', 'figures', 'g_re.png'), height = 7, width = 7) ``` ![](man/figures/g_re.png) @@ -1022,10 +1093,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Gini Index\n - Washington, D.C. census tracts', + 'Gini Index (Gini)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Income' ) +ggsave(file.path('man', 'figures', 'g_inc.png'), height = 7, width = 7) ``` ![](man/figures/g_inc.png) @@ -1067,10 +1138,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Delta (Hoover)\n - Washington, D.C. census block groups to tracts', + 'Delta (Hoover)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Black non-Hispanic' ) +ggsave(file.path('man', 'figures', 'del.png'), height = 7, width = 7) ``` ![](man/figures/del.png) @@ -1112,10 +1183,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Dissimilarity Index (James & Taeuber)\n - Washington, D.C. census block groups to tracts', + 'Dissimilarity Index (James & Taeuber)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Black non-Hispanic' ) +ggsave(file.path('man', 'figures', 'djt.png'), height = 7, width = 7) ``` ![](man/figures/djt.png) @@ -1313,10 +1384,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Isolation Index (Lieberson)\n - Washington, D.C. census block groups to tracts', + 'Isolation Index (Lieberson)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Black non-Hispanic' ) +ggsave(file.path('man', 'figures', 'xpx_star.png'), height = 7, width = 7) ``` ![](man/figures/xpx_star.png) @@ -1364,10 +1435,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Absolute Clustering (Massey & Denton)\n - Washington, D.C. census block groups to tracts', + 'Absolute Clustering (Massey & Denton)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Black non-Hispanic' ) +ggsave(file.path('man', 'figures', 'acl.png'), height = 7, width = 7) ``` ![](man/figures/acl.png) @@ -1409,10 +1480,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Absolute Concentration (Massey & Denton)\n - Washington, D.C. census block groups to tracts', + 'Absolute Concentration (Massey & Denton)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Black non-Hispanic' ) +ggsave(file.path('man', 'figures', 'aco.png'), height = 7, width = 7) ``` ![](man/figures/aco.png) @@ -1454,10 +1525,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Location Quotient (Sudano)\n - Washington, D.C. census tracts vs. "state"', + 'Location Quotient (Sudano)\nCensus tracts within "state"" of Washington, D.C.', subtitle = 'Black non-Hispanic' ) +ggsave(file.path('man', 'figures', 'lq.png'), height = 7, width = 7) ``` ![](man/figures/lq.png) @@ -1499,10 +1570,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Entropy (Theil)\n - Washington, D.C. census block groups to tracts', + 'Entropy (Theil)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Black non-Hispanic' ) +ggsave(file.path('man', 'figures', 'h.png'), height = 7, width = 7) ``` ![](man/figures/h.png) @@ -1538,21 +1609,16 @@ ggplot() + color = 'white' ) + theme_bw() + - scale_fill_gradient2( - low = '#998ec3', - mid = '#f7f7f7', - high = '#f1a340', - midpoint = 0 - ) + + scale_fill_viridis_c() + labs( fill = 'Index (Continuous)', caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'Correlation Ratio (White)\n - Washington, D.C. census block groups to tracts', + 'Correlation Ratio (White)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Black non-Hispanic' ) +ggsave(file.path('man', 'figures', 'v.png'), height = 7, width = 7) ``` ![](man/figures/v.png) @@ -1600,10 +1666,10 @@ ggplot() + caption = 'Source: U.S. Census ACS 2016-2020 estimates' ) + ggtitle( - 'An index of spatial proximity (White)\n - Washington, D.C. census block groups to tracts', + 'An index of spatial proximity (White)\nCensus block groups within tracts of Washington, D.C.', subtitle = 'Black non-Hispanic vs. white non-Hispanic' ) +ggsave(file.path('man', 'figures', 'sp.png'), height = 7, width = 7) ``` ![](man/figures/sp.png) diff --git a/cran-comments.md b/cran-comments.md index 4957cf6..4cf8f91 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -2,6 +2,7 @@ * Actions taken since previous submission: * Added `denton()` function to compute the aspatial racial or ethnic Relative Clustering (*RCL*) based on [Massey & Denton (1988)](https://doi.org/10.1093/sf/67.2.281) + * Added `denton_cuzzort()` function to compute the aspatial racial or ethnic Relative Concentration (*RCO*) based on [Massey & Denton (1988)](https://doi.org/10.1093/sf/67.2.281) and Duncan, Cuzzort, & Duncan (1961; LC:60007089) * Added `duncan_cuzzort()` function to compute the aspatial racial or ethnic Absolute Centralization (*ACE*) based on Duncan, Cuzzort, & Duncan (1961; LC:60007089) and [Massey & Denton (1988)](https://doi.org/10.1093/sf/67.2.281) * Added `duncan_duncan()` function to compute the aspatial racial or ethnic Relative Centralization (*RCE*) based on [Duncan & Duncan (1955b)](https://doi.org/10.1086/221609) and [Massey & Denton (1988)](https://doi.org/10.1093/sf/67.2.281) * Added `hoover()` function to compute the aspatial racial or ethnic Delta (*DEL*) based on [Hoover (1941)](https://doi.org/10.1017/S0022050700052980) and Duncan, Cuzzort, & Duncan (1961; LC:60007089) @@ -11,7 +12,7 @@ * Added `massey_duncan()` function to compute the aspatial racial or ethnic Absolute Concentration (*ACO*) based on [Massey & Denton (1988)](https://doi.org/10.1093/sf/67.2.281) and Duncan, Cuzzort, & Duncan (1961; LC:60007089) * Added `theil()` function the aspatial racial or ethnic Entropy (*H*) based on Theil (1972; ISBN:978-0-444-10378-9) and [Theil & Finizza (1971)](https://doi.org/110.1080/0022250X.1971.9989795) * Added `white_blau()` function to compute an index of spatial proximity (*SP*) based on [White (1986)](https://doi.org/10.2307/3644339) and Blau (1977; ISBN-13:978-0-029-03660-0) - * Added `geo_large = 'place'` for census-designated places, `geo_large = 'cbsa'` for core-based statistical areas, `geo_large = 'csa'` for combined statistical areas, and `geo_large = 'metro'` for metropolitan divisions as the larger geographical unit in `atkinson()`, `bell()`, `bemanian_beyer()`, `denton()`, `duncan()`, `duncan_cuzzort()`, `duncan_duncan()`, `hoover()`, `james_taeuber()`, `lieberson()`, `massey()`, `massey_duncan()`, `sudano()`, `theil()`, and `white()`, `white_blau()` functions. + * Added `geo_large = 'place'` for census-designated places, `geo_large = 'cbsa'` for core-based statistical areas, `geo_large = 'csa'` for combined statistical areas, and `geo_large = 'metro'` for metropolitan divisions as the larger geographical unit in `atkinson()`, `bell()`, `bemanian_beyer()`, `denton()`, `denton_cuzzort()`, `duncan()`, `duncan_cuzzort()`, `duncan_duncan()`, `hoover()`, `james_taeuber()`, `lieberson()`, `massey()`, `massey_duncan()`, `sudano()`, `theil()`, and `white()`, `white_blau()` functions. * Added census block group computation for `anthopolos()` by specifying `geo == 'cbg'` or `geo == 'block group'` * Added `holder` argument to `atkinson()` function to toggle the computation with or without the Hölder mean. The function can now compute *A* without the Hölder mean. The default is `holder = FALSE`. * Added `crs` argument to `anthopolos()`, `bravo()`, and `white_blau()` functions to provide spatial projection of the distance-based metrics @@ -46,7 +47,7 @@ * * -* Some tests and examples for `anthopolos()`, `atkinson()`, `bell()`, `bemanian_beyer()`, `bravo()`, `denton()`, `duncan()`, `duncan_cuzzort()`, `duncan_duncan()`, `gini()`, `hoover()`, `james_taeuber()`, `krieger()`, `lieberson()`, `massey()`, `massey_duncan()`, `messer()`, `powell_wiley()`, `sudano()`, `theil()`, `white()`, and `white_blau()` functions require a Census API key so they are skipped if NULL or not run +* Some tests and examples for `anthopolos()`, `atkinson()`, `bell()`, `bemanian_beyer()`, `bravo()`, `denton()`, `denton_cuzzort()`, `duncan()`, `duncan_cuzzort()`, `duncan_duncan()`, `gini()`, `hoover()`, `james_taeuber()`, `krieger()`, `lieberson()`, `massey()`, `massey_duncan()`, `messer()`, `powell_wiley()`, `sudano()`, `theil()`, `white()`, and `white_blau()` functions require a Census API key so they are skipped if NULL or not run ## Test environments * local Windows install, R 4.4.1 diff --git a/inst/CITATION b/inst/CITATION index 36430fb..4c65114 100755 --- a/inst/CITATION +++ b/inst/CITATION @@ -3,7 +3,7 @@ bibentry(bibtype = 'manual', author = as.person('Ian D. Buller'), publisher = 'The Comprehensive R Archive Network', year = '2024', - number = '0.1.6.9011.', + number = '0.1.6.9012.', doi = '10.5281/zenodo.6989030', url = 'https://cran.r-project.org/package=ndi', @@ -11,7 +11,7 @@ bibentry(bibtype = 'manual', paste('Ian D. Buller (2024).', 'ndi: Neighborhood Deprivation Indices.', 'The Comprehensive R Archive Network.', - 'v0.1.6.9000.', + 'v0.1.6.9012.', 'DOI:10.5281/zenodo.6989030', 'Accessed by: https://cran.r-project.org/package=ndi'), @@ -460,6 +460,44 @@ bibentry(bibtype = 'Book', header = 'And (2):' ) +bibentry(bibtype = 'Article', + title = 'The Dimensions of Residential Segregation', + author = c(as.person('Douglas S. Massey'), + as.person('Nancy A. Denton')), + journal = 'Social Forces', + year = '1988', + volume = '67', + issue = '2', + pages = '281--315', + doi = '10.1093/sf/67.2.281', + + textVersion = + paste('Douglas S. Massey & Nancy A. Denton (1988).', + 'The Dimensions of Residential Segregation.', + 'Social Forces, 67(1), 281-315.', + 'DOI:10.1093/sf/67.2.281'), + + header = 'If you computed RCO (Massey & Denton) values, please also cite (1):' +) + +bibentry(bibtype = 'Book', + title = 'Statistical Geography: Problems in Analyzing Area Data', + author = c(as.person('Otis D. Duncan'), + as.person('Ray P. Cuzzort'), + as.person('Beverly Duncan')), + year = '1961', + publisher = 'Free Press', + lc = '60007089', + + textVersion = + paste('Otis D. Duncan, Ray P. Cuzzort, & Beverly Duncan (1961).', + 'Statistical Geography: Problems in Analyzing Area Data.', + 'Free Press', + 'LC:60007089'), + + header = 'And (2):' +) + bibentry(bibtype = 'Article', title = 'The Dimensions of Residential Segregation', author = c(as.person('Douglas S. Massey'), diff --git a/man/denton_cuzzort.Rd b/man/denton_cuzzort.Rd new file mode 100644 index 0000000..be371e5 --- /dev/null +++ b/man/denton_cuzzort.Rd @@ -0,0 +1,100 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/denton_cuzzort.R +\name{denton_cuzzort} +\alias{denton_cuzzort} +\title{Relative Concentration based on Massey & Denton (1988) and Duncan, Cuzzort, & Duncan (1961)} +\usage{ +denton_cuzzort( + geo_large = "county", + geo_small = "tract", + year = 2020, + subgroup, + subgroup_ref, + omit_NAs = TRUE, + quiet = FALSE, + ... +) +} +\arguments{ +\item{geo_large}{Character string specifying the larger geographical unit of the data. The default is counties \code{geo_large = 'county'}.} + +\item{geo_small}{Character string specifying the smaller geographical unit of the data. The default is census tracts \code{geo_small = 'tract'}.} + +\item{year}{Numeric. The year to compute the estimate. The default is 2020, and the years 2009 onward are currently available.} + +\item{subgroup}{Character string specifying the racial or ethnic subgroup(s) as the comparison population. See Details for available choices.} + +\item{subgroup_ref}{Character string specifying the racial or ethnic subgroup(s) as the reference population. See Details for available choices.} + +\item{omit_NAs}{Logical. If FALSE, will compute index for a larger geographical unit only if all of its smaller geographical units have values. The default is TRUE.} + +\item{quiet}{Logical. If TRUE, will display messages about potential missing census information. The default is FALSE.} + +\item{...}{Arguments passed to \code{\link[tidycensus]{get_acs}} to select state, county, and other arguments for census characteristics} +} +\value{ +An object of class 'list'. This is a named list with the following components: + +\describe{ +\item{\code{rco}}{An object of class 'tbl' for the GEOID, name, and \emph{RCO} at specified larger census geographies.} +\item{\code{rco_data}}{An object of class 'tbl' for the raw census values at specified smaller census geographies.} +\item{\code{missing}}{An object of class 'tbl' of the count and proportion of missingness for each census variable used to compute \emph{RCO}.} +} +} +\description{ +Compute the aspatial Relative Concentration (Massey & Denton) of a selected racial or ethnic subgroup(s) and U.S. geographies. +} +\details{ +This function will compute the aspatial Relative Concentration (\emph{RCO}) of selected racial or ethnic subgroups and U.S. geographies for a specified geographical extent (e.g., the entire U.S. or a single state) based on Massey & Denton (1988) \doi{10.1093/sf/67.2.281} and Duncan, Cuzzort, & Duncan (1961; LC:60007089). This function provides the computation of \emph{RCO} for any of the U.S. Census Bureau race or ethnicity subgroups (including Hispanic and non-Hispanic individuals). + +The function uses the \code{\link[tidycensus]{get_acs}} function to obtain U.S. Census Bureau 5-year American Community Survey characteristics used for the computation. The yearly estimates are available for 2009 onward when ACS-5 data are available (2010 onward for \code{geo_large = 'cbsa'} and 2011 onward for \code{geo_large = 'place'}, \code{geo_large = 'csa'}, or \code{geo_large = 'metro'}) but may be available from other U.S. Census Bureau surveys. The twenty racial or ethnic subgroups (U.S. Census Bureau definitions) are: +\itemize{ +\item \strong{B03002_002}: not Hispanic or Latino \code{'NHoL'} +\item \strong{B03002_003}: not Hispanic or Latino, white alone \code{'NHoLW'} +\item \strong{B03002_004}: not Hispanic or Latino, Black or African American alone \code{'NHoLB'} +\item \strong{B03002_005}: not Hispanic or Latino, American Indian and Alaska Native alone \code{'NHoLAIAN'} +\item \strong{B03002_006}: not Hispanic or Latino, Asian alone \code{'NHoLA'} +\item \strong{B03002_007}: not Hispanic or Latino, Native Hawaiian and Other Pacific Islander alone \code{'NHoLNHOPI'} +\item \strong{B03002_008}: not Hispanic or Latino, Some other race alone \code{'NHoLSOR'} +\item \strong{B03002_009}: not Hispanic or Latino, Two or more races \code{'NHoLTOMR'} +\item \strong{B03002_010}: not Hispanic or Latino, Two races including Some other race \code{'NHoLTRiSOR'} +\item \strong{B03002_011}: not Hispanic or Latino, Two races excluding Some other race, and three or more races \code{'NHoLTReSOR'} +\item \strong{B03002_012}: Hispanic or Latino \code{'HoL'} +\item \strong{B03002_013}: Hispanic or Latino, white alone \code{'HoLW'} +\item \strong{B03002_014}: Hispanic or Latino, Black or African American alone \code{'HoLB'} +\item \strong{B03002_015}: Hispanic or Latino, American Indian and Alaska Native alone \code{'HoLAIAN'} +\item \strong{B03002_016}: Hispanic or Latino, Asian alone \code{'HoLA'} +\item \strong{B03002_017}: Hispanic or Latino, Native Hawaiian and Other Pacific Islander alone \code{'HoLNHOPI'} +\item \strong{B03002_018}: Hispanic or Latino, Some other race alone \code{'HoLSOR'} +\item \strong{B03002_019}: Hispanic or Latino, Two or more races \code{'HoLTOMR'} +\item \strong{B03002_020}: Hispanic or Latino, Two races including Some other race \code{'HoLTRiSOR'} +\item \strong{B03002_021}: Hispanic or Latino, Two races excluding Some other race, and three or more races \code{'HoLTReSOR'} +} + +Use the internal \code{state} and \code{county} arguments within the \code{\link[tidycensus]{get_acs}} function to specify geographic extent of the data output. + +\emph{RCO} is a measure of concentration of racial or ethnic populations within smaller geographical units that are located within larger geographical units. \emph{RCO} is a measure of concentration of racial or ethnic populations within smaller geographical units that are located within larger geographical units. \emph{RCO} can range from -1 to 1 and represents the share of a larger geographical unit occupied by a racial or ethnic subgroup compared to a referent racial or ethnic subgroup. A value of 1 indicates that the concentration of the racial or ethnic subgroup exceeds the concentration of the referent racial or ethnic subgroup at the maximum extent possible. A value of -1 is the converse. Note: Computed as designed, but values smaller than -1 are possible if the racial or ethnic subgroup population is larger than the referent racial or ethnic subgroup population. + +Larger geographical units available include states \code{geo_large = 'state'}, counties \code{geo_large = 'county'}, census tracts \code{geo_large = 'tract'}, census-designated places \code{geo_large = 'place'}, core-based statistical areas \code{geo_large = 'cbsa'}, combined statistical areas \code{geo_large = 'csa'}, and metropolitan divisions \code{geo_large = 'metro'}. Smaller geographical units available include, counties \code{geo_small = 'county'}, census tracts \code{geo_small = 'tract'}, and census block groups \code{geo_small = 'cbg'}. If a larger geographical unit is comprised of only one smaller geographical unit (e.g., a U.S county contains only one census tract), then the \emph{RCO} value returned is NA. If the larger geographical unit is census-designated places \code{geo_large = 'place'}, core-based statistical areas \code{geo_large = 'cbsa'}, combined statistical areas \code{geo_large = 'csa'}, or metropolitan divisions \code{geo_large = 'metro'}, only the smaller geographical units completely within a larger geographical unit are considered in the \emph{V} computation (see internal \code{\link[sf]{st_within}} function for more information) and recommend specifying all states within which the interested larger geographical unit are located using the internal \code{state} argument to ensure all appropriate smaller geographical units are included in the \emph{RCO} computation. +} +\examples{ +\dontrun{ +# Wrapped in \dontrun{} because these examples require a Census API key. + + # Index of spatial proximity of Black populations + ## of census tracts within counties within Georgia, U.S.A., counties (2020) + denton_cuzzort( + geo_large = 'county', + geo_small = 'tract', + state = 'GA', + year = 2020, + subgroup = 'NHoLB', + subgroup_ref = 'NHoLW' + ) + +} + +} +\seealso{ +\code{\link[tidycensus]{get_acs}} for additional arguments for geographic extent selection (i.e., \code{state} and \code{county}). +} diff --git a/man/figures/a.png b/man/figures/a.png index fe361d8728672525ccee83e2491fc465a2981515..017ac44a3d0b414600f35115da6f9eb265a090fb 100644 GIT binary patch literal 384987 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

)qQWWrBF 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


HtJ zfnCI$XrndrZ9Z;oujPgI!BO?`+`6TeTBh{g7LRQuvnANVTINEpW0>8x;j)vH?cF1E zBEq7Oo$#xB>N(wK&ztWbsLiA9(&dh{0gSW4KR2^PNk+>cNE;dT0r<~Ae}TRSTfnMq zap7g@k0o8B0V=$=Oushm#a~OGPi)a^pS7)&97Wzm!(c}Az)KoNCuy+@&X4Y1YU~^+(cbROArY?~I@v zypkYR&|`OSe3I{$CsG^Fy)Lo0-8%bA^A|Dtq-E3vdlxV5u#sp15)|;*3g#302o6+u z`TH^aagX7A-1t>+{t8^=b9q*=Fz#+9^b*%=#xv{s_wx0|b{2;(o_d%$laaL5mQK5krA zi%fignQ-c;q4mr<`oE_OAMPzHti(ZGFHfscV4UuG!8{>P9O}Q(YCXCxUn0IuR~SnZ zGHZod)3Y-u-^7(lvDHdn{Pi}>K9>xq$+}dG^Kn@l z6}qi&E98Z>AP|4&ofohy$*0}_0lM{nj@Ha@KMNhzNuuR;X4ca8g!p(E`!xp#qrg5p zU_o@5?aZBYsit#YO^40`Bju3w1;S8$KiPjSQgEx}^)Hrd7Yx+N;KLp{KFC1j5lfaA zBH}L{{Z^m18wr*Xh>-4?qASY&LAdVe_{6AErLQ=i>vCS}?7+@4DmmKj_Xt0&#V%r5 z%}h%frI_{UzBO?H>>cjArt^dJy8?3m>#Xx}?P?Dbeyz`I`Z#!Cc6e|?6@1Y=@uLxZ zh<=+0!wvR(cav?5hmdMC(*>bkPe1fRTo#~7!@%~9HJwpHK<1}4 z79Sg66cGNpmQ_eY3-pC?aMS~)Ie;^rCU2es*e-InLVy}m+7dyL2Q{m&-dd^g?l1O| za)#nmah6!G2n%RohIKw>6AIMU1b&Rpc6)aG!W!B=nQ}q+FIKc91c=c5u&&RWNeU|z zi30!|;^y)SQi$8OH+E-S=ByO+K8x%xWP0?}uo0z=JW>-)uk3(WB?uFn5~4a&S6?!dK#3c&X1-=zW2u4*c?nPw^PsJCv9ihewWAM9T>tO+hFk->I9hI<7^ zk&k3#hW$}QKodT%?(GWv>RtK6p9RI_Ip!Veq=Bq9S)*DlfkzHgUKwbM8MD@!iui&| zo@wEZ>&wY>p+4K>!R<6IQNn+7{>Xs0U_E@aXP^99qeDJbUWhR}5+X*;NQgYO;iz$( zIZ^8Txp3?E_J=^Z5hMx`jI1^9irs?Gb`tRSab zjmQ#u#0A03*#B%dK)G>k0+DuaigLu^W*9^0{xY$+*t@=wMzVt+y& z`e#-q4&o`6D^YQ$D?f9szbxBf<0P`iZNz(Xk;6pUoE+LMm$=7!YZ#Q8PnMZyaUvEA zRhR};#J&e9Vk(~BWf&c1d-j6ckP|x9U%%x8LqH>X<9rM)I}~FKwA1Kll)%Rb0*p8y zN_2j^8!qXmJ1{Hyx{RnYA|G3Q1{Yy>4yb*f% zWP+@&8w)47$}H2uxP`j}*;N@xz+CJx9X6+~+^->2kNs{d`7_JdUYnc3RJ$SXbHd2n z^MC|=FJIa7KHdWy@VNT)kd5Heql)w)juQ2_sov>mLCX0_pov&s1p^l)bh_NOeb@HL z+ly~;AsraW0}5aaWm_8WJjBsRVw4Pz`-sUJERq`&vE!5@OO+rEtqgBK&WIfm(US|A zbDsC>I!`f0gLZ%cOR`LHN)emd#KUP5qoPVKK%`PKO1f-)rF-g+Zt(0kRvK@3{FG8B z`^M#HqBiXrhDS}OFRNl$`VB}SeUF%87Z1;u{3+vm>ws+)4NWo7^a`{V-`zUEt*|q4 zQ21ZHwoYE8x=6fKg(_gQ)Lk4dcBby)P$$62rSX!X$$)+XIOl-WGz>0Ghjn)xE41jp zx?+w3AS^(;LeE=gz;D%~DLzPq7w2z#udhw6-SASRq|!owe*~`Ia)YRmbW{%jJdKdGA5um#pdqM={e2B6Rrw3g3n{KJ^)-?t>wCIx* z;+Ghfxy~S?mCXr$I;4Z*eQNZ`H4sa=C&}k??F{w9x_`c%v+AjhD z0fqL71}x#z8adf1vt)qTBqY?I#~&%Cj0ue?1_}HqV}hiVK?#>)gNvgf!#hJJ_%8?L z4OMYF{W!pGOh`r_kgmUfp!AzW)zKhM9h+8r@xl3*HmG}#O^s%xsVv*~ZE_jP=l!&> zRVB_J$J)N*1s4nD&PjlGzTsrzuM9!&yfpxy8QAc6O*4?3c-7Mej)BE~Q^}W-6^oCYlYqsq6p%AWrp|O)@k%G@$T(Q1-{D z?DtVwX%D9N!!9n|$$?3W`#MnOowRWY#oI(=0TYJKU`7p}QXL1En}wF_PNnGX>An2} zM~_EBJ>RG-;$#hRsl4>iz558jd5t2v8v+E6O zyZXcCO^}8k1lwOyl!F0E(Za`oQo8*eW)F0t=j7x7o%Vu)fLp6J2wTT%5v@qH` zi3UNe`;u~Av;nZtcvIk!2D0pbOx>0~L6Ve1jqw%5ZE z5`=EV`t4K<*2U`A!SC(s1YP3jG9df!-a2<_)+MS$iSFKUYT_kC2_4<2StP_x9|aH~ zJtyG!4kywq{8D9m80`tTkc|W_ynT9_M!<8B1(3p(e6WSrwH=8X^eVgT*H6to4_ z+@8bof+yZwvENN)s80(l!@?1oi9Y;|XnWCJ;XjVUs7;M}7wWcZIlDGIJl{J!U%(%& zF(6f<3fvp{=&7pY0L2IW@L{O-J$!X4^uxLkQnl@BBDU?3yQ_^W%T0&qp9L*!1e$6Q za&^g9ovH5(viciBu0i&BGhNX|`Vu}~tznhKAjuR#|2&=jf)@+vJ$b~8TdH^+O!d3XT<1u#TK4x=pUG#FqkhO<1EY~)Fm1Fw zGA;n|Myn^I%Xt&ZOGv{?-6sFE7BKzDfAabh4i`bHD&za%eC6hv?Q^h!%r<(MELEZm zC2NVO{!L`tHy=L{o5G@GWACTJMphBkOZ{SX1R>|)BMRr2J_eil13e`}3om@oFVG4D zy{WS2X1Yt^J90I0EE8puH22{aAffTZBRSBQ=Rwm^zyjX1$ZHtcBVnbPIq3dUzj_2u zhX=9FY9b$BU;EXTg53f&5vuqPA3k_`c{LpV#qwcFJK$dLA=i|ZxR2AMeOEyXWZ~&J z_Bc^1z*JNuJzwH!t$!|YG@~DVFD_pd}0r%DNPXKO3ZW+*>$b88FY=lEZ2px!SS$(u`=^yZhlFLT$}2JhYaW!uc> zM*JUu%aNMoixI8J0Tg*xVs#L%XeUC5OX4+Yh^CEiTDJ+Qxt2$%&6oIeO3pVKc-i+C z`VDB4UIe97@Oga!E}=WS$GQ3V^yL{y_J8!;mmily5(psrTiXMI(dmjGG1h0q&YH(6 z-G0n-vqT%qaG-DY60Dgr6c$qf`dErlnde78qoT#bBss2vJiT}W&29>5tghN9N(a_-g5PqpIm0lLDplF9@T%GFHq|HWJ@*0+q* z&M7#T8FgINg1uSy^(Y{+TFH_VWmiXj%%$S!XWTG;>b`;j3n9%y(|(g?vG6}c_bwzr zbi*`$skPqM2z|$A2l0ty&kguf!?8Vd&6a6;D_Oo!y>GA@FSVo@_!fqHx2w<~0|Ntb^(x*R#rxA$zAVPZ zj4e0ZKT`v|KQ*b$E%!7kn=}Ry#cj~xdt_mS|Jju95ZVuN{36=4WiceLj1j{-F2wm! zoJ7U6l5rUAfyN0QR9dWf7Z5;mNmYn zx4WstrPN=A;fGv3;t7>db?eyb zqJ$9N!Z1@OY#AN@$}mKQR3Rg_|MA(1$oUoPJrwz_H4)N&{2sgK@fslJ{k^d_ooGi0qy}26WY+Imve}`NF`r;|0iWHQt6zBeL z5I-BuNU~yR@~tUu_ree$NIA(954gW$=YNw8m)&t#Y+x+4VZ2iV@+f}2OlgBZOM_0m zJD$44cPkyOQY?6-5$Y_IQsVq!)Nr}LxF1>5VscZ*uKD#y01b)$f}3cg{V7SM0yC|A z@&4mgh&?)j=zkj{SpneG7~btmnYVA^`yT9QG}N!0lb0S@68wHTN3prwz+>|{wx5^( zG+Y2<$)&=i4DGY=%fWEyyWhLL)a5*c05 z@nKqPNSPihKgk60lZ`4q5T5iBjH#CqX36VBZ z-7u6>4-zCKB=l`!sNyg;H#Z}L@H2$~tOR0Vtp!G`YGnaDw-TP`N;UAf+p$EFfZMQZ}J|=r|*y;8AT&FTSNlX8Mvv%J&tiHZJ zGqXWmGclAJCfX7ZX;wWI!Ti*cpbmd?_37JPS{jr2c;UL#mO}vTLpCk^Zx~m`0N#Gl zDj(s4ra<#)#Bjm(9g%wi5ZwM`O0!~dSJYW^tM88I&o8^B?*sh~HFNejZTDuI{n<)H z8}{crEy9bmB^vZJXa-PLUu0#0(o@%uRh`OM%Eh&ulJ^?UU>FY@A_8BTYDwuKslr;) z78(WlCNI9J_83)4Xb@u+Yi}4lfdtpdE;S9d{9$`ICC6so#agiW&r##*#NM!7+tL}C z7{Ro~xe`Ty7lqZZE(}ziUEX)U3bFl<`z|GWOM@a2q=SWs`O}jO?jHzLt`Nwl*9mYB z9vaGrRhd=c=g0W=}m=u{^8fY;Mnuzl08Y;1OH*r0|jcr65^S( zm%an=$Z-DUps)Hzrd;?a`%ZbKgy?A0&~8IO^ar?{Vq;;YYT**31JOmy8Z#*z^m|U~ zC;|f%gZW~&HWB&F=s)Cfhzd~9lLd-2j~9OzXWG7jUnc|aO+XftB{@rWT|%-MfIge4D~RQhcE08;AtmrpvPpIj%XK3iA7^<=m5Xt?T)t#!_+G z{C0rUO2R8wEku!2K5~3&cD6!CgUt^Fasn275LpupoQ=jo)G5>Elha5ABhX&;bFjqZWE%XqQ_<-T^L4Gac&TLuEihyq)rc=QC#l zW+E%m|7LFE8v+&o*{z5kAtK%iusVP(T60NhU8E5&C*QnAagtlhSs*>|!dj z^ZeSS2`=RrYc{RCXOD@!Q{q@@Yy=`7|0Fn&1zoc))Oo`eRDTS>|%`iFyw z=Aeu=R^s?>;G2XstDmNjf(B%V3Ff^ce~Ql3WzHYI#3TK$@r z)i2?UN|NxEaxf?e>KmyS($BjISyMFniJ1m@D(u-4zOtF7k><~w|0&P^72za8p&uxG z-P^1YN_hFzh7JM3#q~FpAh3*hUfE<>Rmbw9zp&eEcpYHJaPA%l*GZ*6>cMg*OYKDX zy+o7*skvY2(txfBmf{XbfAG{DF@mn$?10G1l)8_LcZ3TUE(Tn3U=ayDO1_hKV#-zv zPFRQqJE<&N`v<>vCY{Q(u_u|<81Y*(PgT_%Ew(;@&abYfN4gc(3yzOx3fzqW0yWbN z$Y(e?o=++2<*j^nGyV|VL;oi$okat(VdYfiu%RG_l{EBN7cQM^D8+rb zG|bFXro3X%3FpDaEfqt9v<_7U)>mPvbGK$gjX?Mt)#V@rz3O^t6A{-iCU**5QZ(<>)>b?|pqaxU;T^S84Z8&tOKzAhEjT82e0poLJw}vuHDXQq6;5!|-bwUURLthJQVC(+*O{Qx}; zQTG1};4I1V0uXQS69BZBhQ4Ch8?&XNO0192%1Ul`x96|3oSUseYo52YYRcsEWHiWanmtogC|bZhi1q za|8Tpn!K$R87cvFF1Lrub(x6_!8D*rn7eSA;hKRCpx~=yBa(v#s%HvHs@Z=SxOc3@ z4PFTO&OcGbH~zY)pJFrT9R~9dEWZ0Rb0u0BXc6Rvtaq!g_v_@^zFxNi7`2wfnkm`4 zM!g3a;7+HYtq~iZe|{ohK3?d`xuRobVTR`NGCOtAY9W^^LhZgnDpd+#I$g%(1Ny`q z;AomVAQlEbM!}B4B@P2IM5kT*I%rDzLg@_jyS?M~B{PQdVR<2wP2wy?&`PJO&$%iS9vU=l z<@n_0ChljZomEipIP7)<tX<}#snUE=Cm;L}M1u{BWSi=;Jyrri~h7~8L z!rF9OKjFa}?<$B-szbU=99}KwoeG1{plI=W%jQR+9uat9G=me;?bRXYm&^} zUx&k$q=H3NhCT_r6fcKh8ou}-ANky+$NXxtelx+%;q%{n0#)>OqT|;fWB8|`8DUm|*(auqqOA@%Yo(no4!)O#p z>p=$ehKa_-tqsGHL#YBDzJ~e$5&u6>`1KG>#4p001Il;mO)yT@&o@)uJZSEP1pRU^ zYz%F3^Ta||P)hI?uw?)STj?s0?4bzY&z78lKv9*Pvee3vG0RGj9Rthbz3r6((^@HH zXx|Mwr8lZwdFQ9T@6xJ!ndxE!z=))++G1{KBT~oHYN<`P<$>K*=*lF~Ki%s?!DgiY zDlv!Y`fRHbYwG5iP~qM^WMGYo6U6V3-6|Y}W=N0=@++hKLhCY0_Byyq<7j?WziWEB z*g%xy6ffygREApkA-%vSQ}_-Q(K=$%1$89uhe-6=b#5?%TPUT&SEgDX*y zQ7f|-y%2FPKKbz)_qzM*BzfO-nDsEP3+|9Vs-;d_Bk^QH?uUGJJB2%YZ^+p8h>?Vw zt2R{ScfEV`PX6YT!cUdh{B2YHAJM^~ff4nA5w7zPqrl|nk*&_iK@X=h*NIU$$9jU6 zbNGnfN88!&QNC$tP#4E)myddl2;tJHDA1r!M?rt@N`OgkR<^QR_+TXTd5#Gp!A}3* zKX*?%Du)^o!-LIlR|H??ZM8LuX0JjgAq4QB0GCu)Shmc9E`ad>Cb8`vo%OlIfY~@F zVMncxpuj)=FxRs(4lo$;BA&3SIGLkrcWxXLA`++o2>u_YTh;TeA)t!}1T7`c=lCF{ ztX;sAo57RQ_JZbnx$z>g$9r2z>{cCX3CLzs4EAp8-Ro$E_WIjpr6Y#f*;)1lDz|Df zJ8g75o?jE03#Zj)CyBUVUl(%zDTmo(<5>0R|4K9M81_zn{?j{Jm{_sCb;p#7Oraz> zFGlzU!$!jxRzYRn%dB2N&RRz^9l#>&_Gbdtv**ek+$Seb$z+c1Ou;)Ed2+nTylzJ* z@|^X|=rSgJC<0A>OyQ49Wbnz4^_=Uv+es)A8&rR=_FE5}3S)0x23GtD0^qOF8<5<&;1W;lP5TP>QzB=c0&jK@K!-WtRYi zH(c0CiRZHiE=IZO7AuUV3#U)feSps_V4ThVLNHlWTucKD;+>nD`!h*Sw?#4S2m)PS zdy16El1?^x!zJ{>TYF!nDFT4Ae5UgVBdNio2=SlGa!UPey^R2oI39Hs)Q3X#9bN!k z=Y(~HJE>vVubXhsS68W2CAncyKkLjN0X=iFA2izkI?GJ}7nL>AtmL%7&SOpN7ftU&8CENlf+%HS5 z{ZMEPk4ZNpR`VRLCFbhOV+%vA)#>iWjn&iMQav?y2cA_1l&h`iN%w_u)a~ql6l%Rt z@#kZE$=78jH!_#ugw?;AVL1G z*!K?sn=;;KaN*MCXZJhvo-csX1;xJgkFGe@Li6Es4(E**vW?s0xp5q2YE*Z?cbq|z zt9yBMH$iM-B@&F3s4FH+#l@~R8^g80@;%U(Tw~3jE2Qo6CVj^saEh_4s-nqDT z@$k~kB91N^-Z^w~_0Y|#jEZ8^2<_jwF*6JEbc`z-YX<8h!dV7y8%&GpW?*tmbACefb$S#bocxv5*F zzIo)X@>HQDrXT5iy5nz--oCTmDoONYIzPFXCu16`t>?|7LFnrK*kc z#;3h7DtP*J4XtGy{Lh?L4Hv++v`pcU2*o_+b}P|x%7f6(;n0;yX7t!)W_CAzv$ao? zpuf9X5kQyu`B8=-_8e8Uq5WCLV@>))JDY;^LvAl@(T|jg*`67PAN44jXk;9F7QP`qR+qsM<0|XgQI4Za=f{jZ4_J;1`kmN!H^v^kRIbO26-mp90 zu)6|=PrqD$S*+Kxh$;037YsV4{&6R_&q6lky_~NN7<4TGYilv`WadWSpLNw#P2wR%;0MDJ^=XJME7!2P;~kq206 zzWFlOn+1y5zB$4o_jP=h`cPozC{SI?S7sm>ic3$|QB^fDGqkcP9cMykCFpC{XP6lH ziUCq2FAeL32Mx$;%u(-Z^ZnOMV~O{6@)98qMG!Y{zc*H1-Pg3pB3-qu0P;YL)iIb6W$tX=*XsWkpIpub(LO`zKN0>i~TU(^0?+qz0u-qfHqN$>VKFp!Rc1yj(#6FEP|PRct{KhAL{gw~ zcdUg7AVe1AF|;!5aY2LGHrXD3i#$C4b<#1s0p$(_t<)6%)7=USwKc}fVI~L=7ZWwT zybq&L(ZJf`(Bdd3k6^?B{kq|o;-}dVd4ul=Vd<;pH)*xb?^+)5Niy30?yYKjsqe1s z{3_{0wVdkeUYp!(Hybfk>pa@aLM0}eST1PAl zzdX_>ktay%o7OU}E4Z>Yhz^=!y+qAGLh-z4Fft7r!e)_-YxCY6OyCgO$2%|NG(cl6 z76bZc$}=lqWRK_kMdqV<#Qr23WGwjs%tCe54diTd>_ zJp`xlZ;YMX%@>z@<{uLhLBZcDuk@SGEq=0Vsb;WzzHUPVIlQvAvX0rIXnn= zZe|mT<_IHj-kzVWzi%?`zp$Q&_!ia?#gw3g>6<;Cq)p0)m@4^sHvSsrUD8?C7n_Gw zv^=)VJ2&~p9?+Ox+Mkrz?ALvnc)a8n6u5Z#aY{F*mvW}xIrr5X(f_12X%V?_XtDFc zY5sMz<;K?OzN$6O->Yke#;KWqTUfT0QBWXbiBPU>$R(q+X1)>SRbYuQ$4=k(E@&p99?DG zm+pOlp}>&!RJ>kb(3IM_aaJN@s-J}_R%0m=}~I8AzJ(0B-= zvER`VUDNr=Ba*qF@DQ?dUrTtE?z_+6SF?@drFlJqXNI4CABmW>(;9aww( zBQ~NSDH2wpG2%AA?$qW6`TqzbZ4kia`C^Dc2&4Jyc6hV!heRFiT|xtD%jngw;GMyf z?@}_MP2RlBMEUeEAuViRTm+E+7-Lz^G>#M7rTML9_3lc>lD_;`pwoE$jr9{Xmz|~i zh)vaNHh1A>v%I)BR<9x3Z`c=wocxZLYhSl)r#YdOycve0u!`mz=`m6{fTwl)G&4v3 zELxo|DY^P)z<;~fq~Ue~ChNS+vw9|ukxV#(fx9t`DIUXsibT_4r9IZVm8@b3)!uZ= zgvZJb99#QjN@+@vjt2?yjdzlM=u+;GT$i+;JH7BD!q?=}{4ipg z!`+ZzkV-6yzylA0l5vGqV4t0PkoXu*`;j&>LN*dXj^koo>mf;m-^L9_d*DZ8AE&tF8)@2;hk!XxVv0ID|YZtNa> z`UO`?PNX+;Fwf)5U@N<+PqoVPkO{VR-D_UHHynZYOe>YP=&_ z@p2t~m1>9Os;cgV_lsqwy3~6olpKXJTG{SB;*v2``#1IQR}*ya;XT~815f?Y5)k2b zRF~)028V{`W@fr1*A)Q>NCuai!o=%Fc0F_=DK#rkjOHI*pf0ytl}mGYQkKwIrF_f8 zy}LS8+kHM~8(Qab`Ag%~avfgJ4o2{YXOd*Ub+Sn17w3i5epgUHT-Vfh3Ht;NcvE1w zhCUuhljA2h8Me&)D8J@wf4tMB^4~z2uc-94a{d{sRcaarIB!ofAkG(;kdP1+1?HV3 zuCmGm$Hm9*I5k@n=>S#}U!p$(h7v|Onj^YmwMav$7%ea@0L`Pn_Vf+l3+=i2`qvhL zCis7;>clsy+Bf)er038Ybu6g8&^{4h3}^lhMw-%$Z0Rhf@^EXLse4XGqP$iJv?3RO z`dq{W7aoiVQ)S>}QR**|{h13#0l$e%hGKox9^O9<=xwXe=}eMn*A8<`eLL2-uF1C< zX_M2qWmoBwjzaRrp&(!7$Lwb$07SrY||7tFGul-qE>RVe`8Cn<+1v)Le z&HM{YW4=+=I!9Ek`}=N)H%Zc~sUh9`l%(b5X5{6z+q({o zL;&%xf~(!<9hFRN34dpM;{pBNEv;D0pWdTkL8&5r((^v4tam;+)zz6l6|EMlMkK(p zggVGDOu?f%^9AF&`pRv}lkPn&3TZaot-!j9^K?3o<&_+Y%!oJ=dwWH5lqtwJx`{pj z+&moc$?Z_&{z_^#hZ}79*u@vq{n>3XGi|P7lGA@5|<| z8UM8Fq%Eeq5KVUgXuaSe<4H;3G%M2giMfPI3o^bprO7hoc?%XNi%LMD>{fC8!#a-= zPLykD^Fq44k$s0D^SG$sUY^XX)^AMxw8fG=F?`Wi?sN1Z_VCT^c(5-G?5LcZ_gy2tkt(mtDjM^1UDq( z6bBd@SwHpje$67I`}sM(5aN^(`S{1^4aWgH=vN(!x~ty0(#gBb4st9RjUP*6dkDP9 zNNX-WL**OGTUq&vYWcZD%kNjMJ(hoSA~%*tDX)+{S=r6^4a;yMg*(7`#em~f_k~3e zDAsvmpE=7|agOlzWi=Pdv}D{F3U}R;7b1G6j``gT9X)}CR3sL|bViIAj*uP-PPmnK zcdtjXJ8(O;p>I7tdPTS#bT!SaxvIZZUdz&wxEw)NSY@QF_2HR5P1@K=c8(F79~jw%$~rs<)TPoim}ds=9a1u=TuiXW z#>NG~7=wd@lu|7mbt+?99XrbF_@K*~8Ujub8s#8HcuLxSQ92lNueRt;xAt+Hoq!rq zZT{bb`i*q`>+3@lDL9rIgP>}C-5;Fll$A2RqeXCdgm01TTsqxbcWY!}U5|8g4R5u- zG%z+Yv_I?`gw!cdqKeT(Tt#dUAhj%eP^Rh$ecLu*f zclSe&(-r)(-;{=01|^ciO((Fv);rbOY<=7=s+OFGUwwzcQ@~G6kq#q1W-s$Gi(Vat zj))E9al`$vmzv~HKH;;&FkM0n!WZ0;=d!%O z3aMpKwAj&jf3F6uR!J#-)>QWv-0c`oi~E=ok?%>?G;iqh;!xKly^%@l_t+EeVAH$Y zthGp==Urh_mGH;WjMgYyruYFn!uDlD#b2ovQgT*LjB%t=aXn=%=J{j8(!=qg7(l!k z^3452IxsTg;^1KMcLxnj`3qAL$+XJn)x%)Q3{2@9^`{}&eA z-ogUOV0_pp3#!|?+FFJOaVX;L+{O!Jv~7E7U1%v(ru-GM-8R9>L`7I&b3J^ZRH(w$ z7uFK`9X&TEAN8qaRKPGOwd8^Ia7?)=q;N8avS6 zGq3fn#l~bK8UA*hufu=M(N^FjONCVl0zrXXFiEoXqwkM_>;$rl{ zky9}qYKX-RA<}hgDNp%lxruHzpg?G>o2?Q~WJ0meytR7n{=mVuyOfcY1y*{0l1cHy zMo?lVeDMV^Iq32AycPwJ5b+ z=V+lY#4DFGA(rQ<$tT@J`3EJGq7Av{)#qhTFLu|uIyTco3*W2if)mYN`}Z0uruFRSz%B z`fssz!$uW9zYIFCNH%)JTyo_|ya-q^ivxEtr55{kSJ{ zKEo=IP@4)~v#~k*D&A#c7$E@zh)1{PDv(P$dl+fc$;PR5D^&Fm{})r9VS_Q?E*-~v zD*39H?LT@?K9-?2_Zu6$9PHJbj2mFIRw!RimjrJ$d8-tupR@y2Nn65Em+KUR%I?uI zdTGBWG9E#?16y@%Bl(lGv4&rq+SSgODiTMB9XdziHY9Du?wvfVT)J8FjgwG00crNz zmpRMNm*Ji6KZsd*M8*~O);W|Ckjl7&5+r2?D(5FEJp-Ojw4Ly=cHq7>;op>7pJBhh z6<*#_C~nCpt)Afg16t@cP+;Y}b;T2^DyoQw4uJ@z<9>g0{al~ybK~(xTL<^iyY+i; zTybC{{5OvaQp3^MLBTAP)_G+8wpWoAzF@)&Q3ePN2ZxQpKtu&r%^z7RCKAS5k4RPTYSs94@b}80hKCZ6lp)q!S)2K+McWUt2;kL_o~d?4lbzjSIai2kmp^ zf-I{Y#6#3*P{MB?*RNgh`IYf!sSD0$2fHb-w154oi2@=ug5R?iF*#y-j~_{yvy^D(vFUzw-DauKqXr3Xi{fG`si zNCXJHd3Nh1Gu=2`k7h8t|IYOmK?#F?KlNk?zWOt*^NrPdwns)h9rL&`?fB-DT9?z4 zDR@|1lzfg*VA1>m2sxIo5$oKl_u1L=rzc{7d-vr^;Y_^mHg!%bUcR-Cnu_itEC}u+ zS^VG#)`T-8$V3@0GU`=MlLJcldk{LHS42iePCX7acUEE~Bm2|Ul{^3QC$h{q%}I_E zZ;LGY&w#QH0)b|c_n;I_d^5$m`U|e^kBr%q-lL^k(}agQWi8nMZUz*@rwu6O{#X$1 z?^oDyF8$7;I1@;a2l>V36<5RU8Ly{UC#;74_gPEY^JF*u%p&`qIDcL35jn5;M8fPu zLNM?)v>rEd7lfBo)VnM@So6i#HI49W&~0Z^n)HN2q&M*EZ>&t%O+Dri6de~FIw~0J zj~{n9EnZmW_}?Gk9n#}IF{x3|bpd2s5#!O(a;~6E^x#(M>u-`ow1|T0J9KR*j(rOP z2l|_u(%}+FI$PlG%}ziB+44RirK20#6rzF_n~y2XN!FX5!F?aq#0;%4Z=?jQtou9`|hbCv3SxmReA=q>Ms;`eQ z?f>(K2p0AoD7t%{|De+ym&_pFy2ohW0{(&AYB)yP1j(gTWi~M}A$=K_03RP42M7FU z6;4S-1p^EF1l>e;5|(XgIT=3upvf41W zWmNR#fVcRPlkx-OpO*qkxD+B7LvrNzTKF?ECM)6+9hYQ9 zhPe+{Ec3~bnXRgVrc^Fj(rSO5qKcyB^R2Bq6Urg-8 zh$e{wu>fy@GeK=7yI!UB@F@KnRHJ2PWP5#4ot+9(&shUn6)bCadGOOQngcH2LmC8^TC$@%!xFWE=$Q{~n*7HZ(tAti4V~(hg4Ki_4~##pmmN zkHj1N&%zhw_v!63?DIpeinINwbNUxYJ7KmL0|D9mNs zLKn3#_!?GKsAxBpp$u87YBkSH_Oz=Xz15*T>~K%cJG7^=xQTyurb{eGJ|P=EVsw~y zjuFc_45J9xn4kXQm0IUWO}`Uyo-QKRA@h!D&A0-u)@|d!Op!f8EOh8sF((@+ug@oW z+HRn@KLt6J!! zLf=QwqVolm?|t5~kSRe=yO?4Kd)HZ~U8zShJA9?r#lV@)IUggq;dSjOQpWkpe%gf5 z9H^bWaJ_qDU`_d+q2D#>dHrdMzC$UsuilY?xrQ~HCp|jM*tavZct~pW#!^Riz=~Wf zR!U6l{O;~-f?w|}(L%zb+`)?))W4;~mOef`K5jg|BOXAfDET@CN67pZSmwCwzUfIr zrfpoJ@2>f1Z~TeiKM|LH2p2|^4{FR29NvR>TMn}?|Mhd^&P;x7b^?ht{T@N4i@XeP zzT8w2ukR9JknN=DVqZPAoxtI_b9EHOq_`aA-=k491$a%<+T>a7I^G8bsZzZOmv2hS zmvv^#x?0OfJlthfmwGPOQpc@kHav!Sc<>A8&sr=WzADhpX{mOd4{TU>Io=BSm%gE2b$_@Wb*~4VKRNAgFh}Y1_{hb%bP`_NIoGqW z_m9zuKikb&6sftpUhU+2ycl3PB&g%=)FxkhJ2c0UHaTzKR;c zq7W~wB(zy_Jqi;Lk0%2X0HV;24j;Xx-a#aCt>sdX01@U~4MR)_0^uFI=koIJdz&>F zMairIz3(cAU;tN!_m2-V76c}s#J;2M_RNePLr+YCALMvqV(Z8&EUhhUt@Kq)?%TKu zW&Gf4;%T0;QWMf^svLS8^KkH6_Nude;M#b%VcrnqhR`m@5WV{?UfGAU{JHOO} zx`X~-oICgnI2^g7JU%tof9y_5nQ-4^l_*?QYekO{F`Rh&3G^a}IYS1bzO z1`~#QKApw102v2`<`6fS-y70N-rfs+0in|e5p6i1djoOQvGdy9v!0lqOX!XN!dEHC zH;Nmv8Z)P2UfsMhZ$UdD=<4d~(0;!sdy{3r^7F+KsNn+1 zmE_Pu&rZ;r^jJY_eW;MdGCyNHDA4{s6D3~FEmH%VPOVLAZVNJq$33y$O;*YpYHtX! zaR);Y6Hm9Hu%RTkDa`!azpm3E*GCy5r-`Pdi|`!l59S!splDK>pUtSO-g0Ty-Z75` zlWWE$%{hac)oy?vyXb8uQ;|&!;mpU9-RX|H_ z6WPY<9ONL>@|&*RB{x$}O-fxHa$QcHgqN{g>Gu3Qw-@zOOf5eDWPWOHN*eFzKcdR`I|G&+T@OSe&(6zd=ziQPse?hnBJgx?U zZ(C+JF=&xFEVSXjUnoJTgShcx)=qiuXlKVu}&96Op