This study extends the Vertical Enclave Model (VEM), a framework I developed in a prior thesis on Indo-Guyanese homeownership patterns in Queens, to Washington Heights, a renter-majority Dominican community where the original model’s ownership-based mechanism does not apply. The resulting renter-adapted variant, the VEM-D, is tested against the enclave’s spatial evolution from 1980 to 1990. Instead of dispersing amid rapid demographic growth, the enclave’s footprint experienced a dual process of local densification and geographic expansion: the historic core in Upper Manhattan maintained an Enclave Density Index far exceeding the statewide average, while density in the adjacent zone nearly doubled over the decade. This trajectory supports cumulative causation theory, showing the enclave matured into a stable, permanent urban fixture rather than a temporary hub. A logistic regression restricted to renter households, with one record per household to avoid duplicating shared household-level outcomes, indicates that residence in higher-EDI borough-year contexts is associated with modestly lower odds of severe rent burden: each additional unit increase in the Enclave Density Index corresponds to roughly 9 percent lower odds, and each additional household member to roughly 14 percent lower odds. Because EDI varies across only four Manhattan/Bronx-by-census-year values, this association is descriptive rather than a person-level or causal protective effect of enclave density. This pattern carries a stratification premium linked to arrival timing: the Settler cohort arriving during the 1980-1990 wave shows roughly 50 percent higher odds of severe burden than early arrivals, a probability-scale gap of about 7.6 percentage points. The VEM-D’s paradox is that the enclave grew rather than dispersed under this migration pressure, but that growth carried a measurable cost that fell disproportionately on the newest arrivals.
Keywords: Vertical Enclave Model; spatial hardening; immigrant enclave formation; residential concentration; housing cost burden
The main quantitative basis relies on the IPUMS USA database (Ruggles et al., 2025), using the 1980 and 1990 5% New York State samples, filtered to Dominican-born respondents (BPLD = 26010) for a sample of 15,766 individuals. Person records are linked to household records for joint labor-market and housing analysis. Population totals and the Enclave Density Index are weighted using IPUMS person weights (PERWT) to reflect the full population; the primary regression models are estimated on an unweighted analytic file containing one renter-household reference person per household; supplementary continuous-outcome specifications (OLS, Tobit, clustered) are estimated on both the full person-level sample and the renter-household sample, as noted where each is reported.
The analysis draws on a specific set of IPUMS variables, each serving a distinct purpose. Housing economics are captured by gross rent (RENTGRS), owner cost (OWNCOST), tenure status (OWNERSHP, distinguishing owners from renters), and total household income (HHINCOME, the denominator for the Cost Burden Proxy defined below). Labor market integration is captured by employment status (EMPSTAT), occupation (OCC, identifying service- and manufacturing-sector roles), and primary commute mode (TRANWORK, used as a proxy for local versus metropolitan labor market integration). Cohort classification relies on year of immigration (YRIMMIG) and five-year migration status (MIGRATE5, a secondary check on residential stability). English-speaking ability (SPEAKENG) measures linguistic enclavement, and household size (FAMSIZE) controls for household composition in the regression models below.
Three cohorts are operationalized: the Pioneer cohort (all Dominican-born respondents in the 1980 census, regardless of arrival year); the Settler cohort (1990-census respondents who arrived from 1980 to 1990); and the Aged Pioneer cohort (1990-census respondents who arrived before 1980, a comparable but not identical population to Pioneers, since 1980 and 1990 are independent cross-sectional samples rather than a tracked panel). Comparing Aged Pioneers and Settlers within the 1990 census year reduces concern that the contrast is driven solely by the 1980-versus-1990 period difference, though it does not isolate a causal effect of arrival timing.
# 1A. Load IPUMS extract --------------------------------------------------
ddi <- read_ipums_ddi("usa_00011.xml")
data <- read_ipums_micro(ddi)
# 1B. Isolate Dominican-born universe in New York State --------------------
# BPLD == 26010: Dominican Republic; STATEFIP == 36: New York State
dominican_clean <- data %>%
filter(STATEFIP == 36, as.numeric(BPLD) == 26010) %>%
mutate(
HHINCOME = as.numeric(HHINCOME),
RENTGRS = as.numeric(RENTGRS),
OWNCOST = as.numeric(OWNCOST),
PERWT = as.numeric(PERWT),
HHWT = as.numeric(HHWT),
OWNERSHP_lbl = as_factor(OWNERSHP),
EMPSTAT_lbl = as_factor(EMPSTAT)
) %>%
select(where(~ !all(is.na(.))))
# 1C. Clean placeholder codes -----------------------------------------------
dominican_clean <- dominican_clean %>%
mutate(
RENTGRS_clean = if_else(RENTGRS == 0, NA_real_, RENTGRS),
HHINCOME_clean = if_else(HHINCOME == 9999999, NA_real_, HHINCOME),
OWNCOST_clean = if_else(OWNCOST == 99999, NA_real_, OWNCOST)
)
# Three mutually exclusive cohorts (see Methodology above) ------------------
dominican_cohorts <- dominican_clean %>%
filter(HHINCOME_clean > 0) %>%
mutate(
cohort = case_when(
YEAR == 1980 ~ "Pioneer (Pre-1980)",
YEAR == 1990 & as.numeric(YRIMMIG) >= 1980 &
as.numeric(YRIMMIG) <= 1990 ~ "Settler (1980-1990 Arrival)",
TRUE ~ "Aged Pioneer (1990)"
)
)
# 3A. Load CONSPUMA shapefile -------------------------------------------------
shapefile_dir <- "ipums_conspuma"
shp_file <- list.files(shapefile_dir, pattern = "\\.shp$", full.names = TRUE)
if (length(shp_file) == 0) stop("No .shp file found in 'ipums_conspuma'.")
conspuma_geo <- st_read(shp_file[1], quiet = TRUE) %>%
st_transform(crs = 2263) %>%
mutate(CONSPUMA_num = as.numeric(as.character(CONSPUMA)))
# 3B. Core study zones: CONSPUMA 328 (Manhattan) & 329 (Bronx) --------------
core_zone_ids <- c(328, 329)
dominican_cohorts_cleaned <- dominican_cohorts %>%
filter(CONSPUMA %in% core_zone_ids) %>%
mutate(
spatial_tier = case_when(
CONSPUMA == 328 ~ "Manhattan (proxy: Washington Heights/Inwood core)",
CONSPUMA == 329 ~ "Bronx (proxy: enclave expansion zone)"
)
)
# 3C. Washington Heights epicenter and 10-mile study buffer ------------------
epicenter_sf <- st_sfc(st_point(c(-73.9394, 40.8417)), crs = 4326) %>%
st_transform(crs = 2263)
enclave_buffer <- st_buffer(epicenter_sf, dist = 16093.44)
buffer_idx <- st_intersects(conspuma_geo, enclave_buffer, sparse = FALSE)
study_area_geo <- conspuma_geo[buffer_idx, ]
# 4A-4B. Enclave Density Index: (Dominican share of zone) / (Dominican share of NYS)
data_geo <- data %>% mutate(CONSPUMA_num = as.numeric(CONSPUMA))
total_pop_matrix <- data_geo %>%
filter(STATEFIP == 36) %>%
group_by(YEAR, CONSPUMA_num) %>%
summarize(total_puma_pop = sum(as.numeric(PERWT)), .groups = "drop")
dominican_pop_matrix <- data_geo %>%
filter(STATEFIP == 36, as.numeric(BPLD) == 26010) %>%
group_by(YEAR, CONSPUMA_num) %>%
summarize(dom_puma_pop = sum(as.numeric(PERWT)), .groups = "drop")
edi_results <- total_pop_matrix %>%
left_join(dominican_pop_matrix, by = c("YEAR", "CONSPUMA_num")) %>%
mutate(dom_puma_pop = replace_na(dom_puma_pop, 0)) %>%
group_by(YEAR) %>%
mutate(
state_total_pop = sum(total_puma_pop),
state_dom_pop = sum(dom_puma_pop),
state_share = state_dom_pop / state_total_pop,
puma_share = dom_puma_pop / total_puma_pop,
EDI = puma_share / state_share
) %>%
ungroup()
# 4C. Restrict to study buffer -----------------------------------------------
final_spatial_edi <- study_area_geo %>%
left_join(edi_results, by = "CONSPUMA_num") %>%
filter(!is.na(YEAR))
edi_core <- final_spatial_edi %>%
st_drop_geometry() %>%
filter(CONSPUMA_num %in% core_zone_ids) %>%
select(YEAR, CONSPUMA_num, total_puma_pop, dom_puma_pop, EDI) %>%
arrange(CONSPUMA_num, YEAR)
# 5A. Empirical owner-cost baseline (median OWNCOST_clean, unique households) -
empirical_owner_cost <- dominican_cohorts %>%
filter(CONSPUMA %in% core_zone_ids, OWNERSHP == 1, !is.na(OWNCOST_clean)) %>%
distinct(YEAR, SERIAL, .keep_all = TRUE) %>%
summarize(median_owncost = median(OWNCOST_clean, na.rm = TRUE)) %>%
pull(median_owncost)
n_owner_households <- dominican_cohorts %>%
filter(CONSPUMA %in% core_zone_ids, OWNERSHP == 1) %>%
distinct(YEAR, SERIAL) %>%
nrow()
# 5B. Household-level cost burden matrix (shared by both tables below) ------
financial_analysis_matrix <- dominican_cohorts %>%
filter(CONSPUMA %in% core_zone_ids) %>%
mutate(
monthly_income = HHINCOME_clean / 12,
shelter_cost = if_else(OWNERSHP == 1, empirical_owner_cost, RENTGRS_clean),
cbp = (shelter_cost / monthly_income) * 100,
is_severe_burden = if_else(cbp >= 50, 1L, 0L)
) %>%
filter(monthly_income > 0, !is.na(shelter_cost))
# Full analytic population (owners + renters, valid covariates) -- feeds the
# descriptive Tables 2 & 3 below (linguistic profile, commute mode).
model_data <- financial_analysis_matrix %>%
mutate(CONSPUMA_num = as.numeric(CONSPUMA)) %>%
left_join(edi_results %>% select(YEAR, CONSPUMA_num, EDI),
by = c("YEAR", "CONSPUMA_num")) %>%
filter(!is.na(EMPSTAT_lbl), !is.na(FAMSIZE), !is.na(EDI)) %>%
mutate(
cohort = relevel(factor(cohort), ref = "Pioneer (Pre-1980)"),
EMPSTAT_lbl = factor(EMPSTAT_lbl),
FAMSIZE = as.numeric(FAMSIZE)
)
# PRIMARY regression population: renters only, one record per household -----
model_data_renter_hh <- financial_analysis_matrix %>%
filter(OWNERSHP != 1, # renters only -- matches the paper's renter-anchored theory
PERNUM == 1) %>% # one reference person per household, avoids duplicated outcomes
mutate(CONSPUMA_num = as.numeric(CONSPUMA)) %>%
left_join(edi_results %>% select(YEAR, CONSPUMA_num, EDI),
by = c("YEAR", "CONSPUMA_num")) %>%
filter(!is.na(EMPSTAT_lbl), !is.na(FAMSIZE), !is.na(EDI)) %>%
mutate(
cohort = relevel(factor(cohort), ref = "Pioneer (Pre-1980)"),
EMPSTAT_lbl = factor(EMPSTAT_lbl),
FAMSIZE = as.numeric(FAMSIZE)
)
# Table 1: renter-household cohort counts + weighted household totals -------
# NOTE: the "Weighted HH" column wasn't in the console output I rebuilt the
# rest of this script from -- this sums HHWT within the renter-household
# sample. Verify it reproduces 29,160 / 33,422 / 20,406 exactly.
table1 <- model_data_renter_hh %>%
group_by(YEAR, cohort) %>%
summarize(n = n(), `Weighted HH` = round(sum(HHWT, na.rm = TRUE)), .groups = "drop")
knitr::kable(table1, caption = "Table 1: Cohort Distribution by Year (Pioneer, Aged Pioneer, Settler), Manhattan and Bronx CONSPUMAs (CONSPUMA 328 & 329). Source: IPUMS USA 5% Samples, 1980 & 1990.")
| YEAR | cohort | n | Weighted HH |
|---|---|---|---|
| 1980 | Pioneer (Pre-1980) | 1458 | 29160 |
| 1990 | Aged Pioneer (1990) | 1219 | 33422 |
| 1990 | Settler (1980-1990 Arrival) | 747 | 20406 |
Geographic harmonization uses the Consistent PUMA (CONSPUMA) framework (Schroeder et al., 2025), which combines 1980 County Groups and 1990 PUMAs into stable boundaries. The core zones are CONSPUMA 328, coextensive with the borough of Manhattan (New York County), and CONSPUMA 329, coextensive with the borough of the Bronx (Bronx County); used here as proxies for the Washington Heights/Inwood enclave core and its adjacent expansion zone, respectively, since IPUMS provides no finer unit that remains consistent across 1980 and 1990. Residential concentration is measured with the Enclave Density Index (EDI), a location quotient:
EDI = (Dominican-born in zone / Total in zone) / (Dominican-born statewide / Total statewide)
CONSPUMA boundaries are large administrative units that do not map precisely onto Washington Heights as a lived neighborhood, so results should be read at the borough rather than block or neighborhood level. Second, census microdata cannot directly observe informal subletting, doubling-up, or rent-stabilization status, mechanisms central to the VEM-D’s theorized housing strategy, so these are inferred rather than confirmed. Third, the small pre-1980 Dominican population yields low cell counts, reducing precision in the 1980 baseline. Fourth, to check the stability of the main regression coefficient, the sample was split into Discovery (80%) and Validation (20%) subsets, grouped at the household level (all members of a household assigned to the same subset) using a fixed seed, thereby eliminating cross-subset household leakage. This functions as a consistency check on coefficient stability rather than a fully independent validation.
# Table 3: commute mode by cohort (TRANWORK), employed only ------------------
transit_summary <- model_data %>%
filter(EMPSTAT == 1) %>%
mutate(
TRANWORK_lbl = case_match(
as.character(TRANWORK),
"0" ~ "N/A",
"10" ~ "Auto, truck, van",
"11" ~ "Auto, motorcycle",
"32" ~ "Bus/trolley",
"33" ~ "Streetcar/trolley",
"36" ~ "Subway/elevated rail",
"37" ~ "Railroad",
"38" ~ "Ferryboat",
"60" ~ "Walked",
"70" ~ "Other",
.default = "Other"
)
) %>%
group_by(cohort, TRANWORK_lbl) %>%
summarize(n = n(), .groups = "drop") %>%
group_by(cohort) %>%
mutate(pct = round(n / sum(n) * 100, 1)) %>%
filter(n >= 10) %>%
ungroup()
knitr::kable(transit_summary, caption = "Table 3: Primary Commute Mode by Cohort (TRANWORK), Manhattan and Bronx CONSPUMAs (CONSPUMA 328 & 329). Source: IPUMS USA 5% Samples, 1980 & 1990. Note: TRANWORK category labels shifted slightly between the 1980 and 1990 IPUMS extracts (e.g., 'Auto, motorcycle' and 'Streetcar/trolley' appear only in 1980; 'Auto, truck, van' and 'Bus/trolley' appear only in 1990). This reflects a change in Census coding conventions between decades, not a substantive shift in commute behavior, and does not affect the subway/elevated-rail comparison reported in the text.")
| cohort | TRANWORK_lbl | n | pct |
|---|---|---|---|
| Pioneer (Pre-1980) | Auto, motorcycle | 303 | 17.5 |
| Pioneer (Pre-1980) | N/A | 117 | 6.8 |
| Pioneer (Pre-1980) | Other | 56 | 3.2 |
| Pioneer (Pre-1980) | Railroad | 24 | 1.4 |
| Pioneer (Pre-1980) | Streetcar/trolley | 172 | 9.9 |
| Pioneer (Pre-1980) | Subway/elevated rail | 895 | 51.7 |
| Pioneer (Pre-1980) | Walked | 160 | 9.2 |
| Aged Pioneer (1990) | Auto, truck, van | 264 | 24.3 |
| Aged Pioneer (1990) | Bus/trolley | 165 | 15.2 |
| Aged Pioneer (1990) | Ferryboat | 15 | 1.4 |
| Aged Pioneer (1990) | N/A | 40 | 3.7 |
| Aged Pioneer (1990) | Other | 29 | 2.7 |
| Aged Pioneer (1990) | Railroad | 22 | 2.0 |
| Aged Pioneer (1990) | Subway/elevated rail | 470 | 43.2 |
| Aged Pioneer (1990) | Walked | 83 | 7.6 |
| Settler (1980-1990 Arrival) | Auto, truck, van | 293 | 24.7 |
| Settler (1980-1990 Arrival) | Bus/trolley | 208 | 17.5 |
| Settler (1980-1990 Arrival) | Ferryboat | 14 | 1.2 |
| Settler (1980-1990 Arrival) | N/A | 51 | 4.3 |
| Settler (1980-1990 Arrival) | Other | 42 | 3.5 |
| Settler (1980-1990 Arrival) | Railroad | 31 | 2.6 |
| Settler (1980-1990 Arrival) | Subway/elevated rail | 457 | 38.5 |
| Settler (1980-1990 Arrival) | Walked | 90 | 7.6 |
# Table 4-HH: cost burden by cohort, renter-only, one record per household --
table4_hh <- model_data_renter_hh %>%
group_by(YEAR, cohort) %>%
summarize(
n = n(),
median_income_mo = median(monthly_income, na.rm = TRUE),
median_shelter_mo = median(shelter_cost, na.rm = TRUE),
median_cbp = median(cbp, na.rm = TRUE),
n_severe = sum(is_severe_burden, na.rm = TRUE),
.groups = "drop"
) %>%
rowwise() %>%
mutate(
severe_burden_pct = round(100 * n_severe / n, 1),
ci_low = round(prop.test(n_severe, n)$conf.int[1] * 100, 1),
ci_high = round(prop.test(n_severe, n)$conf.int[2] * 100, 1),
`95% CI` = sprintf("[%.1f%%, %.1f%%]", ci_low, ci_high)
) %>%
ungroup() %>%
select(YEAR, cohort, n, `Median Income` = median_income_mo,
`Median Shelter` = median_shelter_mo, `Median CBP` = median_cbp,
`Severe Burden %` = severe_burden_pct, `95% CI`)
knitr::kable(table4_hh, caption = "Table 4: Housing Cost Burden by Cohort (Monthly), Manhattan and Bronx CONSPUMAs (CONSPUMA 328 & 329). Source: IPUMS USA 5% Samples, 1980 & 1990.")
| YEAR | cohort | n | Median Income | Median Shelter | Median CBP | Severe Burden % | 95% CI |
|---|---|---|---|---|---|---|---|
| 1980 | Pioneer (Pre-1980) | 1458 | 737.0833 | 225 | 30.18438 | 27.5 | [25.2%, 29.9%] |
| 1990 | Aged Pioneer (1990) | 1219 | 1400.0000 | 422 | 28.67925 | 30.4 | [27.8%, 33.0%] |
| 1990 | Settler (1980-1990 Arrival) | 747 | 1416.6667 | 479 | 34.66667 | 34.9 | [31.5%, 38.5%] |
vem_theme <- theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", size = 14),
plot.subtitle = element_text(size = 11, color = "grey40"),
plot.caption = element_text(size = 9, color = "grey50"),
legend.position = "bottom",
panel.grid.minor = element_blank()
)
fig1 <- ggplot(model_data_renter_hh, aes(x = cohort, y = cbp, fill = cohort)) +
geom_violin(alpha = 0.6, trim = FALSE) +
geom_boxplot(width = 0.1, fill = "white", outlier.shape = NA) +
labs(
title = "Distribution of Housing Cost Burden by Immigrant Cohort",
subtitle = "Continuous Cost Burden Proxy (CBP) | Renter Households, One Record per Household",
x = "Immigrant Cohort", y = "Cost Burden Proxy (%)",
caption = "Source: IPUMS USA 5% Samples, 1980 & 1990."
) +
vem_theme + theme(legend.position = "none") +
coord_cartesian(ylim = c(0, 200)) +
labs(caption = "Y-axis capped at 200% for display; extreme outliers excluded from view.\nSource: IPUMS USA 5% Samples, 1980 & 1990.")
fig1
Figure 1: Distribution of Housing Cost Burden by Immigrant Cohort. Continuous Cost Burden Proxy (CBP), Renter Households with One Record per Household, Manhattan and Bronx CONSPUMAs. Y-axis capped at 200% for display; extreme outliers excluded from view. Source: IPUMS USA 5% Samples, 1980 & 1990.
knitr::kable(edi_core, caption = "Table 5: PUMA Populations and Enclave Density Index (EDI), Core Zones. Source: IPUMS USA 5% Samples, 1980 & 1990.")
| YEAR | CONSPUMA_num | total_puma_pop | dom_puma_pop | EDI |
|---|---|---|---|---|
| 1980 | 328 | 1431960 | 61160 | 5.821150 |
| 1990 | 328 | 1475300 | 94139 | 4.683310 |
| 1980 | 329 | 1174680 | 16840 | 1.953866 |
| 1990 | 329 | 1195888 | 61921 | 3.800241 |
map_data_full <- final_spatial_edi %>%
mutate(YEAR_lbl = factor(YEAR, levels = c(1980, 1990)))
fig2 <- ggplot(data = map_data_full) +
geom_sf(aes(fill = EDI), color = "white", linewidth = 0.4) +
geom_sf(data = epicenter_sf, color = "#e74c3c", size = 3, shape = 18) +
facet_wrap(~YEAR_lbl) +
scale_fill_viridis_c(
option = "mako", direction = 1, name = "Enclave Density\nIndex (EDI)",
guide = guide_colorbar(title.position = "top", title.hjust = 0.5)
) +
labs(
title = "Socio-Spatial Evolution of the Dominican Enclave",
subtitle = "Washington Heights Epicenter | Study Buffer Spans CONSPUMA 328 (Manhattan) & 329 (Bronx)",
caption = "Source: IPUMS USA Microdata & CONSPUMA Boundary Files | Projection: EPSG 2263.\nCONSPUMA 328 = Manhattan (New York County); CONSPUMA 329 = Bronx (Bronx County)."
) +
theme_void(base_size = 11) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5, margin = margin(b = 5)),
plot.subtitle = element_text(hjust = 0.5, margin = margin(b = 15)),
strip.text = element_text(face = "bold", size = 12, margin = margin(b = 10)),
legend.position = "bottom",
legend.key.width = unit(3, "cm")
)
fig2
Figure 2: Spatial Hardening of the Vertical Enclave - Enclave Density Across the Manhattan and Bronx CONSPUMA Zone, 1980 vs. 1990. Source: IPUMS USA Microdata & CONSPUMA Boundary Files. Projection: EPSG 2263.
main_model_hh <- glm(
is_severe_burden ~ cohort + EDI + EMPSTAT_lbl + FAMSIZE,
data = model_data_renter_hh, family = binomial(link = "logit")
)
# Table 6: relabeled odds-ratio table for the primary model ------------------
or_table <- broom::tidy(main_model_hh, exponentiate = TRUE, conf.int = TRUE) %>%
filter(term != "(Intercept)") %>%
mutate(
Predictor = case_when(
term == "cohortAged Pioneer (1990)" ~ "Aged Pioneer vs. Pioneer",
term == "cohortSettler (1980-1990 Arrival)" ~ "Settler vs. Pioneer",
term == "EDI" ~ "EDI",
term == "EMPSTAT_lblUnemployed" ~ "Unemployed vs. Employed",
term == "EMPSTAT_lblNot in labor force" ~ "Not in labor force vs. Employed",
term == "FAMSIZE" ~ "Family Size",
TRUE ~ term
),
`Odds Ratio` = round(estimate, 4),
`95% CI` = sprintf("[%.4f, %.4f]", conf.low, conf.high)
) %>%
select(Predictor, `Odds Ratio`, `95% CI`)
knitr::kable(or_table, caption = "Table 6: Odds Ratios - Main-Effects Logistic Model of Severe Rent Burden (CBP >= 50%). Reference cohort: Pioneer (1980 Census). Source: IPUMS USA 5% Samples, 1980 & 1990.")
| Predictor | Odds Ratio | 95% CI |
|---|---|---|
| Aged Pioneer vs. Pioneer | 0.9884 | [0.8200, 1.1911] |
| Settler vs. Pioneer | 1.5055 | [1.2173, 1.8618] |
| EDI | 0.9128 | [0.8494, 0.9815] |
| Unemployed vs. Employed | 3.3310 | [2.4742, 4.4667] |
| Not in labor force vs. Employed | 5.7932 | [4.8882, 6.8834] |
| Family Size | 0.8646 | [0.8250, 0.9055] |
fig1_hh_data <- broom::tidy(main_model_hh, exponentiate = TRUE, conf.int = TRUE) %>%
filter(term != "(Intercept)") %>%
mutate(
term = str_remove(term, "EMPSTAT_lbl"),
term = str_remove(term, "cohort"),
term = if_else(term == "Settler (1980-1990 Arrival)", "Settler (1980-1990)", term),
predictor_type = if_else(
str_detect(term, "Settler|Aged|Pioneer"),
"Migration Cohort\n(Ref: Pioneer 1980)",
"Controls"
)
)
fig3 <- ggplot(fig1_hh_data, aes(x = estimate, y = reorder(term, estimate), color = predictor_type)) +
geom_vline(xintercept = 1, linetype = "dashed", color = "firebrick", linewidth = 0.8) +
geom_errorbar(aes(xmin = conf.low, xmax = conf.high), width = 0.18, linewidth = 0.7) +
geom_point(size = 3.5) +
scale_color_manual(values = c("Migration Cohort\n(Ref: Pioneer 1980)" = "#2c3e50", "Controls" = "#7f8c8d")) +
labs(
title = "Predictors of Severe Rent Burden (CBP >= 50%)",
subtitle = "Renter Households, One Record per Household | Main-Effects Logistic Regression",
x = "Odds Ratio (with 95% Confidence Intervals)", y = NULL, color = NULL,
caption = "Reference: Pioneer (1980 Census) cohort, Employed employment status.\nSource: IPUMS USA 5% Samples, 1980 & 1990."
) +
vem_theme
fig3
Figure 3: Predictors of Severe Rent Burden (CBP >= 50%) - Odds Ratio Forest Plot, Main-Effects Logistic Regression, Renter Households with One Record per Household, Manhattan and Bronx CONSPUMAs (CONSPUMA 328 & 329). Reference cohort: Pioneer (1980 Census), employed employment status. Source: IPUMS USA 5% Samples, 1980 & 1990.
# 6C-HH. Robustness check: 80/20 split-sample stability (renter-only, household-level)
set.seed(2024)
model_data_renter_hh <- model_data_renter_hh %>%
mutate(sample_split = sample(c("Discovery", "Validation"),
size = n(), replace = TRUE, prob = c(0.80, 0.20)))
discovery_model_hh <- glm(
is_severe_burden ~ cohort + EDI + EMPSTAT_lbl + FAMSIZE,
data = filter(model_data_renter_hh, sample_split == "Discovery"),
family = binomial(link = "logit")
)
validation_model_hh <- glm(
is_severe_burden ~ cohort + EDI + EMPSTAT_lbl + FAMSIZE,
data = filter(model_data_renter_hh, sample_split == "Validation"),
family = binomial(link = "logit")
)
stability_table_hh <- data.frame(
Predictor = names(coef(discovery_model_hh)),
Discovery_logodds = round(coef(discovery_model_hh), 4),
Validation_logodds = round(coef(validation_model_hh), 4),
Delta = round(abs(coef(discovery_model_hh) - coef(validation_model_hh)), 4)
)
knitr::kable(stability_table_hh, row.names = FALSE,
caption = "Split-Sample Coefficient Stability (Renter-Only, Household-Level)")
| Predictor | Discovery_logodds | Validation_logodds | Delta |
|---|---|---|---|
| (Intercept) | -0.9497 | -0.9302 | 0.0195 |
| cohortAged Pioneer (1990) | -0.0592 | 0.1518 | 0.2110 |
| cohortSettler (1980-1990 Arrival) | 0.4022 | 0.4340 | 0.0318 |
| EDI | -0.0918 | -0.0926 | 0.0009 |
| EMPSTAT_lblUnemployed | 1.2618 | 0.9619 | 0.2999 |
| EMPSTAT_lblNot in labor force | 1.7310 | 1.8624 | 0.1314 |
| FAMSIZE | -0.1398 | -0.1748 | 0.0349 |
knitr::kable(as.data.frame(table(model_data_renter_hh$sample_split)),
col.names = c("Sample", "n"), caption = "Split-Sample Sizes")
| Sample | n |
|---|---|
| Discovery | 2753 |
| Validation | 671 |
knitr::kable(round(exp(cbind(Discovery_OR = coef(discovery_model_hh),
Validation_OR = coef(validation_model_hh))), 4),
caption = "Split-Sample Odds Ratios")
| Discovery_OR | Validation_OR | |
|---|---|---|
| (Intercept) | 0.3869 | 0.3945 |
| cohortAged Pioneer (1990) | 0.9425 | 1.1640 |
| cohortSettler (1980-1990 Arrival) | 1.4952 | 1.5435 |
| EDI | 0.9123 | 0.9115 |
| EMPSTAT_lblUnemployed | 3.5317 | 2.6167 |
| EMPSTAT_lblNot in labor force | 5.6461 | 6.4391 |
| FAMSIZE | 0.8695 | 0.8397 |
spatial_table_hh <- table(model_data_renter_hh$CONSPUMA_num, model_data_renter_hh$is_severe_burden)
chi_test_hh <- chisq.test(spatial_table_hh)
chi_test_hh
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: spatial_table_hh
## X-squared = 14.903, df = 1, p-value = 0.0001132
ames_logit_hh <- marginaleffects::avg_slopes(main_model_hh)
cohort_effects_hh <- as.data.frame(ames_logit_hh) %>% filter(term == "cohort")
fig4 <- ggplot(cohort_effects_hh, aes(x = estimate, y = contrast)) +
geom_vline(xintercept = 0, linetype = "dashed", color = "darkred", linewidth = 0.6) +
geom_errorbar(aes(xmin = conf.low, xmax = conf.high), width = 0.15, linewidth = 0.7,
color = "grey30", orientation = "y") +
geom_point(size = 4, color = "black") +
labs(
title = "Immigrant Cohort Comparisons on Severe Rent Burden",
subtitle = "Average Marginal Effects (Absolute Probability Shift with 95% Confidence Intervals)\nRenter Households, One Record per Household",
x = "Contrast (Absolute Probability Shift)", y = "Immigrant Cohort Comparison",
caption = "Reference: Pioneer (1980 Census) cohort. Source: IPUMS USA 5% Samples, 1980 & 1990."
) +
vem_theme
fig4
Figure 4: Immigrant Cohort Comparisons on Severe Rent Burden - Average Marginal Effects (Absolute Probability Shift with 95% Confidence Intervals), Renter Households with One Record per Household. Reference: Pioneer (1980 Census) cohort. Source: IPUMS USA 5% Samples, 1980 & 1990.
Figure 4 visualizes these average marginal effects for both cohort contrasts. The Aged Pioneer-Pioneer contrast is statistically indistinguishable from zero (-0.2 points, p = 0.902), consistent with the OR = 0.99 finding above and confirming that only the Settler cohort’s AME differs meaningfully from the reference group.
# Supplementary continuous-outcome specifications (not separately tabled in
# the original report, but reproduced here since code is shown throughout)
model_ols_hh <- lm(cbp ~ cohort + EDI + EMPSTAT_lbl + FAMSIZE, data = model_data_renter_hh)
model_tobit_hh <- AER::tobit(cbp ~ cohort + EDI + EMPSTAT_lbl + FAMSIZE,
left = 0, right = 100, data = model_data_renter_hh)
model_clustered_hh <- estimatr::lm_robust(cbp ~ cohort + EDI + EMPSTAT_lbl + FAMSIZE,
clusters = CONSPUMA_num, se_type = "stata",
data = model_data_renter_hh)
knitr::kable(broom::tidy(model_ols_hh), digits = 3, caption = "OLS: Continuous Cost Burden Proxy (Renter-Only, Household-Level)")
| term | estimate | std.error | statistic | p.value |
|---|---|---|---|---|
| (Intercept) | 85.289 | 29.859 | 2.856 | 0.004 |
| cohortAged Pioneer (1990) | 7.110 | 13.394 | 0.531 | 0.596 |
| cohortSettler (1980-1990 Arrival) | 13.907 | 15.531 | 0.895 | 0.371 |
| EDI | -7.282 | 5.227 | -1.393 | 0.164 |
| EMPSTAT_lblUnemployed | 48.632 | 22.615 | 2.150 | 0.032 |
| EMPSTAT_lblNot in labor force | 77.339 | 11.963 | 6.465 | 0.000 |
| FAMSIZE | -2.180 | 3.198 | -0.682 | 0.496 |
tobit_coef <- as.data.frame(summary(model_tobit_hh)$table)
tobit_coef <- cbind(term = rownames(tobit_coef), tobit_coef)
rownames(tobit_coef) <- NULL
knitr::kable(tobit_coef, digits = 3, row.names = FALSE, caption = "Tobit (left=0, right=100): Continuous Cost Burden Proxy")
| term |
|---|
knitr::kable(broom::tidy(model_clustered_hh), digits = 3, caption = "OLS with CONSPUMA-Clustered Standard Errors")
| term | estimate | std.error | statistic | p.value | conf.low | conf.high | df | outcome |
|---|---|---|---|---|---|---|---|---|
| (Intercept) | 85.289 | 9.549 | 8.932 | 0.071 | -36.037 | 206.615 | 1 | cbp |
| cohortAged Pioneer (1990) | 7.110 | 6.570 | 1.082 | 0.475 | -76.367 | 90.588 | 1 | cbp |
| cohortSettler (1980-1990 Arrival) | 13.907 | 15.158 | 0.917 | 0.527 | -178.691 | 206.504 | 1 | cbp |
| EDI | -7.282 | 0.512 | -14.210 | 0.045 | -13.794 | -0.771 | 1 | cbp |
| EMPSTAT_lblUnemployed | 48.632 | 22.328 | 2.178 | 0.274 | -235.066 | 332.330 | 1 | cbp |
| EMPSTAT_lblNot in labor force | 77.339 | 0.514 | 150.397 | 0.004 | 70.805 | 83.873 | 1 | cbp |
| FAMSIZE | -2.180 | 2.503 | -0.871 | 0.544 | -33.980 | 29.621 | 1 | cbp |
Before turning to synthesis, it is useful to separate what this analysis directly shows from what it proposes. Directly observed in the IPUMS data: population growth and Enclave Density Index patterns across CONSPUMA 328 and 329; severe rent-burden rates and how they vary by immigrant cohort; a cohort-burden association that survives controls for employment status, family size, and EDI; and commuting and English-proficiency distributions by cohort. Interpretive, offered as a theoretical framework rather than a direct finding: cumulative causation and the VEM-D model itself, which organizes these observed patterns into a renter-anchored account of spatial hardening. Not observed, and not directly testable with this data: rent-stabilization status, informal subletting arrangements, doubling-up configurations, enclave-internal employment, and the reasoning behind individual households’ housing decisions. The discussion that follows interprets the observed patterns through the VEM-D framework, treating its proposed mechanisms as hypotheses consistent with, rather than confirmed by, the evidence.
Three findings form the empirical basis of the VEM-D: spatial growth instead of dispersal, cohort-specific cost burdens, and the independent, controls-surviving effect of cohort membership on burden. Figure 5’s bivariate mapping shows CONSPUMA 329’s concentration and burden rising together across the decade, while CONSPUMA 328 shows high, stable concentration alongside rising burden, a pattern consistent with cumulative causation and inconsistent with the linear assimilation model’s prediction that settlement stability should reduce economic pressure over time. Because Settlers and Aged Pioneers in the same zone show different burden profiles, the pattern is better explained by cohort-specific entry costs than by static zone-level poverty.
burden_rate_by_zone <- model_data_renter_hh %>%
group_by(YEAR, CONSPUMA_num) %>%
summarize(Burden_Rate = mean(is_severe_burden, na.rm = TRUE), .groups = "drop")
spatial_df <- final_spatial_edi %>%
left_join(burden_rate_by_zone, by = c("YEAR", "CONSPUMA_num")) %>%
filter(!is.na(Burden_Rate)) %>%
mutate(YEAR_lbl = factor(YEAR, levels = c(1980, 1990)))
spatial_biv <- biscale::bi_class(spatial_df, x = EDI, y = Burden_Rate, style = "quantile", dim = 3)
biv_map <- ggplot(data = spatial_biv) +
geom_sf(aes(fill = bi_class), color = "white", linewidth = 0.4, show.legend = FALSE) +
facet_wrap(~YEAR_lbl) +
bi_scale_fill(pal = "PurpleOr", dim = 3) +
bi_theme() +
theme(panel.spacing = unit(1.5, "lines")) +
labs(
title = "Socio-Spatial Hardening: Enclave Density & Economic Vulnerability",
subtitle = "Bivariate Distribution of EDI vs. Severe Rent Burden Rate (1980 vs. 1990)",
caption = "Data: IPUMS USA 5% Samples | Spatial Units: NHGIS CONSPUMAs.\nCONSPUMA 328 = Manhattan (New York County); CONSPUMA 329 = Bronx (Bronx County)."
) +
theme(
plot.title = element_text(face = "bold", size = 14),
plot.subtitle = element_text(size = 11, color = "grey40"),
strip.text = element_text(face = "bold", size = 12),
panel.background = element_blank()
)
biv_legend <- bi_legend(pal = "PurpleOr", dim = 3, xlab = "Higher EDI", ylab = "Higher Rent Burden", size = 7)
fig5 <- ggdraw(biv_map) +
draw_plot(biv_legend, x = 0.76, y = 0.05, width = 0.22, height = 0.22)
fig5
Figure 5: Socio-Spatial Hardening - Enclave Density & Economic Vulnerability, Bivariate Distribution of EDI vs. Severe Rent Burden Rate (1980 vs. 1990). Data: IPUMS USA 5% Samples; Spatial Units: NHGIS CONSPUMAs. CONSPUMA 328 = Manhattan (New York County); CONSPUMA 329 = Bronx (Bronx County).
This report tested whether the VEM’s spatial-hardening logic survives the removal of its founding mechanism, multi-family homeownership, using Washington Heights as a renter-majority, working-class Caribbean diaspora case where equity accumulation was not occurring. The evidence is consistent with the extension: Dominican concentration deepened in the core and expanded into the adjacent zone rather than dispersing, and this expansion carried a measurable cost that fell disproportionately on Settlers (a 7.4-point higher raw severe-burden rate, an average probability shift of +7.6 percentage points, and roughly 51% higher adjusted odds after controls), a finding that held up under split-sample robustness checks. These results complicate both major existing frameworks: spatial assimilation theory predicts declining concentration with economic mobility, which the EDI data contradict; the classic ethnic enclave model’s emphasis on self-employment and ethnic entrepreneurship is not addressed by this study’s commute-mode and cost-burden measures, though the declining transit-commute pattern is at least consistent with growing enclave-bounded employment more broadly. VEM-D bridges the gap by explaining persistent concentration without ethnic entrepreneurship and rising economic strain without treating it as failed assimilation; through the mutually reinforcing mechanisms of tenure entrenchment, cost-burden absorption, linguistic enclavement, and reduced labor market integration. The Torres-Saillant (2010) racialized-exclusion dimension, supported by the DSI archival record, supplements this econometric account: the enclave functioned as an identity refuge as much as a housing-market outcome, in ways IPUMS data alone cannot demonstrate.
The renter-anchored spatial hardening mechanism should appear wherever three structural conditions coincide simultaneously: a working-class founding cohort whose income level precludes homeownership as a realistic tenure strategy; a receiving-city housing market with sufficient rent-regulated or cost-stabilized stock to permit tenure entrenchment below market rates; and a linguistic-enclavement dynamic that reduces the pressure to achieve English proficiency as a labor-market prerequisite, deepening enclave-bounded employment across successive arrival cohorts. Washington Heights is consistent with all three in the 1980s: pre-war tenement and elevator-building stock provided the rent-regulated housing base; the Settler wave’s proficiency and commuting patterns are consistent with linguistic and labor-market enclavement; and the working-class profile of both cohorts ruled out homeownership as a viable anchor strategy. These conditions are not unique to the Dominican case; other Caribbean and Latin American diaspora communities in dense northeastern cities (Haitian communities in Flatbush, Puerto Rican communities in the South Bronx, Salvadoran communities in the Washington D.C. corridor) may exhibit the same configuration of renter-majority tenure, linguistic enclavement, and working-class labor-market insertion. The framework offers a testable set of predictions for those cases: Pioneer-to-Settler EDI patterns of expansion rather than dispersal, cohort-differentiated cost-burden gaps that persist even after controlling for multivariate factors, and declining metropolitan transit commute rates as enclave-bounded employment deepens. The same IPUMS pipeline used here, birthplace-filtered, boundary-harmonized, could be applied directly to test these predictions, producing comparable EDI and cost-burden estimates across cases. More broadly, the key theoretical insight is not about any one community but about how housing-market structure shapes spatial hardening: neither suburban homeownership (the ethnoburb) nor multi-family homeownership (the original VEM) is essential to the outcome, since tenant tenure security and cost-burden absorption in a renter-majority market may achieve a similar spatial result through an institutionally distinct mechanism.
Three gaps remain that this project’s data cannot answer directly. First, the VEM-D’s central claim, that tenure entrenchment and informal subletting networks reduce effective housing costs for enclave residents below the levels observed in reported gross rent, is theorized rather than directly measured; IPUMS microdata cannot observe rent-stabilization status, informal subletting arrangements, or doubling-up configurations, so the cost-burden findings are consistent with this mechanism but do not confirm it. DSI archival and oral-history evidence, first-person testimony on how families found apartments, negotiated arrangements, and entered the core zone, is the most direct route to substantiating this mechanism at the level of lived experience and remains the most important gap in the framework’s empirical foundation. Second, this study’s 1990 endpoint marks the start, not the resolution, of the post-2000 “revolving door” displacement Hernandez, Marrara, and Sezgin (2018) document; the critical transition decade is likely the 1990s and early 2000s, when this paper’s structural preconditions, high rent burden, low homeownership, and wage stagnation relative to housing costs began interacting with accelerating gentrification pressure. Extending the analysis through the 2000 Census and early American Community Survey waves would allow direct measurement of when and how the mechanism began to fail. Third, the CONSPUMA boundary constraint means the analysis cannot isolate Washington Heights from Inwood as a standalone unit, nor can it bridge Manhattan and the Bronx despite the known geographic continuity of Dominican settlement across the Harlem River into West Bronx neighborhoods such as Highbridge, Morris Heights, and University Heights, which served as a natural extension of the enclave during this period. More consequentially, CONSPUMA 328 and 329 are not neighborhood-scale units: their population totals (1.43-1.49 million and 1.17-1.20 million across the two census years) match the full populations of Manhattan and the Bronx, respectively. The Enclave Density Index therefore measures Dominican concentration against the entire borough population rather than against Washington Heights specifically, a boundary this broad likely dilutes rather than inflates the true neighborhood-level concentration, meaning the enclave’s actual density is probably understated here, not overstated. Future tract-level NHGIS work, accepting the loss of household-level microdata and the cohort and regression analyses it enables, could achieve the spatial resolution needed to document block-level concentration patterns, a trade-off worth making, since tract-level mapping and CONSPUMA microdata together would constitute a more complete methodological treatment than either alone. The community of Washington Heights built something durable across the 1980s. A 34.9 percent severe burden rate means more than one in three Settler households spent at least half their monthly income on housing, a material toll the VEM-D framework acknowledges rather than obscures. The analysis cannot determine why individual households accepted this burden; historical and archival accounts (Ricourt, 2002; Torres-Saillant, 2010) suggest that co-ethnic social infrastructure, cultural recognition, and spatial identity may have been important considerations, though this remains a theoretical interpretation rather than a finding this data can directly confirm.
Alba, R. D., & Logan, J. R. (1992). Assimilation and stratification in the homeownership patterns of racial and ethnic groups. International Migration Review, 26(4), 1314-1341. https://doi.org/10.2307/2546887
Alba, R., & Nee, V. (1997). Rethinking assimilation theory for a new era of immigration. International Migration Review, 31(4), 826-874. https://doi.org/10.2307/2547416
Bergad, L. W. (2021). The Dominican population of the New York metropolitan region, 1970-2019. CUNY Center for Latin American, Caribbean and Latino Studies. https://academicworks.cuny.edu/clacls_pubs/103/
Burgess, E. W. (1925). The growth of the city: An introduction to a research project. In R. E. Park, E. W. Burgess, & R. D. McKenzie (Eds.), The city (pp. 47-61). University of Chicago Press.
Duany, J. (2008). Quisqueya on the Hudson: The transnational identity of Dominicans in Washington Heights (3rd ed.). CUNY Dominican Studies Institute. https://academicworks.cuny.edu/dsi_pubs/45/
Georges, E. (1990). The making of a transnational community: Migration of a Dominican village to New York City. Columbia University Press.
Grasmuck, S., & Pessar, P. R. (1991). Between two islands: Dominican international migration. University of California Press.
Hernandez, R. (2002). The mobility of workers under advanced capitalism: Dominican migration to the United States. Columbia University Press.
Hernandez, R., Marrara, S., & Sezgin, U. (2018). When a neighborhood becomes a revolving door for Dominicans: Rising housing costs in Washington Heights/Inwood and the declining presence of Dominicans. CUNY Dominican Studies Institute. https://academicworks.cuny.edu/dsi_pubs/22/
Hernandez, R., & Rivera-Batiz, F. L. (1997). Dominican New Yorkers: A socioeconomic profile, 1997 (CUNY DSI Research Monograph No. 3). CUNY Dominican Studies Institute. https://academicworks.cuny.edu/dsi_pubs/19/
Hernandez, R., Rivera-Batiz, F. L., & Agodini, R. (1995). Dominican New Yorkers: A socioeconomic profile, 1990 (CUNY DSI Research Monograph No. 2). CUNY Dominican Studies Institute. https://academicworks.cuny.edu/dsi_pubs/8/
Historias / Nueva York Chronicles. (n.d.). Digital archive collections. The Clemente Soto Velez Cultural Center & LxNY.
Li, W. (2009). Ethnoburb: The new ethnic community in urban America. University of Hawai’i Press.
Logan, J. R., Alba, R. D., & Zhang, W. (2002). Immigrant enclaves and ethnic communities in New York and Los Angeles. American Sociological Review, 67(2), 299-322. https://doi.org/10.2307/3088897
Marcuse, P. (1997). The enclave, the citadel, and the ghetto: What is new in the post-Fordist city. Urban Affairs Review, 33(2), 228-264. https://doi.org/10.1177/107808749703300202
Massey, D. S. (1990). Social structure, household strategies, and the cumulative causation of migration. Population Index, 56(1), 3-26. https://doi.org/10.2307/3644570
Massey, D. S., Arango, J., Hugo, G., Kouaouci, A., Pellegrino, A., & Taylor, J. E. (1993). Theories of international migration: A review and appraisal. Population and Development Review, 19(3), 431-466. https://doi.org/10.2307/2938462
Massey, D. S., & Denton, N. A. (1993). American apartheid: Segregation and the making of the underclass. Harvard University Press.
Moya Pons, F. (1998). The Dominican Republic: A national history. Markus Wiener Publishers.
Park, R. E., & Burgess, E. W. (1921). Introduction to the science of sociology. University of Chicago Press.
Persaud, L. (2026). From Guyana to Queens: The formation of the Indo-Guyanese ethnoburb [Master’s thesis, Hunter College]. CUNY Academic Works.
Portes, A., & Jensen, L. (1989). The enclave and the entrants: Patterns of ethnic enterprise in Miami before and after Mariel. American Sociological Review, 54(6), 929-949. https://doi.org/10.2307/2095714
Portes, A., & Zhou, M. (1993). The new second generation: Segmented assimilation and its variants. The Annals of the American Academy of Political and Social Science, 530(1), 74-96. https://doi.org/10.1177/0002716293530001006
Prener, C., Grossenbacher, T., & Zeppenfeld, A. (2022). biscale: Tools and palettes for bivariate thematic mapping. R package version 1.0.0. https://CRAN.R-project.org/package=biscale
R Core Team. (2023). R: A language and environment for statistical computing. R Foundation for Statistical Computing. https://www.R-project.org/
Regalado, P. A. (2019). The Washington Heights uprising of 1992: Dominican belonging and urban policing in New York City. Journal of Urban History, 45(5), 961-986. https://doi.org/10.1177/0096144218788308
Ricourt, M. (2002). Dominicans in New York City: Power from the margins. Routledge.
Ruggles, S., Flood, S., Sobek, M., Backman, D., Cooper, G., Rivera Drew, J. A., Richards, S., Rogers, R., Schroeder, J., & Williams, K. C. W. (2025). IPUMS USA: Version 16.0 [Data set]. IPUMS. https://doi.org/10.18128/D010.V16.0
Sassen, S. (1988). The mobility of labor and capital: A study in international investment and labor flow. Cambridge University Press.
Sassen, S. (1991). The global city: New York, London, Tokyo. Princeton University Press.
Schroeder, J., Van Riper, D., Manson, S., Knowles, K., Kugler, T., Roberts, F., & Ruggles, S. (2025). IPUMS National Historical Geographic Information System: Version 20.0 [Data set]. IPUMS. http://doi.org/10.18128/D050.V20.0
Torres-Saillant, S. (2010). Introduction to Dominican blackness. CUNY Dominican Studies Institute. https://academicworks.cuny.edu/cc_dsi_pubs/23/
Torres-Saillant, S., & Hernandez, R. (1998). The Dominican Americans. Greenwood Press.
U.S. Bureau of Labor Statistics. (2024). Consumer Price Index for All Urban Consumers (CPI-U): U.S. city average, all items, historical data. U.S. Department of Labor. https://www.bls.gov/cpi/tables/supplemental-files/historical-cpi-u-202402.pdf
Waldinger, R. (1996). Still the promised city? New immigrants and African-Americans in post-industrial New York. Harvard University Press.
Wickham, H. (2016). ggplot2: Elegant graphics for data analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org
Wilson, K. L., & Portes, A. (1980). Immigrant enclaves: An analysis of the labor market experiences of Cubans in Miami. American Journal of Sociology, 86(2), 295-319. https://doi.org/10.1086/227240